所以我已经解决了这个问题,但我不明白为什么我的解决方案是必需的。我想找到一种方法来检查我的数据库中所有表单和所有控件的属性,所以我想出了以下代码:
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
这正是我想要的方式,但是我无法在网上找到答案,为什么我的第一组代码发生了这种情况。有人能让我知道我的第一个版本的函数发生了什么导致错误处理退出?
编辑:我还应该指出,显然需要进行错误处理,因为并非所有控件都有控制源。另外,我没有控件类型检查,因为当要检查不同的属性时,此函数会更新。
答案 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
原因是在第一种情况下,错误处理程序永远不会清除错误对象,并且一次只能激活一个错误。当错误处于活动状态并且另一个错误引发时,处理程序将失败。