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

二次错误时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

关键修改点说明

  1. 错误处理全局化:把On Error GoTo ErrorHandler移到循环外部,确保整个循环过程中错误处理逻辑持续生效
  2. 用Resume重置错误状态:替换原来的GoTo 25和手动递增i的操作,Resume NextRow会自动重置错误处理状态,同时让循环变量i通过Next i正常递增,避免逻辑混乱
  3. 新增NextRow标签:给Next i前加标记,让Resume明确知道错误处理完成后回到哪里继续执行

这样修改后,无论遇到多少次UniqueID不匹配的错误,程序都会正确记录到ListBox,不会再抛出未处理的错误,同时循环逻辑也保持正常。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 18:05:19