【问题标题】:Dynamically call a macro passing parameters from shape OnAction property从形状 OnAction 属性动态调用宏传递参数
【发布时间】:2013-08-19 11:28:36
【问题描述】:

好吧,我的问题是我创建了一个 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

【问题讨论】:

    标签: vba excel excel-2013


    【解决方案1】:

    -- 对于 2016 年以上发现此页面的人--

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

    Shape.OnAction = _
        "'SubToCallOnAction """ & _
        Shape.Name & """,""" & _
        databaseTable & """,""" & 
        databaseField & """'
    

    【讨论】:

      【解决方案2】:

      您可以为 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
      

      【讨论】:

      • 好吧,我试图动态创建一个可能被编辑、删除或插入的 itens fr 数据库列表,对于前两个按钮,我需要在点击时获取 ID,并且我避免使用更改所有单元格的事件,所以我更喜欢在命令按钮中关联一些东西
      • 是的,成功了,谢谢!我之前尝试过这种方法,但没有注意到调用必须有单引号。肯定会成功的!
      • 猜猜如果参数值之一是字符串并且包含单引号(字符 34),您必须使用什么前缀? :-O
      • @TheBlastOne 是的,不是很奇怪;)。这是因为字符串中的两个双引号(例如“”)解析为一个单引号,这就是为什么只有一个单引号的字符串是奇怪的“”“”:)
      • @Cor_Blimley 不。或者至少不确定我是否理解正确:-) 事实是:VB 字符串中的两个双引号解析为一个单双引号。这就是它们存在的原因:将字符串参数值正确放入双引号对。单引号字符不需要转义。到目前为止,很清楚。问题是:如何在单引号字符串中转义单引号?如果一个包含在字符串参数值之一中,如果不进行转义,代码将失败。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-07-03
      • 1970-01-01
      • 2019-03-21
      • 1970-01-01
      • 2017-06-04
      • 1970-01-01
      相关资源
      最近更新 更多