0

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

这就是它现在的工作方式:

Dim v As New clsNav
Set v.button1 = Me.button1
Set v.button2 = Me.button2
v.init

在 v.init 中,我想设置所有的事件,比如点击。所以当用户点击button1时,它应该运行一个指定的方法。

我怎样才能做到这一点?

4

2 回答 2

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

现在,只要您必须运行的代码不使用特定于该表单的控件,它就可以工作。如果您确实需要编写这样的代码,只需将控件传递给子程序,而不是通过其调用它Name

例子。可以说,当我们单击按钮时,它会使用今天的日期更新 TextBox。每个表单上的文本框都有不同的名称。 txtDate1Form1txtDate2Form2。所以那会是什么样子

'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

如果您尝试在运行时执行此操作

如何使用 VBA 将事件添加到运行时在 Excel 中创建的控件

似乎是一个不错的起点。我无法想象值得付出努力的情况。

于 2013-06-21T07:12:27.827 回答
0

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

因此,当我构建一个使用动态添加控件的表单时,我只需为每个控件创建其中一个对象,并将其设置为调用表单中的代码。表单中的代码只接受 frmCtrl 对象的参数,因此它可以很容易地查看哪个控件触发了代码,然后从那里开始。我在 Visio 中工作,所以我还可以通过模块和函数名称调用函数,因此类也可以处理它。不过,您必须研究如何使用 Access 进行此类呼叫。

当您的控件已通过 VBIDE 添加时,可以使用此方法,但是当您可以在此处的另一个答案中使用该方法时,为此设置此类可能不值得。

于 2013-06-21T19:00:03.313 回答