多个 Word 文件的集中 VBA 代码
Centralized VBA code for multiple Word files
我有多个文件,其中包含相同的 VBA 代码,很可能需要随着时间的推移进行更改。我不想一个一个地去 c/p 代码,所以想到的一个明显的想法是有一个集中的文档,其中包含所有文件都引用的代码(模板?)。
我在 Whosebug 上找到了一些主题,但是 none 对我有用或者没有定论:
Run external vba-code in MS Word
Centralized VBA code (one file) for multiple workbooks
Calling an External VBA from VBScript
有什么想法吗?
是的,您将代码集中在模板中并将该模板附加到各种 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"
注意代码如何为您加载加载项,因为除非您将它放在启动目录中,否则它不会自动加载。此图片显示了如何引用但未加载插件。您需要复选框才能调用其中的代码。如果您不使用代码加载它并且不将其放在启动中,则用户将不得不在每次打开文档时手动打勾。
现在,当您单击该按钮时,该表单应该可以工作了。注意它如何调用 public 和私有函数。 Private 关键字肯定将一个模块与另一个模块隔离开来,但似乎从 AddIn 调用的模块被认为是同一模块的一部分,不知道为什么?此外,如果您根本不输入 Public 或 Private,那么 VBA 会认为它 Public,我很确定。
我有多个文件,其中包含相同的 VBA 代码,很可能需要随着时间的推移进行更改。我不想一个一个地去 c/p 代码,所以想到的一个明显的想法是有一个集中的文档,其中包含所有文件都引用的代码(模板?)。
我在 Whosebug 上找到了一些主题,但是 none 对我有用或者没有定论:
Run external vba-code in MS Word
Centralized VBA code (one file) for multiple workbooks
Calling an External VBA from VBScript
有什么想法吗?
是的,您将代码集中在模板中并将该模板附加到各种 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"
注意代码如何为您加载加载项,因为除非您将它放在启动目录中,否则它不会自动加载。此图片显示了如何引用但未加载插件。您需要复选框才能调用其中的代码。如果您不使用代码加载它并且不将其放在启动中,则用户将不得不在每次打开文档时手动打勾。
现在,当您单击该按钮时,该表单应该可以工作了。注意它如何调用 public 和私有函数。 Private 关键字肯定将一个模块与另一个模块隔离开来,但似乎从 AddIn 调用的模块被认为是同一模块的一部分,不知道为什么?此外,如果您根本不输入 Public 或 Private,那么 VBA 会认为它 Public,我很确定。