如何通过MS-Access VBA

时间:2018-04-12 06:39:09

标签: vba ms-access events access-vba parameter-passing

在MS Access中,我使用VBA为多个TextBox设置事件处理函数:

txtMyTextBox.OnKeyUp = "=myEventHandlerFunction()"

到目前为止,这个工作正常。但是,我想传递已按下的键的KeyCode。当我为TextBox手动创建“常用”KeyUp事件时,它会自动提供 KeyCode As Integer Shift As Integer 。我期待这些也可以与OnKeyUp属性一起使用,如下所示:

txtMyTextBox.OnKeyUp = "=myEventHandlerFunction(KeyCode)"

当然我更新了myEventHandlerFunction,以便它需要这个参数。但是,当事件被触发时,Access会给我一个错误,说该表达式导致错误,因为该对象不包含自动化对象 KeyCode

我是否有可能使用OnKeyUp属性为KeyEode提供myEventHandlerFunction?我使用了错误的格式甚至是错误的参数名称(如果重要的话,我使用的是德语版的Access)?

MSDN documentation on the TextBox.OnKeyUp Property (Access)未提供有关此内容的任何信息。

我知道我可以为每个TextBox手动设置KeyUp事件,并使用KeyCode参数从那里调用myEventHandlerFunction。这不是我想要的,因为我想以编程方式设置事件处理,根据我的理解,这需要使用OnKeyUp属性。

1 个答案:

答案 0 :(得分:3)

问题在于你处理事件的方式。您不应将程序处理程序设置为文本表达式,而是使用类和OOP为文本框设置事件处理程序。

示例:

使用以下类:

<强> clsTextboxHandler

Public textboxesHandler As clsTextboxesHandler
Public WithEvents txt As Access.Textbox

Private Sub txt_KeyUp(KeyCode As Integer, Shift As Integer)
    textboxesHandler.HandleKeyUp txt, KeyCode, Shift
End Sub

<强> clsTextboxesHandler

Private TextboxHandlers As Collection

Private Sub Class_Initialize()
    Set TextboxHandlers = New Collection
End Sub

Public Sub LoadAllTextboxes(ByRef TheForm As Access.Form)
    Dim ctl As Control
    For Each ctl In TheForm.Controls
        If ctl.ControlType = acTextbox Then 'Add additional criteria to only handle certain textboxes
            LoadTextbox ctl                
        End If
    Next ctl
End Sub

Public Sub LoadTextbox(txt As Access.Textbox)
    Dim TextboxHandler As New clsTextboxHandler
    Set TextboxHandler.txt= txt
    Set TextboxHandler.textboxesHandler = Me
    txt.OnKeyUp = "[Event Procedure]"
    TextboxHandlers.Add TextboxHandler
End Sub

Public Sub HandleKeyUp(txt As Access.Textbox, KeyCode As Integer, Shift As Integer)
    'Handle your KeyUp for multiple textboxes here. You can use the textbox object, keycode, etc.
End Sub

在表格上:

Private TextboxesHandler As clsTextboxesHandler
Public Sub Form_Load()
    Set TextboxesHandler = New clsTextboxesHandler
    TextboxesHandler.LoadAllTextboxes Me
End Sub

这有很多优点,例如能够在表单模块中为某些控件使用其他处理程序,并且能够引用在处理程序中调用事件的控件。