You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

VBA循环中cn.execute(Sql)二次报错求助:跳过错误继续循环

搞定VBA循环错误跳过的问题

我来帮你分析下这个问题哈,你的代码第一次出错能跳过,但第二次执行cn.Execute(Sql)就抛错,核心问题出在错误处理的逻辑和位置不对,加了Resume Next没效果是因为没用到正确的流程上。咱们一步步来修正:

先说说问题出在哪

  1. 你的errHandler:标签直接放在Next m前面,第一次出错后直接跳到Next m,但错误状态没清除,下一次循环时错误标记还在,导致第二次执行到数据库操作时直接触发未处理的错误
  2. 没有给错误处理设置正确的“继续点”,Resume Next的位置不对,没法让代码跳过出错语句后继续走流程
  3. 循环里的资源(比如Rec_set)没在出错时清理,可能导致后续循环的对象状态异常

修正后的完整代码

'EXECUTION OF SQL QUERY
Application.EnableEvents = False
Application.ScreenUpdating = False
'Application.ErrorCheckingOptions.BackgroundChecking = False

' 记得补充你的循环范围,比如For m = 2 To 100(假设从第2行开始)
For m = [你的起始行号] To [你的终止行号]
    On Error GoTo errHandler ' 每次循环重新开启错误捕获,别加冒号
    Set Sql = ws.Range("D" & m)
    
    ' 执行SQL语句,出错就跳去错误处理
    Set Rec_set = cn.Execute(Sql)
    Status = Worksheets("Count").Range("B" & m).Value
    Application.StatusBar = "Table Executing :" & Status
    
    While Not Rec_set.EOF
        ws.Range("E" & m).CopyFromRecordset Rec_set
    Wend
    Rec_set.Close 'Close the recordset
    
    'FILE UPLOAD - 上传到SharePoint
    ws.Range("D" & m & ":" & "E" & m).ExportAsFixedFormat Type:=xlTypePDF, Filename:= _
        sFolder & "/_Count_Row" & m & ".pdf", Quality:= _
        xlQualityStandard, IncludeDocProperties:=True, IgnorePrintAreas:=False, _
        OpenAfterPublish:=False
    
    With ws
        ' 修正锚点:原代码的End(xlUp).Offset(1,0)可能会跳错行,直接用F列对应行更准确
        .Hyperlinks.Add Anchor:=.Range("F" & m), _
        Address:=sFolder & "/Count_Row" & m & ".pdf", _
        ScreenTip:="查看PDF", _
        TextToDisplay:="Count_Row" & m
    End With
    Application.StatusBar = "文件正在上传到SharePoint:" & Status

' 正常退出当前循环的标签,不管对错都走这里清理资源
exitCurrentLoop:
    ' 清理Recordset对象,防止内存泄漏
    On Error Resume Next ' 防止清理时出错
    If Not Rec_set Is Nothing Then
        Rec_set.Close
        Set Rec_set = Nothing
    End If
    On Error GoTo 0 ' 恢复默认错误处理
    Next m

' 错误处理块
errHandler:
    ' 可选:打印错误信息到立即窗口,方便调试
    Debug.Print "循环m=" & m & "出错:错误码" & Err.Number & " - " & Err.Description
    ' 清除错误状态,不然下一次循环会带着错误标记
    Err.Clear
    ' 跳转到循环退出点,继续下一次循环
    Resume exitCurrentLoop

关键修改点说明

  • 把错误捕获放在循环内:每次循环都重新设置On Error GoTo errHandler,确保每一轮都能独立捕获错误
  • 新增exitCurrentLoop标签:让错误处理后能跳到这里,完成资源清理再进入下一次循环,而不是直接跳Next m
  • 清除错误状态:Err.Clear必须加,不然错误会残留到下一次循环,导致后续操作直接报错
  • 资源清理:不管循环正常结束还是出错,都清理Rec_set对象,避免对象状态异常影响下一次循环
  • 修正超链接锚点:原代码的.Range("F" & m).End(xlUp).Offset(1, 0)可能会定位到错误的行,直接用.Range("F" & m)更符合你的需求

这样改完之后,不管哪一次循环出错,都会跳过当前步骤,清理资源后继续下一轮循环,再也不会出现第二次执行就抛错的问题啦~

内容的提问来源于stack exchange,提问作者abinaya

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 09:25:36