Excel Vba单击带有application.caller的单选按钮

Excel Vba单击带有application.caller的单选按钮,vba,excel,Vba,Excel,我有一个宏,如果单击单选按钮,它将运行函数(清除每个命名范围,具体取决于application.caller.name) Sub Clear_Click() Dim s, f, arr s = ActiveSheet.Shapes(Application.Caller).Name arr = Array("NamedArray1", "NamedArray2", "NamedArray3", "NamedArray4") Select Case s Case "Clear7"

我有一个宏,如果单击单选按钮,它将运行函数(清除每个命名范围,具体取决于application.caller.name)

Sub Clear_Click()


Dim s, f, arr
s = ActiveSheet.Shapes(Application.Caller).Name
arr = Array("NamedArray1", "NamedArray2", "NamedArray3", "NamedArray4")
Select Case s
    Case "Clear7"
        For i = LBound(arr) To UBound(arr)
            ThisWorkbook.Worksheets("info").Range(arr(i)).value = ""
        Next i
    Case Else
        f = arr(Right(s, 1) - 1)
        ThisWorkbook.Worksheets("info").Range(f).value = ""
End Select

End Sub
它工作正常

现在我需要从其他功能中单击Clear7单选按钮 所以如果我这样做了

Sub test()
Application.Run ActiveSheet.Shapes("Clear7").OnAction
End Sub
我在
s=ActiveSheet.Shapes(Application.Caller).Name上出错,因为没有Application.Caller


那么,如何从其他函数中单击单选按钮呢?

如果您使用的是Application.Caller,但您希望在没有人需要单击按钮的情况下运行代码,那么下面介绍了如何执行此操作

注意:由于Clear\u Click有一个参数,因此在将其附加到按钮时,它不会显示在“分配宏”列表中,但您可以直接在框中键入其名称,这样就可以了

Sub Clear_Click(Optional callerName As String = "")

    Dim s, f, arr, cn As String, i
    Dim sht As Worksheet

    cn = IIf(Len(callerName) > 0, callerName, Application.Caller)
    'Debug.Print cn

    Set sht = ThisWorkbook.Worksheets("info")
    arr = Array("NamedArray1", "NamedArray2", "NamedArray3", "NamedArray4")

    Select Case cn
        Case "Clear7"
            For i = LBound(arr) To UBound(arr)
                sht.Range(arr(i)).Value = ""
            Next i
        Case Else
            f = arr(Right(s, 1) - 1)
            sht.Range(f).Value = ""
    End Select

End Sub


Sub test()
    ClickIt "Clear7"
End Sub

'run a macro attached to a shape and pass its name as a parameter
Sub ClickIt(sName As String)
    Application.Run ActiveSheet.Shapes(sName).OnAction, sName
End Sub

老实说,我不明白当您计划访问带有对象引用的函数/子函数时,为什么要使用
ActiveSheet
。将工作表设置为引用对象并将单选按钮对象引用作为参数发送,对您来说有这么难吗?