【问题标题】:Centralized VBA code for multiple Word files用于多个 Word 文件的集中式 VBA 代码
【发布时间】:2015-03-24 18:51:48
【问题描述】:

我有多个文件,其中包含相同的 VBA 代码,很可能需要随着时间的推移进行更改。我不想一个一个地去 c/p 代码,所以想到的一个明显的想法是有一个集中的文档,其中包含所有文件引用的代码(模板?)。

我在 stackoverflow 上找到了一些主题,但没有一个对我有用或没有定论:

Run external vba-code in MS Word

Centralized VBA code (one file) for multiple workbooks

Calling an External VBA from VBScript

有什么想法吗?

【问题讨论】:

    标签: vba ms-word


    【解决方案1】:

    是的,您将代码集中在一个模板中并将该模板附加到各种 Word 文档的想法会奏效。这些图片使用的是 Word 2007,但我认为新版本非常相似。首先新建一个文档,把代码放在一个Module中(图中名为“CommonFunctions”):

    将文档另存为启用宏的模板:

    现在创建一个新文档,将其保存为 *.docm(运行代码所必需的,因为 *.docx 是无宏的),然后附加文档模板,如下所示。 (另一种方法是将 *.dotm 文件放在启动目录 C:\Users\<username>\AppData\Roaming\Microsoft\Word\STARTUP 中,它会自动加载它。)如果你不把它放在 Startup 中,你会看到名称但不会加载(即,检查),但您可以在代码中加载它,我将展示。

    在这个文档中创建一个用户表单:

    将此代码用于按钮的单击事件:

    If AddIns("c:\_b\MasterDocWithFunctions.dotm").Installed = False Then
        AddIns("c:\_b\MasterDocWithFunctions.dotm").Installed = True
    End If
    
    Application.Run "CommonFunctions.Test1"
    Application.Run "CommonFunctions.Test2"
    

    请注意代码如何为您加载插件,因为除非您将其放在启动目录中,否则它不会自动加载。此图片显示了如何引用但未加载 AddIn。您需要该复选框才能调用其中的代码。如果您不使用代码加载它并且不将其放在 Startup 中,那么用户将不得不在每次文档打开时手动打勾。

    现在,当您单击按钮时,表单应该可以工作了。注意它是如何调用公共和私有函数的。 Private 关键字确实将一个模块与另一个模块隔离开来,但似乎从 AddIn 调用的模块被认为是同一模块的一部分,不知道为什么?另外,如果您根本不设置 Public 或 Private,那么 VBA 会认为它是 Public,我很确定。

    【讨论】:

    • 谢谢你,但我认为它在我的情况下不起作用......我所有的按钮和单选按钮宏都停止工作。在这种情况下,我需要做些不同的事情吗?
    • 所以你把代码和表单放在*.dotm 文件中,对吗?如果直接打开 *.dotm 文件呢?按钮是否起作用?只是尝试查看 *.dotm 文件是否损坏,或者当 *.dotm 文件附加到新文档并使用时是否有问题。
    • 不,也不在 dotm 中工作。如果重要的话,我将所有代码从“ThisDocument”剪切并粘贴到“Module1”。我不认为复制粘贴是正确的方法,因为它应该只保留在模块中,对吗?
    • 我也刚刚注意到,我可以像屏幕截图中显示的那样从宏窗口运行所有非私有宏。只是没有一个表单元素似乎会自动触发任何事情。
    • 那么模块和表单都是在各种word文档中逐字复制的?如果您使用其中一个 Word 文档并另存为 *.dotm 文件会怎样?从理论上讲,该表单应该仍然可以正常工作,因为它是单词 doc 的相同副本。如果没有,可能是安全设置阻止了代码。这些位于 Orb>Word 选项>信任中心>信任中心设置>宏设置下。表单元素是通过路径调用其他文件,还是通过数据库调用?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-06
    • 1970-01-01
    • 2013-05-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多