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

我正在寻找一种方法来添加一个自定义选项卡的Excelfunction区,将带有几个button。 我偶然发现了一些通过Google解决问题的资源,但都显得有些狡猾,而且非常复杂。

什么是快速简单的方法来做到这一点? 我希望当我的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 

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

我使用这个免费的实用工具(称为自定义UI编辑器)为我的Excel应用程序/加载项创build选项卡


编辑:适应OP的新的请求

教程

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

  1. 安装自定义用户界面编辑器(CUIE)后,打开它,然后单击文件| 打开并select相关的Excel文件。 请确保Excel文件在通过CUIE打开之前已closures。 我正在使用一个全新的工作表作为例子。

    在这里输入图像描述

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

    在这里输入图像描述

  3. 下一步点击菜单插入| 示例XML | 自定义标签。 您会注意到基本代码是自动生成的。 现在你已经开始按照你的要求编辑了。

    在这里输入图像描述

  4. 让我们来看看代码

    在这里输入图像描述

    label="Custom Tab" :将“自label="Custom Tab"replace为您要给选项卡的名称。 目前我们称之为“杰罗姆”。

    下面的部分添加一个自定义button。

     <button id="customButton" label="Custom Button" imageMso="HappyFace" size="large" onAction="Callback" /> 

    imageMso :这是将显示在button上的图像。 “HappyFace”就是你目前所看到的。 你可以在这里下载更多的图片ID 。

    onAction="Callback" :“callback”是单击button时运行的过程的名称。

演示

这样,我们创build2个button,并将它们称为“JGbutton1”和“JGbutton2”。 让我们保持幸福的脸,作为第一个的形象,让我们保持第二个“太阳”。 修改后的代码如下所示:

 <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> 

删除所有在CUIE中生成的代码,然后粘贴上面的代码来代替。 保存并closuresCUIE。 现在,当您打开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 

将Excel文件保存为启用macros的文件。 现在当你点击笑脸或太阳时,你会看到相关的消息框:

在这里输入图像描述

希望这可以帮助!

我可以在Excel 2013中使用VBA来完成此任务。不需要特殊的编辑器。 所有你需要的是可以在Developer选项卡上访问的Visual Basic代码编辑器。 “开发人员”选项卡默认不可见,所以需要在“文件”>“选项”>“自定义function区”中启用。 在开发工具栏上,单击Visual Basicbutton。 代码编辑器将启动。 右键单击左侧的“项目浏览器”窗格。 点击插入菜单并select模块。 将这两个subs添加到新模块。

 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 

调用Wookbook中的LoadCustRibbon子项打开,并调用ThisWorkbook代码文件的Before_Close事件中的ClearCustRibbon子项。

我疯狂地挣扎着,但这实际上是正确的答案。 为了什么是值得的,我错过的是这样的:

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

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

这里是他如何启用/禁用function区上的button的例子http://www.rondebruin.nl/win/s2/win013.htm

有关function区的其他xml示例,请参阅http://msdn.microsoft.com/zh-CN/library/office/aa338202%28v=office.12%29.aspx

这里的答案是特定于使用自定义用户界面编辑器。 我花了一些时间创build界面,没有这个美妙的程序,所以我在这里logging解决scheme,以帮助其他人决定是否需要自定义用户界面编辑器。

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

为了使button与你的自定义macros一起工作,在你的.xlam子目录中设置这个macros,就像在这个答案中所描述的那样调用 – 从function区调用一个excelmacros 。 基本上,您需要将“控制为IRibbonControl”参数添加到您的function区xml指向的任何模块。 此外,您的function区xml应具有onAction =“myaddin!mymodule.mysub”语法,以正确调用通过加载加载的任何模块。

使用这些说明,我可以在(.xlam文件)中创build一个Excel加载项,当我的VBA与加载项一起加载到Excel中时,加载了一个自定义选项卡。button执行添加代码,自定义选项卡卸载时我删除了添加。

除了Roi-Kyi Bryant的回答,这个代码在Excel 2010中完全可用。按ALT + F11,VBA编辑器将popup。 双击左侧的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 

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