二次错误时VBA错误处理程序无法跳转至指定行的问题
我来帮你分析下这个问题的根源,以及对应的修复方案:
问题核心原因
你遇到的"Argument value not valid"报错,本质是错误处理状态没有重置导致的:
- 第一次触发错误时,程序进入
100标签的处理块,但此时VB的错误处理机制处于「错误处理中」的激活状态 - 当你用
GoTo 25回到循环后,错误处理状态没有被重置,第二次遇到错误时,程序不会再触发On Error GoTo 100,而是直接抛出未处理的错误 - 另外你手动修改循环变量
i = i + 1,再加上循环本身的Next i,会导致i被重复递增,逻辑混乱,进一步加剧问题
修复后的代码
Private Sub CommandButton91_Click() 'open progress data file Dim i As Integer, wb As Workbook, ws As Worksheet myxl.Workbooks.Open TextBox110.Value Set wb = ActiveWorkbook Set ws = wb.Sheets(1) ' 将错误处理放在循环外部,确保全程生效 On Error GoTo ErrorHandler For i = 2 To ws.UsedRange.Rows.Count If ws.Cells(i, 2).Value = "False" Then If ws.Cells(i, 4).Value = "False" Then ActiveProject.Tasks.UniqueID(ws.Cells(i, 1).Value).Number7 = ws.Cells(i, 15).Value ActiveProject.Tasks.UniqueID(ws.Cells(i, 1).Value).Number6 = ws.Cells(i, 17).Value If CheckBox34.Value = True Then ActiveProject.Tasks.UniqueID(ws.Cells(i, 1).Value).Duration = ws.Cells(i, 11).Value * 480 End If End If End If NextRow: ' 标记循环继续的位置 Next i Unload Me Exit Sub ErrorHandler: ' 记录错误的UniqueID到ListBox ListBox20.AddItem ws.Cells(i, 1).Value ' 重置错误处理状态,回到循环的下一行继续执行 Resume NextRow End Sub
关键修改点说明
- 错误处理全局化:把
On Error GoTo ErrorHandler移到循环外部,确保整个循环过程中错误处理逻辑持续生效 - 用Resume重置错误状态:替换原来的
GoTo 25和手动递增i的操作,Resume NextRow会自动重置错误处理状态,同时让循环变量i通过Next i正常递增,避免逻辑混乱 - 新增NextRow标签:给
Next i前加标记,让Resume明确知道错误处理完成后回到哪里继续执行
这样修改后,无论遇到多少次UniqueID不匹配的错误,程序都会正确记录到ListBox,不会再抛出未处理的错误,同时循环逻辑也保持正常。
内容的提问来源于stack exchange,提问作者Ken
相关产品推荐
相关产品推荐

