我正在尝试使用VBA为MS Word创建一个加载项。 它具有一个“ AutoExec”过程,该过程在CommandBar(“ Text”)集合(右键菜单)中创建一个新项目,而“ AutoExit”则删除此创建的项目。 作为示例,我尝试了下面的代码,该代码创建了一个项目“多少页?”,该项目执行一个宏,该宏显示活动文档中的页面数。
这是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
退出文档时,不会删除先前添加在CommandBars(“ Text”)集合中的Button。当我打开一个新的空白Word文档并且该按钮保留在右键单击菜单中时,我会看到此消息。
我知道例程可以正确执行,因为有一条MsgBox指令可以对其进行验证。 这仅在加载项的AutoExit子例程中发生,即作为加载项加载:在带有vba模块的宏中运行代码可以正常工作。
有帮助吗?
答案 0 :(得分:0)
在Word中使用CommandBars对象模型时,必须始终指定Application.CustomizationContext
。
Word可以在不同位置保存键盘布局和CommandBar自定义设置:Normal.dotm模板,当前模板或当前文档。创建CommandBar添加项时的默认设置可能与尝试删除某些内容时的默认设置不同。
由于这是一个外接程序,因此我假设您要更改整个Word环境(任何打开的文档)。在这种情况下,请使用上下文NormalTemplate
。在调用CommandBar之前使用此命令:
Application.CustomizationContext = NormalTemplate
注意:用于将自定义保存在当前文档中:= ActiveDocument
;用于保存在附加到当前文档的模板中:= ActiveDocument.AttachedTemplate
。
答案 1 :(得分:0)
我通过一种解决方法解决了我的问题:
我试图“添加”模板(.dotm)作为加载项(在“模板和加载项”窗口中),以便在新文档中使用我的VBA项目。这就是为什么我使用AutoExec()
和AutoExit()
过程。
但是直到现在,我才知道,只需将.dotm模板“附加”到活动文档(在同一“模板和加载项”窗口中,如下图所示)就可以创建功能Private Sub Document_Open()
和{{ 1}}正常运行。解决了我的问题。
即使如此,我认为在尝试更改CommandBars itens时,Private Sub Document_Close()
过程存在某些“问题”。但这现在还可以。