在第一次循环到For Each循环后停止错误处理

时间:2015-02-02 17:22:52

标签: vba ms-access access-vba ms-access-2010

所以我已经解决了这个问题,但我不明白为什么我的解决方案是必需的。我想找到一种方法来检查我的数据库中所有表单和所有控件的属性,所以我想出了以下代码:

Public Function CheckPropertyAllForms()

    Dim obj As Object
    Dim ctl As Control

    Dim blnFound As Boolean

    For Each obj In CurrentProject.AllForms

        DoCmd.OpenForm obj.Name, acDesign, , , , acHidden
        blnFound = False

        For Each ctl In Forms(obj.Name).Controls
        On Error GoTo Next_Control

            If Nz(ctl.ControlSource, "") <> "" Then
                If ctl.ControlSource = "Certain_Field" Then
                    blnFound = True
                End If
            End If

Next_Control:
        Next ctl

        If blnFound = True Then
            Debug.Print obj.Name
        End If

        DoCmd.Close acForm, obj.Name

    Next obj
End Function

但是这段代码只能工作一次,第二次它会显示错误,好像关闭了错误处理一样。所以我将其更新为:

Public Function CheckPropertyAllForms()

    Dim obj As Object
    Dim ctl As Control

    Dim blnFound As Boolean

    For Each obj In CurrentProject.AllForms

        DoCmd.OpenForm obj.Name, acDesign, , , , acHidden
        blnFound = False

        For Each ctl In Forms(obj.Name).Controls
        On Error GoTo Err_Handler

            If Nz(ctl.ControlSource, "") <> "" Then
                If ctl.ControlSource = "Certain_Field" Then
                    blnFound = True
                End If
            End If

Next_Control:
        Next ctl

        If blnFound = True Then
            Debug.Print obj.Name
        End If

        DoCmd.Close acForm, obj.Name

    Next obj

Exit_Handler:
    Exit Function

Err_Handler:
    Resume Next_Control
End Function

这正是我想要的方式,但是我无法在网上找到答案,为什么我的第一组代码发生了这种情况。有人能让我知道我的第一个版本的函数发生了什么导致错误处理退出?

编辑:我还应该指出,显然需要进行错误处理,因为并非所有控件都有控制源。另外,我没有控件类型检查,因为当要检查不同的属性时,此函数会更新。

1 个答案:

答案 0 :(得分:1)

除了On Error语句外,您还需要有On Error GoTo 0语句。在你的情况下,它可能会在你的Next_Control之前发生,你实际上可以摆脱它,所以你的循环看起来像这样:

    For Each ctl In Forms(obj.Name).Controls
    On Error Resume Next

        If Nz(ctl.ControlSource, "") <> "" Then
            If ctl.ControlSource = "Certain_Field" Then
                blnFound = True
            End If
        End If
    On Error GoTo 0
    Next ctl

原因是在第一种情况下,错误处理程序永远不会清除错误对象,并且一次只能激活一个错误。当错误处于活动状态并且另一个错误引发时,处理程序将失败。