Access VBA将表单元素名称作为参数
让我们看看是否有人知道如何解决这个问题: 我有一个包含几个元素的表单:其中一些是文本框,称为A1、A2、A3、A4 现在,他们的AfterUpdate子过程非常长,但几乎没有相似之处:A1_AfterUpdate、A2_AfterUpdate、A3_AfterUpdate……等等。。。它们非常相似,但在文本框的名称上有所改变 我的想法是在一个子过程中收集所有相等的内容,子过程定义如下:Access VBA将表单元素名称作为参数,vba,ms-access,Vba,Ms Access,让我们看看是否有人知道如何解决这个问题: 我有一个包含几个元素的表单:其中一些是文本框,称为A1、A2、A3、A4 现在,他们的AfterUpdate子过程非常长,但几乎没有相似之处:A1_AfterUpdate、A2_AfterUpdate、A3_AfterUpdate……等等。。。它们非常相似,但在文本框的名称上有所改变 我的想法是在一个子过程中收集所有相等的内容,子过程定义如下: Private Sub Update(Box As String, Menu As Boolean) I
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)
但它似乎不起作用。关于如何达到这个目标有什么想法吗?如果您使用函数而不是子函数:
Private Function UpdateCtl(Menu As Boolean)
If Menu Then
activecontrol = "This is the text that is going to change"
End If
End Sub
然后您可以直接从控件的AfterUpdate属性调用它:=updatecl(True)
简单快速如果使用函数而不是子函数:
Private Function UpdateCtl(Menu As Boolean)
If Menu Then
activecontrol = "This is the text that is going to change"
End If
End Sub
然后您可以直接从控件的AfterUpdate属性调用它:=updatecl(True)
简单快速添加一个类模块-我称之为
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
mytextboxs
声明必须位于模块的最顶端
这只是将
AfterUpdate
事件添加到表单上的所有文本框中。您可能希望将其细化为名称中包含特定文本的文本框,或表单上特定框架中的控件。添加类模块-我称之为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
mytextboxs
声明必须位于模块的最顶端
这只是将
AfterUpdate
事件添加到表单上的所有文本框中。您可能希望将其细化为名称中包含特定文本的文本框,或表单上特定框架中的控件。框为文本框
而不是字符串
。您应该使用eventhanders编译公共泛型函数或类没有{
在VBA中。你的语法一点也不像VBA。它是如果那么结束如果框作为文本框
而不是字符串
。你应该用eventhanders压缩公共泛型函数或类没有在VBA中,{ /Code>。您的语法看起来根本不像VBA。它是<代码> >
<代码>结束,如果
请考虑对您的答案添加一个小的解释。代码只能自动地被标记为低质量,您的当前请考虑对您的答案添加一个小的解释。代码只自动回答。被标记为低质量,您的当前令人印象深刻,但似乎很复杂。您是否实际使用过此类构造?可能是一个用例?我不理解MyTextBox集合的作用。以我的知识阅读代码,似乎对其没有任何影响。我错过了什么?MyTextBox
集合应该是Private
实际上是因为它只在表单中使用。集合用于存储类的每个实例-每个文本框一个。没有MyTextBox。在末尾添加TXBoxevent
不会触发任何事件。@Patrickonorez我必须说我在Access中没有使用像通常使用连续表单那样的构造>设置如果我有很多控件做同样的事情,但这也需要对表进行更改。我在运行时创建控件时在Excel中使用了类似的代码。现在你让我想到了一个有用的用例,我想的是“它们非常相似,但对于它们更改的文本框的名称”从OPs问题中。@Patrickhornez我一直使用这种类型的构造来验证或限制输入,即一组只接受数字输入的文本框。如果您认为这是“复杂的”,你还没有看到过5到10个重复的按键事件背后的代码。这更干净。令人印象深刻,但似乎很复杂。你真的使用过这样的构造吗?可能是一个用例?我不理解MyTextBox集合的作用。以我的知识阅读代码,似乎与它无关它。我错过了什么呢?mytextboxs
集合应该是Private
,因为它只在表单中使用。该集合用于存储类的每个实例-每个文本框一个实例。没有mytextboxs.Add txtBoxEvent
在最后没有任何事件发生。@patrickhornez我必须说我没有使用su在Access中创建一个结构,因为如果我有很多控件做同样的事情,我通常会使用连续表单
设置,但这也需要对表进行更改。在运行时创建控件时,我在Excel中使用了类似的代码。现在你让我想到了一个有用的用例,我想的就是OPs问题中的“非常相似,但它们更改了文本框的名称”。@Patrickhornez我一直使用这种类型的构造来验证或限制输入,即一组只接受数字输入的文本框。如果您认为这是“复杂的”“,您还没有看到有5或10个重复的KeyPress
事件副本的代码隐藏。这要干净得多。