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
相关产品推荐
相关产品推荐

