Xml 关闭并重新打开带有自定义功能区的文档后,Word会话功能区会发生什么情况?
我在Office 365(Word 11929.20254)和Word 2016上的两个完全不同的Windows环境(家庭和工作)中,使用一系列使用VBA和customUI.xml显示自定义功能区的文档和模板,遇到了以下情况:Xml 关闭并重新打开带有自定义功能区的文档后,Word会话功能区会发生什么情况?,xml,vba,ms-word,ribbonx,Xml,Vba,Ms Word,Ribbonx,我在Office 365(Word 11929.20254)和Word 2016上的两个完全不同的Windows环境(家庭和工作)中,使用一系列使用VBA和customUI.xml显示自定义功能区的文档和模板,遇到了以下情况: 我打开任何Word文档(现有文档或基于Normal.dotm的新空白文档) 我打开另一个Word文档,它有一个自定义功能区(customUI.xml);下面是一个基本示例 我使用自定义功能区关闭文档 我使用自定义功能区重新打开文档 在这一点上,自定义功能区有几个问题(没有
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<customUI xmlns="http://schemas.microsoft.com/office/2006/01/customui" onLoad="modRibbon.CustomUI_OnLoad">
<ribbon>
<tabs>
<tab id="tabCustom" label="Custom" insertBeforeMso="TabHome">
<group id="grpCustom1" imageMso="EditDocument" label="Custom group 1">
<button id="btnA" size="large" label="Aa" imageMso="EditDocument" onAction="modRibbon.btn1A_OnAction" screentip="Aa" supertip="A button."/>
</group>
<group id="grpCustom2" imageMso="EditBusinessCard" label="Custom group 2">
<button id="btnB" size="large" label="Bb" imageMso="EditBusinessCard" onAction="modRibbon.btn2B_OnAction" screentip="Bb" supertip="Another button."/>
</group>
</tab>
</tabs>
</ribbon>
</customUI>
我已经提出了一个解决方案,到目前为止,它非常可靠,通过在
本文档中添加以下内容
:
Private Sub Document_Open()
Application.OnTime Now, "modRibbon.ReloadRibbon"
End Sub
并将以下内容添加到modRibbon VBA模块(在OP中):
此解决方案:
- 修复了我在OP中概述的问题;因为
- 它允许用户通过VBA随心所欲地重新加载功能区;及
- 以这种方式重新加载功能区后,回调将继续正常工作
- 当删除虚拟条时,而不是添加虚拟条时,修复生效李>
- 仅将
李>块粘贴在
中是不够的<必须使用code>OnTime文档的
回调在功能区重新加载时运行,与打开文档时完全相同OnLoad
- 仅将
命令栏
,特别是.Delete
方法有一些特别之处,它将ribbon(回到)生活中,这有点讽刺意味,因为ribbon应该是命令栏
,而不是依赖它们才能正常运行
旁注:这还可以提供一种更简单的方法,在功能区指针丢失时恢复功能区,当VBA在执行功能区方法时遇到错误时,这种情况非常常见。A(也适用于Word)涉及将指针存储在某个位置(如
ThisDocument.Variables
),然后通过CopyMemory
将其还原。上述解决方案可以简单地重新创建功能区,从而避免任何此类错误。您需要提供一个新的解决方案,以便人们可以测试该场景。如果没有这些,就不可能提供任何答案…@Cindymister我在OP中添加了一个基本自定义ribbon及其各自的VBA(仅包含ribbon回调)的最小示例。步骤1中提到的文档可以是任何Word文档,包括新的空白文档。我相信这就是我所概述的五个步骤中重现场景所需的全部内容。
Private Sub Document_Open()
Application.OnTime Now, "modRibbon.ReloadRibbon"
End Sub
Sub ReloadRibbon()
With Application.CommandBars
.Add "barRibbonRefresher", msoBarTop, False, True 'Adds a dummy bar
.Item("barRibbonRefresher").Delete 'Deletes the dummy bar above, which appears to force the custom UI, including the custom ribbon, to (re)load
End With
End Sub