【问题标题】:How to preserve user's CustomUI Ribbon in Excel using VBA or XML如何使用 VBA 或 XML 在 Excel 中保留用户的 CustomUI 功能区
【发布时间】:2020-07-01 15:23:37
【问题描述】:

我有一个带有许多小子的 Excel 加载项,它在初始化时会在功能区上创建一个自定义选项卡来控制这些子。我使用带有 XML 代码的 VBA 字符串来修改功能区(参见下面的代码)。

插件旨在与许多用户共享,其中大多数用户已经进行了一些自定义。问题是,加载项会删除用户可能在其 Excel 功能区上拥有的任何自定义设置,无论是选项卡、按钮还是快捷方式。

我已经玩了几天这个问题,但无法找到解决方案。我需要它来将自定义选项卡添加到已经存在的功能区,而不是覆盖它。

为加载项控件创建自定义选项卡的部分子如下

Sub CreateRibbon()

'create a custom ribbon menu'

Dim hFile As Long
Dim path As String, fileName As String, ribbonXML As String

    hFile = FreeFile
    
    path = "C:\Users\" & user & "\AppData\Local\Microsoft\Office\"
    fileName = "Excel.officeUI"
    
    ribbonXML = "<mso:customUI      xmlns:mso='http://schemas.microsoft.com/office/2009/07/customui'>" & vbNewLine
    ribbonXML = ribbonXML + "  <mso:ribbon startFromScratch='false'>" & vbNewLine
    ribbonXML = ribbonXML + "    <mso:qat/>" & vbNewLine
    ribbonXML = ribbonXML + "    <mso:tabs>" & vbNewLine
                'tab'
    ribbonXML = ribbonXML + "      <mso:tab id='MicroHelpers' label='Helpers' insertBeforeQ='mso:TabFormat'>" & vbNewLine
                'group'
                
        ribbonXML = ribbonXML + "        <mso:group id='MassFormulas' label='Mass Formula' autoScale='true'>" & vbNewLine
            
            ribbonXML = ribbonXML + AddButtonXML("TextToNum", "WordCount", "Text To Num")
            
        ribbonXML = ribbonXML + "        </mso:group>" & vbNewLine

                .....

        ribbonXML = ribbonXML + "        </mso:group>" & vbNewLine
    ribbonXML = ribbonXML + "      </mso:tab>" & vbNewLine
    ribbonXML = ribbonXML + "    </mso:tabs>" & vbNewLine
    ribbonXML = ribbonXML + "  </mso:ribbon>" & vbNewLine
    ribbonXML = ribbonXML + "</mso:customUI>"
    
    ribbonXML = Replace(ribbonXML, """", "")
    
    Open path & fileName For Output Access Write As hFile
    Print #hFile, ribbonXML
    Close hFile

end sub

我会很感激你的指导

【问题讨论】:

  • 为什么不直接使用加载项的 CustomUI 部分?
  • 这里有很多讨论:stackoverflow.com/questions/8850836/… 事情似乎是,如果您在运行时添加自定义 UI,您需要稍后将其删除,但不仅仅是完全清除用户自定义 UI,而是通过将其恢复到原始状态。这不是一件简单的事情(如果另一个加载项在加载您的加载项后对其进行了修改怎么办?)因此使用 customIUEditor 工具是“最佳”方法。
  • @Rory,你是什么意思?
  • @TimWilliams,使用编辑器确实是最简单的方法,但不幸的是,由于我公司的政策,我不能使用任何其他软件。另外,我没有完全理解您消息的删除部分。我不需要在 WorkBook 关闭时清除功能区,该选项卡应该始终存在。这就像一次性激活的东西,意味着安装一次并每天使用。
  • 我假设您在关闭加载项时正在删除自定义 xml。仅供参考,您不需要 CustomUI 编辑器 - 都可以通过其他方式完成,例如:stackoverflow.com/questions/20772723/…

标签: excel xml vba ribbon


【解决方案1】:

对于所有遭受此痛苦的人,我也一样。我想通了。

问题是,当最终用户尝试安装插件时,它会覆盖他的功能区自定义,删除所有内容并仅显示我的代码。结果发现解决方案非常简单:

在创建新标签之前,我已经从 Excel.officeUI 文件中提取了 XML 代码,并将我的代码嵌入到现有的标签中

hFile = FreeFile
user = Environ("Username")
path = "C:\Users\" & user & "\AppData\Local\Microsoft\Office\"

Open path & fileName For Input Access Read As hFile
bubble_local = Input(LOF(hFile), hFile)
Close hFile

'main macro part'

Open path & fileName For Output Access Write As hFile
Print #hFile, ribbonXML
Close hFile

这样可以保留用户的自定义。我不知道为什么花了这么长时间,但对我来说这并不明显。我希望它能帮助你们中的一些人摆脱困境

顺便说一句,由于使用 Excel.officeUI,我发现刷新功能区的唯一方法是重新加载 Excel

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-21
    • 2018-09-18
    • 2013-09-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多