Xml 关闭并重新打开带有自定义功能区的文档后,Word会话功能区会发生什么情况?

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);下面是一个基本示例 我使用自定义功能区关闭文档 我使用自定义功能区重新打开文档 在这一点上,自定义功能区有几个问题(没有

我在Office 365(Word 11929.20254)和Word 2016上的两个完全不同的Windows环境(家庭和工作)中,使用一系列使用VBA和customUI.xml显示自定义功能区的文档和模板,遇到了以下情况:

  • 我打开任何Word文档(现有文档或基于Normal.dotm的新空白文档)
  • 我打开另一个Word文档,它有一个自定义功能区(customUI.xml);下面是一个基本示例
  • 我使用自定义功能区关闭文档
  • 我使用自定义功能区重新打开文档
  • 在这一点上,自定义功能区有几个问题(没有发生VBA错误)。即使第二个文档功能区上的第一个选项卡属于自定义功能区(即位于“主页”选项卡之前),它也不会激活。onLoad回调不运行。只有通过单击“自定义功能区”选项卡才能解决此问题,此时该选项卡将启动(并在加载时运行),或者关闭所有Word文档并重新打开
  • 如果我在Excel或PowerPoint中使用电子表格或演示文稿文件运行上述情况,并使用与我在上述Word中使用的完全相同的自定义功能区,则步骤5不适用;功能区工作正常、加载运行正常等等

    为什么ribbon一词在某种程度上似乎有缺陷,而其他办公室的ribbon却没有?开发外接程序而不是VBA和customUI.xml是否可以解决或绕过此问题

    编辑:

    下面是自定义功能区和关联VBA的简单示例。将它们放在Word文档的customUI.xml和VBA中,并将其用作第二个Word文档,如步骤2至5所述

    将下面的功能区和VBA放入Excel电子表格,然后运行上面的步骤1到5,但使用Excel电子表格而不是Word文档除外。当达到第5步时,色带看起来很好,与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