从VBA中的多个按钮调用相同的SUB

时间:2018-07-09 01:24:31

标签: excel-vba vba excel

我在同一列但不同行中的分布图上有多个按钮(活动x)。这些按钮捕获活动的开始时间。 如果按下按钮1,则其旁边的单元格应以当前时间填充。 如果按下按钮2,则其旁边的单元格应以当前时间填充。等等.....

我已经在VBA中编写了一个SUB,如下所示:

Private Sub StartTimer_Click()
    Range("I4").Value = Now
End Sub

我不想为每个按钮操作重复此代码。请让我知道如何使其动态化。

2 个答案:

答案 0 :(得分:2)

一个简单的WithEvents示例:

在一个类(名为clsButtons)中:

Private WithEvents Bt As MSForms.CommandButton

Property Set obj(b As MSForms.CommandButton)
Set Bt = b
End Property

Private Sub Bt_Click()
'uses the right of the name of the CommandButton
Cells(1 + Right(Bt.Name, 1) * 3, 9).Value = Now
End Sub

在工作表代码中(带有按钮的代码):

Dim myButtons  As Collection
Private Sub Worksheet_Activate()

    Dim ctl As OLEObject
    Dim ButtonClass As clsButtons
    Set myButtons = New Collection

    For Each ctl In Sheet1.OLEObjects
            If ctl.progID = "Forms.CommandButton.1" Then
               Set ButtonClass = New clsButtons
               Set ButtonClass.obj = ctl.Object
               myButtons.Add ButtonClass
        End If
    Next ctl

End Sub

答案 1 :(得分:1)

创建一个标准模块,并将过程放入其中。

虽然可以在私有模块中共享过程,但最佳实践是将任何共享过程放在共享模块中。

在VBA编辑器中,单击Insert> Module

粘贴到那里,并为其指定一个唯一的名称。使用您的示例,您可以执行以下操作:

Public Sub SetTimeValue()
    Range("I4").Value = Now 
End Sub

...然后从另一个电话中调用此公共存根,例如:

Private Sub StartTimer_Click()
    SetTimeValue
End Sub

...以及其他需要调用代码的位置。

我假设您所关心的 actual 过程有多行代码,否则重复复制并不是真正的问题。


更多信息: