VBA循环中cn.execute(Sql)二次报错求助:跳过错误继续循环
搞定VBA循环错误跳过的问题
我来帮你分析下这个问题哈,你的代码第一次出错能跳过,但第二次执行cn.Execute(Sql)就抛错,核心问题出在错误处理的逻辑和位置不对,加了Resume Next没效果是因为没用到正确的流程上。咱们一步步来修正:
先说说问题出在哪
- 你的
errHandler:标签直接放在Next m前面,第一次出错后直接跳到Next m,但错误状态没清除,下一次循环时错误标记还在,导致第二次执行到数据库操作时直接触发未处理的错误 - 没有给错误处理设置正确的“继续点”,
Resume Next的位置不对,没法让代码跳过出错语句后继续走流程 - 循环里的资源(比如
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
相关产品推荐
相关产品推荐

