Exit Sub在GoSub与Select Case中的放置位置及代码执行异常问题
问题分析与解决
你的代码问题出在GoSub/Return的错误使用,以及标签位置逻辑混乱:
LowHours:标签放在Do Loop循环内部,每次循环执行完A = A + 1后,会自动往下走到这个标签代码块,哪怕没触发GoSub调用,这时执行Return就会报“Return without GoSub”错误。- 当触发GoSub后,执行完Return会回到
GoSub LowHours的下一行(也就是A = A + 1),循环继续后又会走到标签代码块,导致逻辑混乱、代码重复运行。
修复方案1:直接把逻辑写在Case分支(最简洁)
摒弃容易出错的GoSub,把LowHours的逻辑直接放到Case分支里,同时去掉不必要的Select操作,直接操作单元格对象:
Do While Cells(A, 1) > 0 HoursWorked = Cells(A, 9) Select Case HoursWorked Case Is < 120 With Cells(A, 11).Interior .Pattern = xlSolid .PatternColorIndex = xlAutomatic .ThemeColor = xlThemeColorAccent6 .TintAndShade = 0.799981688894314 .PatternTintAndShade = 0 End With Cells(A, 11).Value = "Low Risk" End Select A = A + 1 Loop End Sub
修复方案2:封装成独立子过程(适合复用)
如果这段标记逻辑需要多次使用,可以单独写成子过程,再在Case里调用:
Sub YourMainSub() Dim A As Long, HoursWorked As Double ' 记得给A赋初始值,比如A = 2(假设数据从第二行开始) Do While Cells(A, 1) > 0 HoursWorked = Cells(A, 9) Select Case HoursWorked Case Is < 120 MarkLowRisk A ' 调用独立子过程 End Select A = A + 1 Loop End Sub ' 独立子过程:处理低工时标记 Sub MarkLowRisk(rowNum As Long) With Cells(rowNum, 11).Interior .Pattern = xlSolid .PatternColorIndex = xlAutomatic .ThemeColor = xlThemeColorAccent6 .TintAndShade = 0.799981688894314 .PatternTintAndShade = 0 End With Cells(rowNum, 11).Value = "Low Risk" End Sub
注意:原代码未给变量A设置初始值,运行时会出错,记得在循环前给A指定起始行号(比如A = 2)。
内容的提问来源于stack exchange,提问作者Robert Kendall
相关产品推荐
相关产品推荐

