Excel 使用具有按钮属性的不同命令按钮触发同一宏

Excel 使用具有按钮属性的不同命令按钮触发同一宏,excel,vba,Excel,Vba,正如主题所建议的,我已经构建了一个需要变量输入的宏 Sub GetFile(Account as String) 目前,我正在设置multiple sub来调用脚本并将它们分配给不同的命令按钮 Sub AC1_File Call GetFile("Account1") end sub Sub AC2_File Call GetFile("Account2") end sub 这个名单还在继续 我尽量不让我的代码太长(因为我有两位数的账户), 我的代码是否可以获取comman

正如主题所建议的,我已经构建了一个需要变量输入的宏

Sub GetFile(Account as String)
目前,我正在设置multiple sub来调用脚本并将它们分配给不同的命令按钮

Sub AC1_File
    Call GetFile("Account1")
end sub

Sub AC2_File
    Call GetFile("Account2")
end sub
这个名单还在继续

我尽量不让我的代码太长(因为我有两位数的账户), 我的代码是否可以获取commandbutton名称的属性并使用它而不是Account1、2、3

像下面这样的

Call GetFile(triggering-commandbutton.name)

您可以创建许多命令按钮作为ActiveX控制器,然后编写VBA,如下所示:

Private Sub CommandButton1_Click()
    Call GetFile("Account1")
End Sub

Private Sub CommandButton2_Click()
    Call GetFile("Account2")
End Sub

您可以创建许多命令按钮作为ActiveX控制器,然后编写VBA,如下所示:

Private Sub CommandButton1_Click()
    Call GetFile("Account1")
End Sub

Private Sub CommandButton2_Click()
    Call GetFile("Account2")
End Sub
窗体控件 在普通模块中,添加不带参数的过程:

Public Sub Button_Click()
    GetFile Application.Caller
End Sub  
此代码将提取按钮名称并将其传递给
GetFile
过程

Sub GetFile(Account As String)
    MsgBox "Account Name is " & Account
End Sub  
因此,现在您只需将按钮命名为Account1、Account2等


ActiveX控件 如果使用ActiveX控件,则可以使用类捕获单击事件

创建一个类模块并将其命名为
clsButtonClick

将此代码添加到类模块:

Public WithEvents AccountBtn As MSForms.CommandButton

Private Sub AccountBtn_Click()
    MsgBox AccountBtn.Name & " on " & AccountBtn.Parent.Name
    GetFile AccountBtn.Name
End Sub
Public Sub Initialize_Buttons()

    Dim wrkSht As Worksheet
    Dim btnEvnt As clsButtonClick
    Dim obj As OLEObject

    For Each wrkSht In ThisWorkbook.Worksheets
        For Each obj In wrkSht.OLEObjects
            If TypeName(obj.Object) = "CommandButton" Then
                Set btnEvnt = New clsButtonClick
                Set btnEvnt.AccountBtn = obj.Object
                colBtns.Add btnEvnt
            End If
        Next obj
    Next wrkSht

End Sub  
在普通模块的最顶部添加以下行:

Public colBtns As New Collection  
并将此代码添加到模块中:

Public WithEvents AccountBtn As MSForms.CommandButton

Private Sub AccountBtn_Click()
    MsgBox AccountBtn.Name & " on " & AccountBtn.Parent.Name
    GetFile AccountBtn.Name
End Sub
Public Sub Initialize_Buttons()

    Dim wrkSht As Worksheet
    Dim btnEvnt As clsButtonClick
    Dim obj As OLEObject

    For Each wrkSht In ThisWorkbook.Worksheets
        For Each obj In wrkSht.OLEObjects
            If TypeName(obj.Object) = "CommandButton" Then
                Set btnEvnt = New clsButtonClick
                Set btnEvnt.AccountBtn = obj.Object
                colBtns.Add btnEvnt
            End If
        Next obj
    Next wrkSht

End Sub  
这将遍历工作簿中的每一页,并从类模块中为任何ActiveX命令按钮提供单击事件。
如果需要将
Initialize_Buttons
过程限制为特定工作表或工作表上的特定按钮,请更新该过程

最后,在
此工作簿
模块中的
工作簿
打开事件中调用
初始化按钮。

表单控件 在普通模块中,添加不带参数的过程:

Public Sub Button_Click()
    GetFile Application.Caller
End Sub  
此代码将提取按钮名称并将其传递给
GetFile
过程

Sub GetFile(Account As String)
    MsgBox "Account Name is " & Account
End Sub  
因此,现在您只需将按钮命名为Account1、Account2等


ActiveX控件 如果使用ActiveX控件,则可以使用类捕获单击事件

创建一个类模块并将其命名为
clsButtonClick

将此代码添加到类模块:

Public WithEvents AccountBtn As MSForms.CommandButton

Private Sub AccountBtn_Click()
    MsgBox AccountBtn.Name & " on " & AccountBtn.Parent.Name
    GetFile AccountBtn.Name
End Sub
Public Sub Initialize_Buttons()

    Dim wrkSht As Worksheet
    Dim btnEvnt As clsButtonClick
    Dim obj As OLEObject

    For Each wrkSht In ThisWorkbook.Worksheets
        For Each obj In wrkSht.OLEObjects
            If TypeName(obj.Object) = "CommandButton" Then
                Set btnEvnt = New clsButtonClick
                Set btnEvnt.AccountBtn = obj.Object
                colBtns.Add btnEvnt
            End If
        Next obj
    Next wrkSht

End Sub  
在普通模块的最顶部添加以下行:

Public colBtns As New Collection  
并将此代码添加到模块中:

Public WithEvents AccountBtn As MSForms.CommandButton

Private Sub AccountBtn_Click()
    MsgBox AccountBtn.Name & " on " & AccountBtn.Parent.Name
    GetFile AccountBtn.Name
End Sub
Public Sub Initialize_Buttons()

    Dim wrkSht As Worksheet
    Dim btnEvnt As clsButtonClick
    Dim obj As OLEObject

    For Each wrkSht In ThisWorkbook.Worksheets
        For Each obj In wrkSht.OLEObjects
            If TypeName(obj.Object) = "CommandButton" Then
                Set btnEvnt = New clsButtonClick
                Set btnEvnt.AccountBtn = obj.Object
                colBtns.Add btnEvnt
            End If
        Next obj
    Next wrkSht

End Sub  
这将遍历工作簿中的每一页,并从类模块中为任何ActiveX命令按钮提供单击事件。
如果需要将
Initialize_Buttons
过程限制为特定工作表或工作表上的特定按钮,请更新该过程


最后,在
此工作簿
模块中的
工作簿
打开
事件中调用
初始化按钮
代码。

检查一下,这些是ActiveX命令按钮,而不是表单控件按钮?使用表单控件按钮,您可以使用。ActiveX更复杂,但可行。请检查一下,这些是ActiveX命令按钮,而不是窗体控件按钮?使用表单控件按钮,您可以使用。ActiveX更复杂,但可行。