我正在尝试使用VBA为MS Word创建一个附加组件。 它有一个"AutoExec"过程,用于在命令栏("文本"(集合(右键单击菜单(中创建新项,以及删除此创建项的"自动退出"。 例如,我尝试了下面的代码,创建了一个项目"多少页?",它执行一个宏,显示活动文档中的页数。
这是自动执行代码:
Public Sub AutoExec()
Dim objcommandbutton As CommandBarButton
Call MsgBox("AutoExec")
Set objcommandbutton = Application.CommandBars("Text").Controls.Add _
(Type:=msoControlButton, Before:=1)
objcommandbutton.Caption = "How Many Pages?"
objcommandbutton.OnAction = "HowManyPages"
End Sub
这是自动退出代码:
Public Sub AutoExit()
Dim objcommandbutton As CommandBarControl
Call MsgBox("AutoExit")
For Each objcommandbutton In Application.CommandBars("Text").Controls
If objcommandbutton.Caption = "How Many Pages?" Then
objcommandbutton.Delete
End If
Next objcommandbutton
End Sub
这是主要的宏代码:
Public Sub HowManyPages()
If Documents.Count > 0 Then
Call MsgBox(ActiveDocument.BuiltInDocumentProperties("Number of Pages"))
Else
Call MsgBox("No document is currently active.")
End If
End Sub
退出文档时,不会删除以前在命令栏("文本"(集合中添加的按钮。当我打开一个新的空白Word文档并且按钮保留在右键单击菜单中时,我会看到这一点。
我知道例程已正确执行,因为有一个 MsgBox 指令来验证它。 这仅发生在加载项的 AutoExit 子例程中,即作为加载项加载:在使用 vba 模块的宏中运行代码可以正常工作。
有什么帮助吗?
在 Word 中使用 CommandBars 对象模型时,必须始终指定Application.CustomizationContext
。
Word 可以在不同位置保存键盘布局和命令栏自定义项:Normal.dotm 模板、当前模板或当前文档。创建命令栏添加时的默认值可能与尝试删除某些内容时的默认值不同 3。
由于这是一个加载项,因此我假设您希望对整个 Word 环境(任何打开的文档(进行更改。在这种情况下,请使用上下文NormalTemplate
。在调用命令栏之前使用以下命令:
Application.CustomizationContext = NormalTemplate
注: 用于在当前文档中保存自定义项:= ActiveDocument
;用于保存在附加到当前文档的模板中:= ActiveDocument.AttachedTemplate
。
我用解决方法解决了我的问题:
我试图将模板(.dotm("添加"为加载项(在"模板和加载项"窗口中(,以便在新文档中使用我的VBA项目。这就是我使用AutoExec()
和AutoExit()
程序的原因。 但直到现在我才发现,只需将 .dotm 模板"附加"到活动文档(在同一个"模板和加载项"窗口中,如下图所示(才能使函数Private Sub Document_Open()
并Private Sub Document_Close()
正常运行。这解决了我的问题。
即便如此,我认为在尝试更改命令栏时,AutoExit()
过程存在一定的"问题"。但现在没关系。
在此处输入图像描述