如何通过 MS-Access VBA 中的 TextBox.OnKeyUp 属性传递 KeyCode

Posted

技术标签:

【中文标题】如何通过 MS-Access VBA 中的 TextBox.OnKeyUp 属性传递 KeyCode【英文标题】:How to pass KeyCode via TextBox.OnKeyUp property in MS-Access VBA 【发布时间】:2018-04-12 06:39:09 【问题描述】:

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

txtMyTextBox.OnKeyUp = "=myEventHandlerFunction()"

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

txtMyTextBox.OnKeyUp = "=myEventHandlerFunction(KeyCode)"

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

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

MSDN documentation on the TextBox.OnKeyUp Property (Access) 没有提供任何相关信息。

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

【问题讨论】:

【参考方案1】:

问题在于您处理事件的方式。您不应将程序处理程序设置为文本表达式,而应使用类和 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

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

【讨论】:

@Jorg 编辑没问题,我个人使用不同的代码从表单加载单个文本框,并从表单加载多个文本框(我经常遍历表单上的文本框,并调用 @987654324 @来自表格)。 是的,我认为两者都可以通过编辑来完成。感谢您采用这种精心设计的方法,它对我来说似乎是最专业的。

以上是关于如何通过 MS-Access VBA 中的 TextBox.OnKeyUp 属性传递 KeyCode的主要内容,如果未能解决你的问题,请参考以下文章

MS-Access 获取字段值,通过 VBA 函数运行,并发送到 SQL

编辑器中的 ms-access VBA 长 sql 查询字符串行拆分(内联双引号)

如何在 ms-access 2007 VBA 中计算 mod 97

如何在 ms-access VBA 中检索表的 odbc 数据库名称

我希望从 ms-access 2013 数据库中的所有表单、报告和模块中导出 vba 源代码

如何使用sql语句和vba将数据从MS-Access导入excel power查询?