在Normal.dotm中为某些模板阻止Word宏

时间:2016-02-11 08:03:03

标签: vba ms-word vsto

我有一个包含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"确实显示了。

因此 可以轻松覆盖自动宏 AutoNewAutoOpen的本地版本甚至可以是无效的空子。它仍然有效。

在我的情况下这是不可能的,因为我使用的模板是由代码生成的,并且不能包含宏(因为以编程方式向模板添加宏需要用户手动激活选项"信任对VBA的访问权限项目对象模型",这是我无法让客户为所有用户做的事情。这也是一种安全风险。)

2 个答案:

答案 0 :(得分:1)

AutoNew宏中,您可以查看AttachedTemplate属性。只有当您要应用清洁的模板时,才能执行相应的宏。

Sub AutoNew()

    If ActiveDocument.AttachedTemplate <> "Normal.dotm" Then
        Exit Sub
    End If

    ' rest of the macro

End Sub

如果您不控制Normal.dotm,则可以在自己的模板中放置一个空的AutoNew宏。如Word only executes the auto macro in the closest context,Normal.dotm文件中的宏将不会被执行。

如果您不控制其他模板,则可以告诉用户在创建文档时按住SHIFT键。这可以防止执行自动宏。

但是,如果您要求其他系统的所有者找到另一个不依赖于污染Normal.dotm文件的解决方案,则可能是最好的。

答案 1 :(得分:1)

根据问题“编辑”部分中描述的解决方法 - 提供带有“空”自动宏的模板 - 可以使用Open XML SDK创建模板并按顺序添加VBA项目提供此功能。这种方法避免了用户在其安装时需要允许访问VBA项目。可以触发的唯一“宏安全性”是不允许宏运行。但是,既然客户端使用宏,无论如何,这不应该是一个主要的障碍。

最简单的方法是在Word UI中尽可能多地创建基本模板,并将其作为起点。

由于您不熟悉Open XML SDK,下一步是使用基本模板作为起点在Word UI中创建一个(或多个)模板,并以不同的文件名保存。

然后,您可以使用Open XML SDK Productivity Tool查看生成这些文件中的任何一个所需的代码,以及使用比较工具将基本模板转换为派生版本的代码。这应该为您提供一个体面的开始与SDK和它的对象模型。一旦您了解了Open XML SDK的工作原理,如果您熟悉Word的对象模型,那么使用SDK提供的内容相对简单,因为我们努力使其尽可能地与“ COM“对象模型。

可以稍后添加VBA项目,但您也可以将其包含在基本模板中。那将是最简单的方法。

将此“起点”基本模板作为解决方案的一部分包含在内,并将其作为解决方案的一部分进行安装。