2012-03-13 61 views
4

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

  1. Call Application.strMacroName
  2. Call strMacroName
  3. strMacroName在自己的行
  4. Outlook.Application.strMacroName

没有这些事情的来龙去脉。

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

现在我必须包含一个长开关语句来完成同样的事情。几乎没有那么简单。

谢谢!

+1

CallByName()?尽管如此,这并不比你的选择案例更好。事实上,我不确定它是否适用于Outlook。而你的潜艇必须包含在类模块中。 – 2012-03-13 03:16:06

+0

@Tim CallByName存在于Outlook VBA中,无论它是否有效我还没有检查。 – JimmyPena 2012-03-13 19:36:42

+0

我试过CallByName(),但到目前为止没有运气。看来我不得不跳过不少编码环节才能实现这个目标。 – Jeff1265344 2012-03-14 18:42:17

回答

6

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给你预期的消息框。

+0

感谢您的帮助。我收到错误。 “编译错误:模块不是有效类型”,突出显示ThisOutlookSession中的TestFoo例程。我试着用一个模块中的所有代码,并得到这个错误:“编译错误:New关键字的无效使用”。我不擅长创建用户定义的类,我错过了什么吗? – Jeff1265344 2015-03-08 20:02:26

+0

@ Jeff1265344你可能写了'Dim testClass = New TestClass1',VBA不支持这种类型的赋值,'New'关键字必须是“as type子句”的一部分......我实际上在我之前运行了这个代码发布它;) – 2015-03-08 20:04:32

+0

@ Mats-Mug,当您发布此建议时,看起来我正在编辑我的帖子。我从未编辑的代码中复制并粘贴,并且仍然发现此问题。或许我需要参考文献中的某些内容? – Jeff1265344 2015-03-08 20:13:05

0

据我所知,在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中的宏...您的宏需要在代码模块中。

相关问题