【问题标题】:Execute VBA Outlook Macro from Powershell or C# Console app从 Powershell 或 C# 控制台应用程序执行 VBA Outlook 宏
【发布时间】:2018-11-25 10:42:45
【问题描述】:

我制作了一个 VBA 宏,它从 Outlook 日历中获取所有事件并将它们写入 Excel 文件。

然后我需要从 powershell 脚本或 C# 控制台应用程序执行此宏。

有什么办法吗?

我在 win10 上使用 Outlook 2013。

【问题讨论】:

    标签: c# vba powershell outlook


    【解决方案1】:

    Outlook 的 Application 类没有 Run 成员,这使得在进程外(哎呀,甚至在进程内)调用 VBA 代码非常困难,大概是出于安全原因。当Rubberduck 最初为 Outlook VBA 实现单元测试支持时,它是一个文字 hackjob,涉及创建一个命令栏按钮并将其“OnAction”分配给我们想要调用的单元测试过程 - 就像这样:

    var app = Application;
    var exp = app.ActiveExplorer();
    CommandBar cb = exp.CommandBars.Add("RubberduckCallbackProxy", Temporary: true);
    CommandBarControl btn = cb.Controls.Add(MsoControlType.msoControlButton, 1);
    btn.OnAction = declaration.QualifiedName.ToString();
    btn.Execute();
    cb.Delete();
    

    因此,如果您创建 btn.OnAction = "YourMacro"; 并引用 Outlook 互操作程序集(ApplicationMicrosoft.Office.Interop.Outlook.Application),我相信这可以工作 - 宏必须在标准模块中 - 如果它在 @987654331 @ 然后轮子脱落。

    (请注意,从那时起,我们找到了一种更优雅、与主机无关的方式来运行用户的测试方法,但这不会在进程外工作)

    ThisOutlookSession 对象在运行时使用该类的公共成员进行扩展,因此如果您的宏是用ThisOutlookSession 编写的,那么from VBA code 您可以像app.MacroName 一样调用它,但我们没有可以get that to work from C# code

    最后,请注意上面的代码会泄漏 COM 对象。确保你正确清理了非托管对象,否则你会看到一个幽灵 OUTLOOK.EXE 进程在任务管理器中等待被杀死,在你的脚本/控制台应用程序消失之后。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-06-24
      • 1970-01-01
      • 1970-01-01
      • 2015-09-20
      相关资源
      最近更新 更多