列出MS Access表单的控件及其事件

时间:2016-05-13 07:50:02

标签: forms vba ms-access events controls

我有一个庞大的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

挖掘代码模块不会给我自定义函数事件调用,只是[事件过程]代码。

3 个答案:

答案 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

enter image description here

我的问题和我自己的解决方案可以在 here 中找到。