vba - 在更改 VBA 代码之前不会触发 Word 中的 Document_open 宏(无关紧要)
问题描述
我有一个带有 Document_Open-sub 的 .docm 文件,它调用另一个 sub 来打开一个小用户窗体 - 或者它应该触发并打开 - 但它没有......
如果我对文档进行更改并保存它 - 它仍然不起作用。
如果我对同一文档中的 VBA 代码进行重大更改(例如在子外部添加空格字符)并保存它 - 它会突然起作用。
为什么它不能一直工作?- 我可以改变什么来使它工作?
附加信息(我不知道其中一些是否相关)
- 在大多数情况下,文档是从内部网站下载并保存在本地的。
- 我们测试过的文档在本地保存在 Word 中受信任的位置。
- 在某些情况下 - sub 没有自动触发 - sub 可以使用 ALT+F8 运行(但这不是我想要的)。
- 该功能适用于某些用户 - 而不适用于其他用户。
- Document_Open-sub 中的功能取决于在 CustomDocumentProperties 中读取的值。
系统:Win10 - Word MSO365 build 2110
编辑 - 添加代码:
Public Sub Subrutine1()
ThisDocument.CustomDocumentProperties("prop1").Value = " " 'resetting prop1
UserForm1.Show 'prop1 is set from the userform
End Sub
Private Sub Document_Open()
If ThisDocument.CustomDocumentProperties("prop1").Value = " " Then
Call Subrutine1
End If
End Sub
解决方案
您可以将您的子“Subrutine1”重命名为“AutoOpen”。
我会推荐以下代码。
Private Sub AutoOpen()
Dim myForm As UserForm1
Set myForm = New UserForm1
myForm.Show
Unload myForm
Set myForm = Nothing
End Sub
- 我建议将文档属性重置为用户表单初始化的一部分,除非您有时在不重置的情况下使用它。
- 我建议使用文档变量而不是文档属性。
- 我怀疑使用文档模板而不是文档会更好。在这种情况下,宏将被命名为“AutoNew”。
推荐阅读
- c# - 无法从 asp.net core mvc 中的数据库更新我的模型
- c++ - 如何在 C++ 中的队列结构中使用 malloc
- kepserverex - 是否可以在 KepServerEx 中创建自定义模拟函数?
- c++ - 如何正确地将 int 类型的算术运算结果存储为 C++ 中的 double 类型和不同类型?
- c# - 是否有可能知道哪个 .dll 称为 C# 服务?即使调用首先通过 COM 层?
- json - 使用 NiFi 将 JSON 转换为 SQL 并在 DB2 中插入数据
- rust - 如何在 Rust 中使用非常量初始化程序初始化不可变的全局变量?
- azure - Azure RBAC 中的多个通配符
- c# - C# 严格检查一个字符串中的所有字符是否存在于另一个字符串中(无 LINQ)
- laravel - 从 laravel 中的另一个函数返回查看