vba - 将多个控制事件绑定(bind)到同一个处理程序,获取发送者

标签 vba ms-access-2010

我正在构建一个带有大量 TextBox 控件的 Access 表单。其中每一个的 GotFocus() 事件都将完全相同:

Private Sub Text1_GotFocus()
    Text1.BorderColor = RGB(100, 100, 255)
    ...
End Sub

Private Sub Text2_GotFocus()
    Text2.BorderColor = RGB(100, 100, 255)
    ...
End Sub

'... ad infinitum

这自然是维护方面的噩梦,而且从美学角度来说,这是我必须不断滚动过去的一大堆内容。我可以将 BorderColor = RGB(100, 100, 255) 等扔到一个函数中,并让每个处理程序调用该函数,但我仍然为每个 TextBox 留下 3 行相同的 block - throw在 LostFocus 和其他事件中,无论文本框如何,处理方式都是相同的,这变得很愚蠢。

因此,明智的做法是使用一个 AllTextBoxes_GotFocus() 方法,并让每个 TextBox 的 On Got Focus 事件指向该方法。但有两个问题:

  • 我在表单设计器的下拉列表中看不到我在 VBA 中定义的任何函数或子函数,只能看到 [Event procedure] (它生成标准 Private Sub Text1_GotFocus( ) 方法)以及应用程序中的任何宏。这很……奇怪。考虑到宏有一个用于调用 VBA 函数的 RunCode 选项,这似乎是一种奇怪的调用代码的方式,必须获得调用宏的控件来调用代码。当然有更好的方法(我认为宏只能调用模块中的函数,而不能调用表单中的函数)。
  • 我不确定如何获取发件人,因此我可以设置适当的控件边框。 VB.NET 在其事件中传递发送者和事件参数:Private Sub Text1_GotFocus(ByVal sender As System.Object, ByVal e As System.EventArgs),但 VBA 不会。

如何使用单个处理程序处理多个事件,并在处理程序中获取事件的发送者?

最佳答案

这是我的做法,但我知道这会覆盖任何自定义的 GotFocus 事件

Private Sub Form_Load()
  On Error Resume Next
  Dim ctrl As Control
  For Each ctrl In Me.Form.Controls
        If ctrl.ControlType = acTextBox Then
           ctrl.GotFocus = "=changeColor('" & ctrl.name & "',100,100,255)"
           'For LostFocus
           ctrl.LostFocus = "=changeColor('" & ctrl.name & "')"
        End If
  Next ctrl
End Sub
Function changeColor(field As String, Optional red AS Integer =0 ,green AS Integer =0,blue As Integer = 0)
   Me.Form.Controls(field).BorderColor = RGB(red, green, blue)
End Function

关于vba - 将多个控制事件绑定(bind)到同一个处理程序,获取发送者,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19791898/

相关文章:

printing - 从 Access 运行时打印时,报告质量(分辨率)较差

excel - 带有 Adodb 查询的下拉列表

excel - Excel 通过 Outlook 发送电子邮件时如何处理错误?

vba - 如何从范围变量中获取表的名称?

vb6 - "Compile Error: Only Comments may appear after End Sub, End Function.."访问 2010 VBA

sql - 从另一个表中提取的条件更新 - Access 语法错误

excel - 使用动态范围将一张纸复制到多张纸的宏

VBA 将行高与粘贴图像大小相匹配

sql - 如果同时购买了两件商品,请选择 orderId

ms-access - 属性中的文本搜索 Access 对象