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

VBA For循环第二次迭代时错误处理失效问题排查

问题根因

你遇到的第二次循环直接抛错的问题,核心是两个点:

  • VBA错误处理机制要求:触发On Error GoTo跳转到错误处理段后,必须通过Resume类语句退出错误处理段,才能重置错误捕获状态。仅调用Err.Clear不会重置错误处理模式,下一次循环再触发错误时,系统不会再跳转到你写的Handler标签,直接抛出原生运行时错误。
  • 你用错误处理承接Find方法无匹配结果的场景本身就不合理。Range.Find找不到目标时会返回Nothing,直接判断返回值是否为空,比依赖错误跳转稳定得多,也不会误吞其他非预期错误。

你看到的错误本质是Find没找到目标队伍返回了空对象,你后续直接访问空对象的Row/Column属性触发的91号错误(对象变量或With块变量未设置)。

修复方法

推荐写法:直接判断Find返回值

完全移除冗余的错误跳转逻辑,这也是VBA中使用Find方法的标准写法,执行查找后先判断是否找到匹配项,没找到就直接跳过当前轮次的后续计算,不会出现错误状态异常的问题。
修正后的循环段代码:

points = 0
For ct = 0 To 3
    ' 查找Results表A列的对应队伍
    Set gw1 = CorrectResults.Worksheets(crws).Columns(1).Find(countries(ct), LookIn:=xlValues)
    If gw1 Is Nothing Then GoTo NextLoop ' 没找到直接进入下一轮
    CorrectCountryColumn = gw1.Column + 1
    CorrectCountryRow = gw1.Row

    ' 查找MD1表当前行的对应队伍
    Set gw2 = CorrectResults.Worksheets(md1).Rows(lastrowMD1).Find(countries(ct), LookIn:=xlValues)
    If gw2 Is Nothing Then GoTo NextLoop ' 没找到直接进入下一轮
    PredictedCountryColumn = gw2.Column

    ' 原有积分计算逻辑无需改动
    If CorrectResults.Worksheets(md1).Cells(lastrowMD1, PredictedCountryColumn + 1).Value = _
    CorrectResults.Worksheets(crws).Cells(CorrectCountryRow, CorrectCountryColumn).Value And _
    (PredictedCountryColumn = 2 Or PredictedCountryColumn = 7 _
    Or PredictedCountryColumn = 12 Or PredictedCountryColumn = 17 _
    Or PredictedCountryColumn = 22 Or PredictedCountryColumn = 27 _
    Or PredictedCountryColumn = 32 Or PredictedCountryColumn = 37 _
    Or PredictedCountryColumn = 42 Or PredictedCountryColumn = 47 _
    Or PredictedCountryColumn = 52 Or PredictedCountryColumn = 57 _
    Or PredictedCountryColumn = 62 Or PredictedCountryColumn = 67 _
    Or PredictedCountryColumn = 72 Or PredictedCountryColumn = 77) Then
        points = points + 3
    ElseIf CorrectResults.Worksheets(md1).Cells(lastrowMD1, PredictedCountryColumn - 1).Value = _
    CorrectResults.Worksheets(crws).Cells(CorrectCountryRow, CorrectCountryColumn).Value And _
    (PredictedCountryColumn = 6 Or PredictedCountryColumn = 11 _
    Or PredictedCountryColumn = 16 Or PredictedCountryColumn = 21 _
    Or PredictedCountryColumn = 26 Or PredictedCountryColumn = 31 _
    Or PredictedCountryColumn = 36 Or PredictedCountryColumn = 41 _
    Or PredictedCountryColumn = 46 Or PredictedCountryColumn = 51 _
    Or PredictedCountryColumn = 56 Or PredictedCountryColumn = 61 _
    Or PredictedCountryColumn = 66 Or PredictedCountryColumn = 71 _
    Or PredictedCountryColumn = 76 Or PredictedCountryColumn = 81) Then
        points = points + 3
    End If
    
    CorrectResults.Worksheets(predictions).Cells(lastrowMD1 + 1, 3).Value = points
NextLoop:
Next ct

可选优化

你代码里判断比分列的长串Or逻辑可以简化,观察列号规律:

  • 要取右侧单元格为比分的队伍列,列号间隔为5(2、7、12...),用(PredictedCountryColumn - 2) Mod 5 = 0即可覆盖所有符合条件的列
  • 要取左侧单元格为比分的队伍列,列号间隔也为5(6、11、16...),用(PredictedCountryColumn - 6) Mod 5 = 0即可覆盖所有符合条件的列
    后续新增比赛场次不需要手动补充判断条件。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.30 08:31:06