如何使用VBA添加自定义功能区选项卡?

BuZ*_*uZz 94 excel vba excel-2007 ribbonx

我正在寻找一种在Excel功能区中添加自定义选项卡的方法,该选项卡带有几个按钮.我偶然发现了一些通过谷歌解决它的资源,但看起来都很狡猾,而且非常复杂.

什么是快速简单的方法呢?当我的VBA加载到Excel时,我想要加载新标签.

更新:我从这里尝试了这个例子,但在最后一条指令上得到了"需要对象"错误:

Public Sub AddHighlightRibbon()
Dim ribbonXml As String

ribbonXml = "<mso:customUI xmlns:mso=""http://schemas.microsoft.com/office/2009/07/customui"">"
ribbonXml = ribbonXml + "  <mso:ribbon>"
ribbonXml = ribbonXml + "    <mso:qat/>"
ribbonXml = ribbonXml + "    <mso:tabs>"
ribbonXml = ribbonXml + "      <mso:tab id=""highlightTab"" label=""Highlight"" insertBeforeQ=""mso:TabFormat"">"
ribbonXml = ribbonXml + "        <mso:group id=""testGroup"" label=""Test"" autoScale=""true"">"
ribbonXml = ribbonXml + "          <mso:button id=""highlightManualTasks"" label=""Toggle Manual Task Color"" "
ribbonXml = ribbonXml + "imageMso=""DiagramTargetInsertClassic"" onAction=""ToggleManualTasksColor""/>"
ribbonXml = ribbonXml + "        </mso:group>"
ribbonXml = ribbonXml + "      </mso:tab>"
ribbonXml = ribbonXml + "    </mso:tabs>"
ribbonXml = ribbonXml + "  </mso:ribbon>"
ribbonXml = ribbonXml + "</mso:customUI>"

ActiveProject.SetCustomUI (ribbonXml)
End Sub
Run Code Online (Sandbox Code Playgroud)

Sid*_*out 142

AFAIK您无法使用VBA Excel在Excel功能区中创建自定义选项卡.但是,您可以使用VBA隐藏/显示功能区组件.此外,您上面提到的链接适用于MS Project而不是MS Excel.

我使用这个名为Custom UI Editor的免费实用程序为我的Excel应用程序/加载项创建选项卡.


编辑:以适应OP的新请求

教程

这是一个承诺的简短教程:

  1. 安装自定义UI编辑器(CUIE)后,打开它然后单击文件| 打开并选择相关的Excel文件.在通过CUIE打开之前,请确保Excel文件已关闭.我使用全新的工作表作为示例.

    在此输入图像描述

  2. 右键单击如下图所示,然后单击"Office 2007自定义UI部件".它会插入"customUI.xml"

    在此输入图像描述

  3. 下一步单击菜单插入| 示例XML | 自定义标签.您会注意到基本代码是自动生成的.现在,您已准备好根据您的要求进行编辑.

    在此输入图像描述

  4. 我们来看看代码

    在此输入图像描述

    label="Custom Tab":将"自定义选项卡"替换为您要为选项卡指定的名称.暂时让我们称它为"杰罗姆".

    下面的部分添加了一个自定义按钮.

    <button id="customButton" label="Custom Button" imageMso="HappyFace" size="large" onAction="Callback" />
    
    Run Code Online (Sandbox Code Playgroud)

    imageMso:这是将在按钮上显示的图像."HappyFace"就是你现在所看到的.您可以在此处下载更多图像ID.

    onAction="Callback":"回调"是单击按钮时运行的过程的名称.

演示

有了它,让我们创建2个按钮,并将它们称为"JG按钮1"和"JG按钮2".让我们保持幸福的面孔作为第一个的形象,让我们保持第二个"太阳".修改后的代码现在看起来像这样:

<customUI xmlns="http://schemas.microsoft.com/office/2006/01/customui">
<ribbon startFromScratch="false">
<tabs>
<tab id="MyCustomTab" label="Jerome" insertAfterMso="TabView">
<group id="customGroup1" label="First Tab">
<button id="customButton1" label="JG Button 1" imageMso="HappyFace" size="large" onAction="Callback1" />
<button id="customButton2" label="JG Button 2" imageMso="PictureBrightnessGallery" size="large" onAction="Callback2" />
</group>
</tab>
</tabs>
</ribbon>
</customUI>
Run Code Online (Sandbox Code Playgroud)

删除在CUIE中生成的所有代码,然后粘贴上面的代码代替它.保存并关闭CUIE.现在,当您打开Excel文件时,它将如下所示:

在此输入图像描述

现在是代码部分.打开VBA编辑器,插入模块,然后粘贴此代码:

Public Sub Callback1(control As IRibbonControl)

    MsgBox "You pressed Happy Face"

End Sub

Public Sub Callback2(control As IRibbonControl)

    MsgBox "You pressed the Sun"

End Sub
Run Code Online (Sandbox Code Playgroud)

将Excel文件另存为启用宏的文件.现在,当您点击笑脸或太阳时,您将看到相关的消息框:

在此输入图像描述

希望这可以帮助!

  • 是的:)罗恩在他的网站上有很多例子.http://www.rondebruin.nl/ribbon.htm (6认同)
  • @SiddharthRout +1 - 我发现我不需要任何Excel书籍,只需按照你的帖子了解我需要在一天工作中学到的东西(今晚,这是Ribbon XML!):) (6认同)

Roi*_*ant 28

我能够在Excel 2013中使用VBA完成此任务.无需特殊编辑器.您只需要Visual Basic代码编辑器,可以在Developer选项卡上访问它.默认情况下,"开发人员"选项卡不可见,因此需要在"文件">"选项">"自定义功能区"中启用它 在"开发工具"选项卡上,单击"Visual Basic"按钮.代码编辑器将启动.右键单击左侧的Project Explorer窗格.单击插入菜单,然后选择模块.将以下两个子项添加到新模块中.

Sub LoadCustRibbon()

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

hFile = FreeFile
user = Environ("Username")
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>" & vbNewLine
ribbonXML = ribbonXML + "    <mso:qat/>" & vbNewLine
ribbonXML = ribbonXML + "    <mso:tabs>" & vbNewLine
ribbonXML = ribbonXML + "      <mso:tab id='reportTab' label='Reports' insertBeforeQ='mso:TabFormat'>" & vbNewLine
ribbonXML = ribbonXML + "        <mso:group id='reportGroup' label='Reports' autoScale='true'>" & vbNewLine
ribbonXML = ribbonXML + "          <mso:button id='runReport' label='PTO' "   & vbNewLine
ribbonXML = ribbonXML + "imageMso='AppointmentColor3'      onAction='GenReport'/>" & 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

Sub ClearCustRibbon()

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

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

ribbonXML = "<mso:customUI           xmlns:mso=""http://schemas.microsoft.com/office/2009/07/customui"">" & _
"<mso:ribbon></mso:ribbon></mso:customUI>"

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

End Sub
Run Code Online (Sandbox Code Playgroud)

在Wookbook中调用LoadCustRibbon sub打开,并在ThisWorkbook代码文件的Before_Close事件中调用ClearCustRibbon子.

  • 此代码将覆盖用户可能已经进行的所有当前功能区自定义。 (2认同)
  • @Roi-Kyi-Bryant 问题是添加自定义功能区项目,而不是覆盖整个当前自定义功能区。此代码覆盖当前功能区。 (2认同)

Jan*_*ckx 21

我疯了似的挣扎,但这实际上是正确的答案.对于它的价值,我错过的是:

  1. 正如其他人所说,无法使用VBA创建CustomUI功能区,但是,您不需要!
  2. 我们的想法是使用Excel的文件>选项>自定义功能区创建xml功能区代码,然后将功能区导出到.customUI文件(它只是一个txt文件,其中包含xml)
  3. 现在就是诀窍:你可以使用他们在这里引用的MS工具在.xlsm文件中包含 .customUI代码,方法是复制.customUI文件中的代码
  4. 一旦它被包含在.xlsm文件中,每次打开它时,您定义的功能区都会 添加到用户的功能区中 - 但请使用<ribbon startFromScratch ="false">或丢失功能区的其余部分.退出工作簿时,将删除功能区.
  5. 从这里开始很简单,创建功能区,从.customUI文件中复制特定于功能区的xml代码,并将其放在一个包装器中,如上所示(... <tabs>你的xml </ tabs .. .)

顺便说一句,在Ron的网站上解释它的页面现在是 http://www.rondebruin.nl/win/s2/win002.htm

以下是关于如何在功能区上启用/禁用按钮的示例 http://www.rondebruin.nl/win/s2/win013.htm

有关色带的其他xml示例,请参阅 http://msdn.microsoft.com/en-us/library/office/aa338202%28v=office.12%29.aspx

  • 在我看来,(5年后)仍然是最好的答案,也许OP @BuZz想刷新原来的帖子,至少指出这个答案(?)。我几乎找不到它,因为它位于相当长的答案列表的底部。 (2认同)

小智 17

这里的答案特定于使用自定义UI编辑器.我花了一些时间创建没有这个精彩程序的界面,所以我在这里记录解决方案,以帮助其他人决定他们是否需要自定义UI编辑器.

我遇到了以下微软帮助网页 - https://msdn.microsoft.com/en-us/library/office/ff861787.aspx.这显示了如何手动设置界面,但是在指向我的自定义加载项代码时遇到了一些麻烦.

要使按钮与您的自定义宏一起使用,请按照此SO答案中所述调用.xlam subs中的宏来调用 - 从功能区调用excel宏.基本上,您需要将"control As IRibbonControl"参数添加到从功能区xml指向的任何模块.此外,您的功能区xml应具有onAction ="myaddin!mymodule.mysub"语法,以正确调用add in加载的任何模块.

使用这些说明,我能够创建一个excel添加(.xlam文件),当我的VBA与加载一起加载到Excel中时,加载了自定义选项卡.按钮执行加入的代码,自定义选项卡卸载时我删除了添加.

  • 我曾经教过我的第二年编程学生这种方法,但最终发现如果你可以访问它,使用CustomUI工具就不那么复杂了. (2认同)

Eri*_*kas 8

除了Roi-Kyi Bryant的回答,此代码完全适用于Excel 2010.按ALT + F11并弹出VBA编辑器.双击ThisWorkbook左侧,然后粘贴此代码:

Private Sub Workbook_Activate()

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

hFile = FreeFile
user = Environ("Username")
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>" & vbNewLine
ribbonXML = ribbonXML + "    <mso:qat/>" & vbNewLine
ribbonXML = ribbonXML + "    <mso:tabs>" & vbNewLine
ribbonXML = ribbonXML + "      <mso:tab id='reportTab' label='My Actions' insertBeforeQ='mso:TabFormat'>" & vbNewLine
ribbonXML = ribbonXML + "        <mso:group id='reportGroup' label='Reports' autoScale='true'>" & vbNewLine
ribbonXML = ribbonXML + "          <mso:button id='runReport' label='Trim' " & vbNewLine
ribbonXML = ribbonXML + "imageMso='AppointmentColor3'      onAction='TrimSelection'/>" & 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

Private Sub Workbook_Deactivate()

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

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

ribbonXML = "<mso:customUI           xmlns:mso=""http://schemas.microsoft.com/office/2009/07/customui"">" & _
"<mso:ribbon></mso:ribbon></mso:customUI>"

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

End Sub
Run Code Online (Sandbox Code Playgroud)

不要忘记保存并重新打开工作簿.希望这可以帮助!


Jos*_*aly 8

多个加载项尝试修改功能区时,我在使用 Roi-Kyi Bryant 的解决方案时遇到了困难。我的工作计算机也没有管理员访问权限,这排除了安装Custom UI Editor. 因此,如果您和我在同一条船上,这里有一个仅使用 Excel 自定义功能区的替代示例。请注意,我的解决方案源自Microsoft 指南


  1. 创建要自定义其功能区的 Excel 文件。就我而言,我创建了两个.xlam文件Chart Tools.xlamPriveleged UDFs.xlam,以演示多个加载项如何与功能区交互。
  2. 为您刚刚创建的每个文件创建一个具有任意文件夹名称的文件夹。
  3. 在您创建的每个文件夹中,添加一个customUI_rels文件夹。
  4. 在每个customUI文件夹中,创建一个customUI.xml文件。该customUI.xml文件详细说明 Excel 文件如何与功能区交互。Microsoft 指南的第 2 部分涵盖了customUI.xml文件中的元素。

我的customUI.xml文件Chart Tools.xlam看起来像这样

<customUI xmlns="http://schemas.microsoft.com/office/2006/01/customui" xmlns:x="sao">
  <ribbon>
    <tabs>
      <tab idQ="x:chartToolsTab" label="Chart Tools">
        <group id="relativeChartMovementGroup" label="Relative Chart Movement" >
            <button id="moveChartWithRelativeLinksButton" label="Copy and Move" imageMso="ResultsPaneStartFindAndReplace" onAction="MoveChartWithRelativeLinksCallBack" visible="true" size="normal"/>
            <button id="moveChartToManySheetsWithRelativeLinksButton" label="Copy and Distribute" imageMso="OutlineDemoteToBodyText" onAction="MoveChartToManySheetsWithRelativeLinksCallBack" visible="true" size="normal"/>
        </group >
        <group id="chartDeletionGroup" label="Chart Deletion">
            <button id="deleteAllChartsInWorkbookSharingAnAddressButton" label="Delete Charts" imageMso="CancelRequest" onAction="DeleteAllChartsInWorkbookSharingAnAddressCallBack" visible="true" size="normal"/>
        </group>
      </tab>
    </tabs>
  </ribbon>
</customUI>
Run Code Online (Sandbox Code Playgroud)

我的customUI.xml文件Priveleged UDFs.xlam看起来像这样

<customUI xmlns="http://schemas.microsoft.com/office/2006/01/customui" xmlns:x="sao">
  <ribbon>
    <tabs>
      <tab idQ="x:privelgedUDFsTab" label="Privelged UDFs">
        <group id="privelgedUDFsGroup" label="Toggle" >
            <button id="initialisePrivelegedUDFsButton" label="Activate" imageMso="TagMarkComplete" onAction="InitialisePrivelegedUDFsCallBack" visible="true" size="normal"/>
            <button id="deInitialisePrivelegedUDFsButton" label="De-Activate" imageMso="CancelRequest" onAction="DeInitialisePrivelegedUDFsCallBack" visible="true" size="normal"/>
        </group >
      </tab>
    </tabs>
  </ribbon>
</customUI>
Run Code Online (Sandbox Code Playgroud)
  1. 对于您在步骤 1 中创建的每个文件,.zip为其文件名添加后缀 a 。就我而言,我改名Chart Tools.xlamChart Tools.xlam.zip,并Privelged UDFs.xlamPriveleged UDFs.xlam.zip
  2. 打开每个.zip文件,然后导航到_rels文件夹。将.rels文件复制到_rels您在步骤 3 中创建的文件夹。使用文本编辑器编辑每个 .rels文件。来自微软指南

在最后一个<Relationship>元素和结束 <Relationships>元素之间,添加一行以创建文档文件和自定义文件之间的关系。确保正确指定文件夹和文件名。

<Relationship Type="http://schemas.microsoft.com/office/2006/
  relationships/ui/extensibility" Target="/customUI/customUI.xml" 
  Id="customUIRelID" />
Run Code Online (Sandbox Code Playgroud)

我的.rels文件Chart Tools.xlam看起来像这样

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
    <Relationships xmlns="http://schemas.openxmlformats.org/package/2006/relationships">
        <Relationship Id="rId3" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/extended-properties" Target="docProps/app.xml"/><Relationship Id="rId2" Type="http://schemas.openxmlformats.org/package/2006/relationships/metadata/core-properties" Target="docProps/core.xml"/>
        <Relationship Id="rId1" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/officeDocument" Target="xl/workbook.xml"/>
        <Relationship Type="http://schemas.microsoft.com/office/2006/relationships/ui/extensibility" Target="/customUI/customUI.xml" Id="chartToolsCustomUIRel" />
    </Relationships>
Run Code Online (Sandbox Code Playgroud)

我的.rels文件Priveleged UDFs看起来像这样。

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
    <Relationships xmlns="http://schemas.openxmlformats.org/package/2006/relationships">
        <Relationship Id="rId3" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/extended-properties" Target="docProps/app.xml"/><Relationship Id="rId2" Type="http://schemas.openxmlformats.org/package/2006/relationships/metadata/core-properties" Target="docProps/core.xml"/>
        <Relationship Id="rId1" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/officeDocument" Target="xl/workbook.xml"/>
        <Relationship Type="http://schemas.microsoft.com/office/2006/relationships/ui/extensibility" Target="/customUI/customUI.xml" Id="privelegedUDFsCustomUIRel" />
    </Relationships>
Run Code Online (Sandbox Code Playgroud)
  1. .rels每个.zip文件中的.rels文件替换为您在上一步中修改的文件。
  2. .customUI您创建的文件夹复制并粘贴到.zip文件/文件的主目录中。
  3. .zip从您创建的 Excel 文件中删除文件扩展名
  4. 如果您已创建.xlam文件,请返回 Excel,将它们添加到您的 Excel 加载项中。
  5. 如果适用,请在每个加载项中创建回调。在第 4 步中,onAction我的按钮中有关键字。该onAction关键字指示,含元素被触发时,Excel应用程序将触发子例程后直接封装在引号onAction关键字。这称为回调。在我的.xlam文件中,我有一个名为的模块CallBacks,其中包含了我的回调子例程。

回调模块

我的CallBacks模块Chart Tools.xlam看起来像

Option Explicit

Public Sub MoveChartWithRelativeLinksCallBack(ByRef control As IRibbonControl)
  MoveChartWithRelativeLinks
End Sub

Public Sub MoveChartToManySheetsWithRelativeLinksCallBack(ByRef control As IRibbonControl)
  MoveChartToManySheetsWithRelativeLinks
End Sub

Public Sub DeleteAllChartsInWorkbookSharingAnAddressCallBack(ByRef control As IRibbonControl)
  DeleteAllChartsInWorkbookSharingAnAddress
End Sub
Run Code Online (Sandbox Code Playgroud)

我的CallBacks模块Priveleged UDFs.xlam看起来像

选项显式

Public Sub InitialisePrivelegedUDFsCallBack(ByRef control As IRibbonControl)
  ThisWorkbook.InitialisePrivelegedUDFs
End Sub

Public Sub DeInitialisePrivelegedUDFsCallBack(ByRef control As IRibbonControl)
  ThisWorkbook.DeInitialisePrivelegedUDFs
End Sub
Run Code Online (Sandbox Code Playgroud)

不同的元素有不同的回调子程序签名。对于按钮,所需的子程序参数为ByRef control As IRibbonControl。如果您不符合所需的回调签名,您将在编译 VBA 项目/项目时收到错误消息。Microsoft 指南的第 3 部分定义了所有回调签名。


这是我完成的示例的样子

完成的产品


一些结束技巧

  1. 如果您希望加载项共享功能区元素,请使用idQandxlmns:关键字。在我的示例中,Chart Tools.xlamandPriveleged UDFs.xlam都可以访问idQ's 等于x:chartToolsTaband的元素x:privelgedUDFsTab。对于这项工作,将x:是必需的,而且,我在我的第一行定义了它的命名空间customUI.xml的文件,<customUI xmlns="http://schemas.microsoft.com/office/2006/01/customui" xmlns:x="sao">Microsoft 指南中的两种自定义 Fluent UI 的方法部分提供了更多详细信息。
  2. 如果您希望加载项访问 Excel 附带的功能区元素,请使用isMSO关键字。Microsoft 指南中的两种自定义 Fluent UI 的方法部分提供了更多详细信息。