【发布时间】:2018-11-25 10:42:45
【问题描述】:
我制作了一个 VBA 宏,它从 Outlook 日历中获取所有事件并将它们写入 Excel 文件。
然后我需要从 powershell 脚本或 C# 控制台应用程序执行此宏。
有什么办法吗?
我在 win10 上使用 Outlook 2013。
【问题讨论】:
标签: c# vba powershell outlook
我制作了一个 VBA 宏,它从 Outlook 日历中获取所有事件并将它们写入 Excel 文件。
然后我需要从 powershell 脚本或 C# 控制台应用程序执行此宏。
有什么办法吗?
我在 win10 上使用 Outlook 2013。
【问题讨论】:
标签: c# vba powershell outlook
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 互操作程序集(Application 是 Microsoft.Office.Interop.Outlook.Application),我相信这可以工作 - 宏必须在标准模块中 - 如果它在 @987654331 @ 然后轮子脱落。
(请注意,从那时起,我们找到了一种更优雅、与主机无关的方式来运行用户的测试方法,但这不会在进程外工作)
ThisOutlookSession 对象在运行时使用该类的公共成员进行扩展,因此如果您的宏是用ThisOutlookSession 编写的,那么from VBA code 您可以像app.MacroName 一样调用它,但我们没有可以get that to work from C# code。
最后,请注意上面的代码会泄漏 COM 对象。确保你正确清理了非托管对象,否则你会看到一个幽灵 OUTLOOK.EXE 进程在任务管理器中等待被杀死,在你的脚本/控制台应用程序消失之后。
【讨论】: