6

好吧,我的问题是我创建了一个 VBA Sub,它接收一个 excel 单元格引用和 2 个文本值和一个 Variant 作为参数。

Sub CreateButton(oCell, sLabel, sOnClickMacro, oParameters)

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

如果挖掘了一些不起作用的方法,还有一些肮脏的方法让我感到不舒服


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

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
4

2 回答 2

11

您可以为 OnAction 分配一个字符串,该字符串具有要调用的子函数,后跟其参数(注意整个字符串用单引号括起来)

喜欢:

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

Sub SubToCallOnAction(text As String)

    MsgBox text

End Sub

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

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

Shape.OnAction = "'SubToCallOnAction """ & Shape.Name & """'"

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

'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
于 2013-08-17T00:28:43.207 回答
1

-- 对于在 2016 年以上找到此页面的人 --

Cor_Blimey 的解决方案在 Excel 2003 中不起作用。您必须在参数之间添加逗号而不是空格,如下所示:

Shape.OnAction = _
    "'SubToCallOnAction """ & _
    Shape.Name & """,""" & _
    databaseTable & """,""" & 
    databaseField & """'
于 2016-05-11T07:31:53.390 回答