Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/ms-access/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Access VBA将表单元素名称作为参数_Vba_Ms Access - Fatal编程技术网

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

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

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

我有一个包含几个元素的表单:其中一些是文本框,称为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)

但它似乎不起作用。关于如何达到这个目标有什么想法吗?

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

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
事件副本的代码隐藏。这要干净得多。