Access VBA将表单元素名称作为参数

时间:2018-11-22 09:40:30

标签: vba ms-access

让我们看看是否有人知道如何解决此问题:

我有一个包含多个元素的表单:其中一些是称为A1,A2,A3,A4 ...的文本框。

现在,它们的AfterUpdate子过程非常长,但彼此几乎不相似:A1_AfterUpdate,A2_AfterUpdate,A3_AfterUpdate ...等...非常相似,但它们更改的文本框名称相同。

我的想法是在这样定义的子过程中收集所有相等的对象:

Private Sub Update(Box As String, Menu As Boolean)
   If Menu=True{ 
   Me!Box.Text = "This is the text that is going to change"
   }
End Sub

因此,我唯一要做的就是以这种方式调用它,例如:

Update(A1, True)

但是它似乎不起作用。关于如何实现这一目标的任何想法吗?

2 个答案:

答案 0 :(得分:2)

添加一个类模块-我将其称为clsTextBoxEvents

将此代码添加到类中:

Public WithEvents txt As Access.TextBox

Private Sub txt_AfterUpdate()
    MsgBox txt.Name & " has been updated."
End Sub  

在您的表单模块中添加以下代码:

Public MyTextBoxes As New Collection

Private Sub Form_Open(Cancel As Integer)

    Dim ctl As Control
    Dim txtBoxEvent As clsTextBoxEvents

    For Each ctl In Me.Controls
        If TypeName(ctl) = "TextBox" Then
            Set txtBoxEvent = New clsTextBoxEvents
            Set txtBoxEvent.txt = ctl
            txtBoxEvent.txt.AfterUpdate = "[Event Procedure]"
            MyTextBoxes.Add txtBoxEvent
        End If
    Next ctl

End Sub

MyTextBoxes声明必须位于模块的顶部。

这仅将AfterUpdate事件添加到表单上的所有文本框。您可能需要对该名称进行一些调整,以使其具有名称中包含特定文本的文本框,或位于表单中特定框架中的控件。

答案 1 :(得分:0)

如果您使用函数而不是子函数:

Private Function UpdateCtl(Menu As Boolean)
   If Menu Then 
       activecontrol = "This is the text that is going to change"
   End If
End Sub

然后您可以直接从控件的AfterUpdate属性中调用它:=UpdateCtl(True)
简单快捷