【发布时间】:2016-05-21 21:38:31
【问题描述】:
我有一个包含 AutoNew 宏的 Normal.dotm 文件。
每次使用任何其他模板创建新文档时,都会自动执行此宏。
有什么方法可以阻止特定模板的这种自动行为?
我有一个 Word VSTO 插件正在运行,所以我可以挂钩 Word 的事件,但到目前为止我还没有找到防止这种情况发生的方法。
我知道我可以在以编程方式使用模板时阻止宏执行,例如:
' Disable auto-macros before opening document
wordApplication.WordBasic.DisableAutoMacros(1)
' Open document
newWordDocument = wordApplication.Documents.Open(template.FullName, ConfirmConversions:=False, [ReadOnly]:=True, AddToRecentFiles:=False, Revert:=True)
' Re-enable auto-macros
wordApplication.WordBasic.DisableAutoMacros(0)
但当用户使用 Windows 资源管理器中的 Word 模板或 Word 中的打开对话框时,此解决方案不起作用,因为在这些情况下,我无法执行代码,否则为时已晚。
或者我可以吗? 我希望有人对我有用:-)
-
编辑:在尝试不同的解决方案时,我发现了一些可以帮助处于类似情况的其他人的方法,但不幸的是它对我没有帮助。
似乎如果一个模板包含一个包含AutoNew(或AutoOpen)的模块,则执行该本地宏而不是Normal.dotm中的宏。
例子:
Normal.dotm 包含以下宏:
Sub AutoNew()
MsgBox "Normal.dotm"
End Sub
Test.dotm 包含以下宏:
Sub AutoNew()
MsgBox "Test.dotm"
End Sub
执行Test.dotm时会显示“Test.dotm”消息,而不会显示“Normal.dotm”消息。
如果将AutoNew 宏从Test.dotm 模板中删除,则确实会显示消息“Normal.dotm”。
因此,可以轻松覆盖自动宏。AutoNew 和 AutoOpen 的本地版本甚至可以是什么都不做的空子。它仍然有效。
在我的情况下这是不可能的,因为我使用的模板是由代码生成的,并且不能包含宏(因为以编程方式将宏添加到模板需要用户手动激活选项“信任对 VBA 项目对象模型的访问",这是我不能要求我的客户为所有用户做的事情。这也是一个安全风险。)
【问题讨论】:
-
注意:在这种情况下,我无法在 Normal.dotm 中编辑提到的
AutoNew宏。 -
如果您无法编辑并且必须使用用户的 Word 实例,那么,不,我认为没有任何办法解决这个问题。宏有什么问题?
-
好的,我希望在宏执行之前有一些事件,所以我可以阻止它。部分问题是这个宏修改了页眉和页脚,使得我的模板生成的文档看起来很不对。
-
@Gertsen,您的代码是否有某些原因无法删除有问题的页眉和页脚并将其替换为可接受的页眉和页脚?您还可以更改
AttachedTemplate以使将来的家务管理更容易。如果您理解这种可能性并提出您的问题只是为了使您的代码更高效,我们深表歉意,但是在处理 Word 对象模型时,删除内容并重建它通常是唯一的行动方案。 -
Gertsen,鉴于您发布的其他信息,可能有一种方法,因为您的项目是 .NET 而不是 VBA。您可以使用 Open XML SDK 创建模板——或者至少附加它的宏部分。这不会在用户环境中运行,因此用户设置不会影响它。如果这是一个选项,我可以在“答案”中写出更多细节......