如何在Excel VBA打开Word文档时禁止运行Document_Open自动宏
解决方案
核心原因是Word的Document_Open属于文档自带的自动运行宏,通过Excel VBA自动化调用打开Word时,默认会执行该事件,弹出的模态用户窗体会阻塞代码继续向下执行,可通过以下两种方案修复:
方案1:临时禁用自动化实例的宏自动运行(推荐)
该方案仅禁止自动化打开文件时自动运行宏,不会影响用户手动打开Word文件时的宏规则,修改后的代码如下:
Private Sub CommandButton18_Click() Dim Word As New Word.Application Dim MRpt As Word.Document Dim oriSecurity As MsoAutomationSecurity Word.Visible = True ' 保存Word实例原有的自动化安全设置 oriSecurity = Word.AutomationSecurity ' 临时强制禁用自动化打开文档时自动运行所有宏 Word.AutomationSecurity = msoAutomationSecurityForceDisable ' 必须指定Word实例下的Documents集合,避免调用到其他独立Word进程的资源 Set MRpt = Word.Documents.Open(Filename:="MyWordDocumentPath" & ".docm") ' 打开完成后立即恢复原有安全设置,避免影响后续操作 Word.AutomationSecurity = oriSecurity ' 此处填写你读取Word数据的业务代码 ' 操作完成后清理资源,避免残留后台Word进程 MRpt.Close SaveChanges:=wdDoNotSaveChanges Word.Quit Set MRpt = Nothing Set Word = Nothing End Sub
方案2:仅禁用Word实例的事件响应
如果你后续还需要运行该文档内的其他宏,仅需要屏蔽Document_Open这类事件触发,可以使用以下代码:
' 打开文档前禁用事件响应 Word.EnableEvents = False Set MRpt = Word.Documents.Open(Filename:="MyWordDocumentPath" & ".docm") ' 文档打开完成后恢复事件响应 Word.EnableEvents = True
如果你使用后期绑定创建Word实例(即
Dim Word As Object,无需提前引用Word对象库),可将代码中的枚举替换为对应数值:msoAutomationSecurityForceDisable = 3、wdDoNotSaveChanges = 0。
如果不需要显示Word界面,可将Word.Visible = True改为False,后台运行更流畅,也不会干扰用户操作。
内容的提问来源于stack exchange,提问作者Milad
相关产品推荐
相关产品推荐

