CommandBars(“ Text”)。退出文档时未删除控件-VBA单词插件

时间:2018-06-24 19:29:50

标签: vba ms-word

我正在尝试使用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模块的宏中运行代码可以正常工作。

有帮助吗?

2 个答案:

答案 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()过程存在某些“问题”。但这现在还可以。

enter image description here