MS Office 自动化:在宏运行时收到通知(事件)

Posted

技术标签:

【中文标题】MS Office 自动化:在宏运行时收到通知(事件)【英文标题】:MS Office Automation: Get notified (Event) when a macro runs 【发布时间】:2014-07-20 03:46:48 【问题描述】:

我正在使用 C#/.NET 开发一个 MS Office(Excel、Word、PowerPoint 和 Outlook)插件,它可以跟踪和记录一些事件,当它发生为 DocumentOpen、DocumentContentChange..etc 然而,经过几天的搜索,当宏在 Excel 工作簿、Word 文档等上运行时,我无法找到一种方法(事件)来获得通知

困难的方法是尝试捕获用户可以遵循的所有可能的路径来运行宏,使用 Mouse & Keyboard Hooking Win API,它们是:

    使用“宏”对话框(使用纯 Win API 访问窗口): OnClick,如果这是 ActiveWindow,并且“运行”按钮有 重点,读取“宏名称:”标签下的文本框中的值,但是 我发现这种方法非常复杂,因为在某些情况下 喜欢:用户按 ENTER 键,焦点不在“运行”按钮上 或者如果用户双击运行宏的宏列表中的某个项目..

    按下组合键: 例如,宏具有与之关联的 Ctrl+F8 键。

    单击一个形状(主要是 excel):检查此形状是否附加了宏。

我可以看到这些方法非常有限。

你有更好的建议吗?

【问题讨论】:

您考虑过事件程序吗?它们自动运行,也可能通过代码触发其他宏,所以我认为实际上无法检测到哪个宏在何时运行...... 能否也分享一下为什么需要访问调用栈的原因?如果您以某种方式获得了这些信息,您将如何处理它? 别担心 vba4all,这不是某种黑客行为!正如我所说,它是为客户提供的 Office COM 插件,几周后,我们决定跳过此功能并专注于其他功能。谢谢您的 cmets 【参考方案1】:

我这样做的方式是在运行宏时将数据存储在数据库的表中。这样代码就在宏中,你可以确定如果宏运行,数据就会在数据库中。

【讨论】:

亲爱的jbarker2160,我不确定你是否真的理解我的问题!阅读您的答案,您假设我是宏的创建者,但事实并非如此。宏可以位于任何文档中,我什至不需要编辑这些宏,只有在其中一个运行时才会收到通知。然后我需要它的名称。

以上是关于MS Office 自动化:在宏运行时收到通知(事件)的主要内容,如果未能解决你的问题,请参考以下文章

未收到 MS Teams 的任何更改通知

删除 UITableView 行时删除通知(Swift)

MS Office 2003 安装了哪些 Jet 提供程序?

计算机二级MS offic难考过吗?是否60分及格?

excel运行宏后无结果也不提示错误时啥原因?

MS Office VBA 从 2003 到 2010 的变化