从shape OnAction属性动态调用宏传递参数

Rog*_*eto 5 excel vba excel-vba excel-2013

好吧,我的问题是我创建了一个VBA Sub,它接收一个excel Cell引用和2个文本值以及一个Variant作为参数.

Sub CreateButton(oCell, sLabel, sOnClickMacro, oParameters)
Run Code Online (Sandbox Code Playgroud)

这个Sub成功地在oCell上创建了一个按钮但是我必须向Macro发送一个参数,实现它的最佳方法是什么?

如果已经挖掘了一些不起作用的方法,而另一些方法也很脏,这些都不会让我填饱肚子


在我帮助解决问题的帮助下,我在这里提出了一个更简单的工作解决方案

Sub Button_Click(sText)
    MsgBox "Message: " & sText
End Sub

Sub Test_Initiallize()
    Dim oCell
    Dim oSheet
    Dim oShape

    Set oCell = Range("A1")
    Set oSheet = ThisWorkbook.Sheets(1)

    For Each oShape In oSheet.Shapes
        oShape.Delete
    Next

    Set oShape = oSheet.Shapes.AddShape(msoShapeRectangle, oCell.Left, oCell.Top,     oCell.Width, oCell.Height)

    oShape.TextFrame.Characters.Text = "Click Me"
    oShape.OnAction = "'Button_Click ""Hello World""'"
End Sub
Run Code Online (Sandbox Code Playgroud)

Cor*_*mey 10

您可以为OnAction分配一个字符串,该字符串包含要调用的子句及其参数(请注意整个字符串用单引号括起来)

喜欢:

Shape.OnAction = "'SubToCallOnAction ""Hello World!""'"

Sub SubToCallOnAction(text As String)

    MsgBox text

End Sub
Run Code Online (Sandbox Code Playgroud)

数字参数不需要引号(虽然它们将通过数字传递 - >默认字符串转换 - >默认数字转换)

所以,我想,你想要做的是传递被点击的按钮的名称:

Shape.OnAction = "'SubToCallOnAction """ & Shape.Name & """'"
Run Code Online (Sandbox Code Playgroud)

更高级和灵活的使用可能是这样的:

'Set the button up like:
databaseTable = "tbl_ValidAreas"
databaseField = "Country"
Shape.OnAction = _
    "'SubToCallOnAction """ & _
    Shape.Name & """ """ & _
    databaseTable & """ """ & 
    databaseField & """'"

...
Sub SubToCallOnAction(buttonID As String, ParamArray args)

    Select Case buttonID
        Case "button1"
            'get the relevant data or whatever using the ParamArray args
            Call GetData(args(0),args(1))
        ...
    End Select

End Sub
Run Code Online (Sandbox Code Playgroud)