我在Windows 7中使用VBA编写的Outlook 2010中,并希望将宏(或子例程)的名称作为字符串变量传递给另一个子例程,并让该例程运行宏。在Word中你可以这样做 Application.Run MacroName:= strMacroName 其中strMacroName是一个带有宏名称的字符串变量。这种方法在Outlook 2010中不起作用。我怎样才能完成同样的事情? 我试过了
Call Application.strMacroName
Call strMacroName
strMacroName
就行了Outlook.Application.strMacroName
这些都不起作用。
我刚刚升级到Outlook 2010,因此无法再使用键盘快捷键来运行自定义代码来处理电子邮件。因此,要恢复该功能的某些版本,我已创建代码以显示包含最常见宏的对话框。代码相当干净,随着时间的推移进行修改并传递我想要运行的宏的名称,但我曾经能够在一个命令(Application.Run MacroName:=strMacroName
)中运行该例程。
现在我必须包含一个long switch语句来完成同样的事情。不是那么简单。
谢谢!
答案 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中的宏...您的宏需要位于代码模块中。