在Outlook 2010中,VBA运行一个名称作为参数传递的宏

时间:2012-03-13 00:29:20

标签: vba outlook

我在Windows 7中使用VBA编写的Outlook 2010中,并希望将宏(或子例程)的名称作为字符串变量传递给另一个子例程,并让该例程运行宏。在Word中你可以这样做 Application.Run MacroName:= strMacroName 其中strMacroName是一个带有宏名称的字符串变量。这种方法在Outlook 2010中不起作用。我怎样才能完成同样的事情? 我试过了

  1. Call Application.strMacroName
  2. Call strMacroName
  3. strMacroName就行了
  4. Outlook.Application.strMacroName
  5. 这些都不起作用。

    我刚刚升级到Outlook 2010,因此无法再使用键盘快捷键来运行自定义代码来处理电子邮件。因此,要恢复该功能的某些版本,我已创建代码以显示包含最常见宏的对话框。代码相当干净,随着时间的推移进行修改并传递我想要运行的宏的名称,但我曾经能够在一个命令(Application.Run MacroName:=strMacroName)中运行该例程。

    现在我必须包含一个long switch语句来完成同样的事情。不是那么简单。

    谢谢!

2 个答案:

答案 0 :(得分:7)

CallByName似乎是唯一的出路。

将此代码放在ThisOutlookSession

Public Sub TestFoo()
    Dim testClass As New TestClass1
    CallByName testClass, "TestMethod1", VbMethod
End Sub

此代码位于TestClass1

Public Sub TestMethod1()
    MsgBox "huzzah!"
End Sub

调用ThisOutlookSession.TestFoo会为您提供预期的消息框。

答案 1 :(得分:2)

据我所知,在Outlook中以编程方式运行命名宏的唯一方法(不使用自定义类,这里的另一个答案)是创建临时CommandBarButton,执行它,并立即删除它。这适用于Outlook 2013,即使使用功能区:

Public Sub runProc(procToRun As String)
 With Application.ActiveExplorer.CommandBars.Add("Custom", temporary:=True)
  With .Controls.Add(msoControlButton, 1, , , True)
   .OnAction = procToRun
   .Execute
   .Delete
  End With
 .Delete
 End With
End Sub

我知道这是一个老问题,但我自己在2017年末无法找到这个确切的答案,所以希望它会帮助别人。请注意,这不会运行ThisOutlookSession中的宏...您的宏需要位于代码模块中。