如何使用 On Error 打破 VBA 中的循环?

How to use On Error to break a loop in VBA?

我目前正在制作一个表单,其中包含一个包含 11 页的多页。每个页面都有多个复选框,范围从 3 到 12 个复选框。复选框代表如下所示的列表项:

我计划使用二维 for 循环(for 循环内的 for 循环)使用以下语法检查每个框。

我习惯了Python,所以我的想法是循环直到出现错误(表示不再有复选框)然后打破当前循环并继续。


For Each pg In Me.MultiPage1.Pages
    x = 1
    For i = 0 To 12 
        If ActiveSheet.Shapes("CheckBox" & x & i).Value = xlOn Then
            'Code to be executed
             x = x = 1
    On Error ExitHandler

ExitHandler:
    Exit

所以我正在尝试做一些类似于 continue 在 Python 中的功能。或许我正在以完全不正确的方式解决这个问题。

此外,我也不确定我命名复选框的方法是否正确,因为它们与如下所示的列表项相关:

1.1
1.2
1.3
...

11.1
11.2
11.3

我也刚刚意识到复选框的命名可能有点混乱。我使用了以下方法。它是:

Page 1
CheckBox11
CheckBox12
CheckBox13 
CheckBox14

Page 2
CheckBox21,
CheckBox22, 
CheckBox23, 
CheckBox24,

...
Page 11
CheckBoxEleven1,
CheckBoxEleven2, 
CheckBoxEleven3, 
CheckBoxEleven4, 
CheckBoxEleven5, 

我使用“11”是因为 1.11 和 1.12 的复选框名称冲突并导致名称不明确错误。

对于您的第一个问题:将 'On Error GoTo ExitHandler' 移到可能导致错误的行上方。 Excel 需要知道在错误发生之前该怎么做。

VBA 中 Errorhandler 的基本逻辑是这样的:

Sub Something()

On Error GoTo ErrorHandler

    'Your loop here

    Exit Sub 'Exit sub if no error appears
    
ErrorHandler:
        ' If error do something else
End Sub

如果你想在发生错误时退出循环,可以使用On Error GoTo ExitHandler来完成。正如上面 stephie 所说,处理程序需要放在循环之前。您还缺少 GoTo 语句。您还需要在 ExitHandler 之前添加一个 Exit Sub 语句(除非您想要 运行 ExitHandler 即使没有发生错误 - 然后您将其保留)。

我设置了一个简化的结构:

Sub Test()
    Dim i As Long
    
    'Error handler before the loop!
    On Error GoTo ExitHandler
    
    For i = 0 To 12
        'Code to be executed
         Debug.Print 1 / 0

    Next i
    
    MsgBox "No error"
    'Exit sub to avoid that the ExitHandler runs if no error occurs
    'Leve the Exit sub if you want to run the EXitHandler even if no error occurs
    Exit Sub
ExitHandler:
    'Code to perform when an error occurs
    MsgBox "Error occured"
End Sub

请注意,您还可以使用 Exit for.

以受控方式离开循环

请尝试下一种方法:

Sub testSelectSheet()
   Sheets("Operational").Activate
    For Each pg In Me.MultiPage1.Pages
        x = 1
        For i = 0 To 12
            On Error Resume Next
            'Use True here, to return the check box value:
            If ActiveSheet.Shapes("CheckBox" & x & i).Value = True Then
                'Code to be executed
                 x = x = 1
                 If Err.Number <> 0 Then
                    Err.Clear: On Error GoTo 0 'clear the error and stopping On Error Resume next effect.
                    'record the error:
                    Debug.Print "Error: " & Err.Number & ", Error description: " & Err.Description & " on CheckBox" & x & i
                    'if you want exiting throudh error handler you can use:
                    GoTo ExitHandler
                    ' or if you want exiting, exit directly"
                    Exit Sub
                    'not using any of the above ways to exit, the code will only skip this control and jump to the next one. Only a record in Immediate Window will be made...
                 End If
                 On Error GoTo 0 'make the code stop on error for the next lines
            End If
        Next i
    Next
ExitHandler:
   'no need for Exit Sub, because this is the last procedure row and code exits anyhow...
End Sub

感谢大家的回复,他们让我对VBA的错误处理系统有了更深入的了解。

我使用与@Damian 在 post.

中指出的方法类似的方法创建了我的问题的解决方案
Dim cont As Control

For Each pg In Me.MultiPage1.Pages
        
    For Each cont In pg.Controls
            
        If cont.Value = True Then
            checkBoxes.Add cont.Caption
        End If

            
    Next cont

Next pg

只需要将页面的控件放入一个变量 Control 变量中,我可以将其与 For Each 一起使用,以循环我需要能够选中复选框的确切次数。这个解决方案对我有用,因为我在页面上只有复选框控件。因此,我需要做的就是检查控件的值,而不是检查控件的类型。

如果我有其他控件,那么我需要先检查控件的类型。这也意味着我不必像以前那样制定复选框的名称。