Ms access MS访问更改';OnChange';VBA中的事件编程

Ms access MS访问更改';OnChange';VBA中的事件编程,ms-access,vba,Ms Access,Vba,我正在从事一个项目,在这个项目中,我必须使用MS Access,并且我必须使数据库尽可能松散(这很奇怪,我不认为是最佳做法,但就目前我的资源而言,这就是我所拥有的) 无论如何,我有50个组合框,但经常不得不对其中一个进行更改,这意味着我必须手动更改所有组合框。我宁愿花一个小时找到一个编程解决方案,然后花5分钟手动完成 我需要使用VBA更改“OnChange”事件,但我的代码产生错误 Private Function RunChangePropagate() Dim combo As Co

我正在从事一个项目,在这个项目中,我必须使用MS Access,并且我必须使数据库尽可能松散(这很奇怪,我不认为是最佳做法,但就目前我的资源而言,这就是我所拥有的)

无论如何,我有50个组合框,但经常不得不对其中一个进行更改,这意味着我必须手动更改所有组合框。我宁愿花一个小时找到一个编程解决方案,然后花5分钟手动完成

我需要使用VBA更改“OnChange”事件,但我的代码产生错误

Private Function RunChangePropagate()
    Dim combo As ComboBox
    RevealGrid
    For Each combo In Me.Controls
        combo.OnChange = "=ComboBox_Change()"
    Next combo
    ClearGrid
End Function
错误:

我还尝试将文本更改为变体,然后将事件分配给所述变体

我该怎么做呢


提前感谢。

这是一个最简单的示例,可以使用:

Public Sub ChangeEvent()

    Dim ctrl As Control
    For Each ctrl In Me.Controls
        If ctrl.Name = "Combo5" Then
            Debug.Print ctrl.OnChange
            ctrl.OnChange = "SomeProcedure"
        End If
    Next ctrl

End Sub
在您的示例中,您应该只删除分配中的
=
。不需要指定子项末尾的括号。

使用WithEvents。通过这种方式,表单与控制表单的类(某些控件)完全“分离”

我发表了一篇文章,其中包含链接和一个供任何人学习的示例:

主代码(代码隐藏模块和类模块)仅为:

以及:


完整代码也在GitHub上:

假设错误出现在
combo.OnChange=“=ComboBox\u Change()”
,尝试将此行编辑到
MsgBox combo.OnChange
以查看分配
\u Change
事件的正确格式。这就是我所需要的!我猜我的版本不喜欢这样,我是专门找组合框的。我几乎只是修改了If语句,说明名称是否包含单词“Combo”,因为我对所有框都有命名约定。
Option Explicit

' Helper class for form Palette for event handling of textboxes.
' 2017-04-19. Gustav Brock, Cactus Data ApS, CPH.
' Version 1.0.0
' License: MIT.

' *

Private Const EventProcedure    As String = "[Event Procedure]"

Private WithEvents ClassTextBox As Access.TextBox


Public Sub Initialize(ByRef TextBox As Access.TextBox)

    Set ClassTextBox = TextBox

    ClassTextBox.OnClick = EventProcedure

End Sub


Public Sub Terminate()

    Set ClassTextBox = Nothing

End Sub


Private Sub ClassTextBox_Click()

    ' Select full content.
    ClassTextBox.SelStart = 0
    ClassTextBox.SelLength = Len(ClassTextBox.Value)
    ' Display the clicked value.
    ClassTextBox.Parent!CopyClicked.Value = ClassTextBox.Value
    ' Copy the clicked value to the clipboard.
    DoCmd.RunCommand acCmdCopy

End Sub
Option Explicit

' Form to display the Windows Phone 7.5/8.0 colour theme.
' Also works as a basic example of implementing WithEvents for a form.
' 2017-04-19. Gustav Brock, Cactus Data ApS, CPH.
' Version 1.0.0
' License: MIT.

' *

Private ControlCollection   As Collection


Private Sub Form_Load()

    ' Load events for all colour value textboxes.

    Dim EventProcedure  As ClassTextboxSelect
    Dim Control         As Access.Control

    Set ControlCollection = New Collection

    For Each Control In Me.Controls
        If Control.ControlType = acTextBox Then
            Set EventProcedure = New ClassTextboxSelect
            EventProcedure.Initialize Control
            ControlCollection.Add EventProcedure, Control.Name
        End If
    Next

    Set EventProcedure = Nothing
    Set Control = Nothing

End Sub


Private Sub Form_Unload(Cancel As Integer)

    ' Unload events for all colour value textboxes.

    Dim EventProcedure  As ClassTextboxSelect

    For Each EventProcedure In ControlCollection
        EventProcedure.Terminate
    Next

    Set EventProcedure = Nothing
    Set ControlCollection = Nothing

End Sub