我有一个庞大的Access窗体,有数百个控件,都有一些事件。 其中一个是关于"验证或更新后事件"的错误。没有控制名称,仅此而已。
所以我想我列出所有表格及其所有验证规则和所有事件(并非所有表格都是" [事件程序]"有些是自定义函数调用)。
有没有办法获取控件的事件列表?
到目前为止我的代码:
Sub ListAllControlsAndTheirEvents(FormToCheck As Form)
Dim ctrlCurrent As Control
For Each ctrlCurrent In FormToCheck.Controls
Debug.Print "Name: " & ctrlCurrent.Name
On Error Resume Next
Debug.Print "Validation: " & ctrlCurrent.ValidationRule 'Not all controls have a ValidationRule property.
On Error GoTo 0
For Each eventCurrent In ctrlCurrent.events 'this thing doesn't exist :(
Debug.Print "Event: " & eventCurrent.Name & "; value: " & eventCurrent.whatever
Next
Next
End Sub
那么,有没有办法实现这个部分?
For Each eventCurrent In ctrlCurrent.events 'this thing doesn't exist :(
Debug.Print "Event: " & eventCurrent.Name & "; value: " & eventCurrent.whatever
Next
挖掘代码模块不会给我自定义函数事件调用,只是[事件过程]代码。
答案 0 :(得分:2)
您可以使用typename来确定控件的类型,然后像if typename(x) ="CommanButton" then set cb=x
那样设置,然后循环属性,对于以On开头的属性名称,然后如果有[事件过程]你就知道&# 39; s是一个事件,您也可以将搜索范围缩小到x_Click
答案 1 :(得分:2)
下面的代码应该识别并列出表单上每个控件的所有事件(无论是空白,[事件过程]还是自定义函数)。我在Access 2010上通过创建一个空白表单并添加了几个控件来测试它。我确保为一些控件分配一些标准事件和自定义函数以进行验证。
Public Sub ListAllControlsAndTheirEvents(FormToCheck As Access.Form)
Dim ctrlProp As Object
Dim ctrlCurrent As Access.Control
For Each ctrlCurrent In FormToCheck.Controls
Debug.Print "Name: " & ctrlCurrent.Name
If PropertyExists(ctrlCurrent, ctrlProp, "ValidationRule") Then
Debug.Print "Validation: " & ctrlProp.Value
End If
For Each ctrlProp In ctrlCurrent.Properties
' Category 4 type 8 identifies an event property
If ctrlProp.Category = 4 And ctrlProp.Type = 8 Then
Debug.Print _
"Event: " & ctrlProp.Name & "; " & _
"Value: " & ctrlProp.Value
End If
Next
Next
End Sub
Private Function PropertyExists( _
ByRef ctrlCurrent As Access.Control, _
ByRef ctrlProp As Object, _
ByRef PropName As String _
) As Boolean
On Error Resume Next
Set ctrlProp = ctrlCurrent.Properties(PropName)
PropertyExists = Err.Number = 0
End Function
答案 2 :(得分:0)
我知道这个问题在 4 年前就被标记为已回答。
我在 Excel 中搜索同样的东西时一直在回答这个问题。
这个问题是我寻找类似问题答案的来源。
我已经使用 TLI 找到了这个问题的答案。
我在这里提供的答案旨在帮助其他人快速轻松地找到解决方案。
无意获得功绩/积分/声望,只是为了帮助别人得到我花了这么多时间和精力才得到的答案。
我不是 Access VBA 专家,也不是 Excel VBA 专家,但我认为 TypeLib Info 也可以在 Access 中使用。
要求:引用位于 C:\Windows\SysWow64\TLBINF32.DLL 的 TypeLib 信息库
Sub printControlEventNames(ByVal o As Object)
Dim t As TLI.TLIApplication
Set t = New TLI.TLIApplication
Dim ti As TLI.TypeInfo
Set ti = t.ClassInfoFromObject(o)
Dim mi As TLI.MemberInfo
For Each mi In ti.DefaultEventInterface.Members
Debug.Print mi.Name
Next
End Sub
我的问题和我自己的解决方案可以在 here 中找到。