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
Ms access 如何将VBA代码绑定到单击?_Ms Access_Vba - Fatal编程技术网

Ms access 如何将VBA代码绑定到单击?

Ms access 如何将VBA代码绑定到单击?,ms-access,vba,Ms Access,Vba,我制作了一个图形导航系统,用户可以很容易地找到他/她想要的记录。我现在在多个表单上使用它,因为我将在另一个表单上使用它,所以我希望将代码标准化到一个类中,而不是复制粘贴VBA代码。通过这种方式,我可以在一个地方改进代码,而不是在所有表单上进行相同的更改 这就是它现在的工作原理: Dim v As New clsNav Set v.button1 = Me.button1 Set v.button2 = Me.button2 v.init 在v.init中,我想设置所有事件,比如click。因此

我制作了一个图形导航系统,用户可以很容易地找到他/她想要的记录。我现在在多个表单上使用它,因为我将在另一个表单上使用它,所以我希望将代码标准化到一个类中,而不是复制粘贴VBA代码。通过这种方式,我可以在一个地方改进代码,而不是在所有表单上进行相同的更改

这就是它现在的工作原理:

Dim v As New clsNav
Set v.button1 = Me.button1
Set v.button2 = Me.button2
v.init
在v.init中,我想设置所有事件,比如click。因此,当用户单击按钮1时,它应该运行指定的方法


我如何才能做到这一点?

按钮单击的事件如下所示

Private Sub Button1_Click()
    ' Your code
End Sub
它们位于各个表单后面的代码中。为了能够重用代码,您只需在单独的模块中编写一个子模块,然后在事件中调用它

Private Sub Button1_Click()
    call MySub()
End Sub

' This is in a module
Private Sub MySub()
    ' Your code
End Sub
现在,只要您必须运行的代码不使用特定于该表单的控件,这种方法就可以工作。如果确实需要编写这样的代码,只需将控件传递给sub,而不是通过其
名称调用它

例如。比如说,当我们点击按钮时,它会用今天的日期更新一个文本框。文本框在每个表单上有不同的名称
txtDate1
Form1
txtDate2
Form2
上。那么这看起来是什么样子呢

'Form 1 Button
Private Sub Button1_Click()
    call MySub(txtDate1)
End Sub

'Form 2 Button
Private Sub Button2_Click()
    call MySub(txtDate2)
End Sub

' This is in a module
Private Sub MySub(t as TextBox) 
    t.Text = Date()
End Sub
如果您试图在运行时执行此操作


看起来是个好的开始。我无法想象这样做值得付出努力的情况。

我使用了一个名为frmCtrl的通用类,它为不同的控件类型设置了WithEvents指针,并带有相应的事件(单击、dbl单击等)。然后,我在该类上有一个函数来“设置”对象,因此我传入控件,该函数将其分配给正确类型的对象指针。该例程还有一个参数,用于指定调用哪个对象的函数,因此它知道如何响应事件

Private Sub Button1_Click()
    call MySub()
End Sub

' This is in a module
Private Sub MySub()
    ' Your code
End Sub
因此,当我构建一个使用动态添加控件的表单时,我只需为每个控件创建一个对象,并将其设置为在表单中调用代码。表单中的代码只接受frmCtrl对象的参数,因此它可以很容易地看到哪个控件触发了代码,并从那里开始。我在Visio中工作,因此我还可以按模块和函数名调用函数,这样类也可以处理这个问题。不过,您必须研究如何使用Access拨打此类电话


当您的控件通过VBIDE添加时,可以使用这种方法,但如果您只需使用其他答案中的方法,则可能不值得为此设置此类。

好的。谢谢你的回答!我对VBA没有多少经验。我使用它是因为我的工作是建立一个Access数据库。这不是我的选择。因此,如果你认为这不值得努力,我相信你的话。我已经这样做了,因为我必须继续,而不是等待你的答复:)我现在做的是,我有一个类模块,所以我在表单上实例化一个对象,并
Set obj.cControlName=Me.ControlName
,然后我像你在这个答案中那样设置事件。再次感谢您的回复!