使用.onAction的VBA Pass参数

时间:2014-08-02 17:42:36

标签: vba ms-word word-vba office-2010

这就是我的潜意识的样子:

Sub InsertRowWithContent(rowNo As Long)

这是我的.onAction:

.OnAction = "'InsertRowWithContent""" & C & """'"

C是先前声明的 Long 变量。

它说没有找到宏。在添加参数之前它工作正常!

2 个答案:

答案 0 :(得分:8)

我用这种语法成功传递了参数:

.OnAction = "=InsertRowWithContent(" & C & ")"

考虑:

  • C很长。所以不要添加配额,就像你在代码中调用Sub一样。
  • OnAction评估表达式。因此根据我的经验,表达式需要一个等号,就我而言,它必须是一个函数。只有自动本地回调是潜艇。

修改

我上面的回答以Access作为背景。 Djikay的答案适用于Excel。然而,经过一些挖掘,我很安静,确保只是Word不理解这些语法。 Word VBA无法将参数传递给OnAction语句中的sub。至少目前最好接受这个。

但是,这是Word(2010)最终运行的内容:

创建命令栏和按钮。对于OnAction,只传递Sub的名称。但请使用按钮的Parameter属性。

' Add bar
Set cdb = Application.CommandBars.Add("SomeTest", , False, False)
cdb.Visible = True

' Add button
Set cbb = cdb.Controls.Add
cbb.Caption = "PressMe"
cbb.OnAction = "TheCallback"
cbb.Parameter = 456

然后,通过CommandBars.ActionControl.Parameter表达式访问参数:

Public Sub TheCallback()

  MsgBox "The parameter passed is: " & CommandBars.ActionControl.Parameter

End Sub

ActionControl与Access下的ActiveControl非常相似(如果不相同):它是最后点击的控件。

来源:http://www.experts-exchange.com/Programming/Languages/Visual_Basic/Q_24982922.html

* phuu * :-)

答案 1 :(得分:3)

您需要在子名称后面添加一个空格,如下所示:

.OnAction = "'InsertRowWithContent " & C & "'"
                                  ^^^^^^^^^^

修改

此外,由于您传递的是Long参数,因此不应将其括在引号中。

编辑2

好的,这需要一些特殊的酱(代码)。我一直在试验,我得到了以下工作。

在Sheet1 Excel对象中:

Option Explicit

Sub DestroyToolbar()

  Application.CommandBars("DoomBar").Delete

End Sub

Sub MakeToolbar()

  Dim C As Long
  C = 100

  With Application
    .CommandBars.Add(Name:="DoomBar").Visible = True
    With .CommandBars("DoomBar")
      .Controls.Add Type:=msoControlButton, ID:=2950, Before:=1
      With .Controls(1)
        .OnAction = "'PressMe " & C & "'"
      End With
    End With
  End With

End Sub

在新的标准代码模块中,添加:

Public Sub PressMe(C As Long)

  With Application.CommandBars("DoomBar")
    With .Controls(1)
      MsgBox "The value of C that was passed to this macro is: " & C
    End With
  End With

End Sub

如果您运行MakeToolbar,它将在"加载项"中创建一个新的工具栏。带。要删除它,您可以运行DestroyToolbar

工具栏就位后,点击该按钮会显示一个值为C的消息框(在我的示例中为100)。

我已经在Excel 2010中对上述内容进行了测试,并在一个全新的.xlsm文件中运行。