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的新请求
这是一个承诺的简短教程:
安装自定义UI编辑器(CUIE)后,打开它然后单击文件| 打开并选择相关的Excel文件.在通过CUIE打开之前,请确保Excel文件已关闭.我使用全新的工作表作为示例.

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

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

我们来看看代码

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文件另存为启用宏的文件.现在,当您点击笑脸或太阳时,您将看到相关的消息框:

希望这可以帮助!
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子.
Jan*_*ckx 21
我疯了似的挣扎,但这实际上是正确的答案.对于它的价值,我错过的是:
顺便说一句,在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
小智 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中时,加载了自定义选项卡.按钮执行加入的代码,自定义选项卡卸载时我删除了添加.
除了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)
不要忘记保存并重新打开工作簿.希望这可以帮助!
当多个加载项尝试修改功能区时,我在使用 Roi-Kyi Bryant 的解决方案时遇到了困难。我的工作计算机也没有管理员访问权限,这排除了安装Custom UI Editor. 因此,如果您和我在同一条船上,这里有一个仅使用 Excel 自定义功能区的替代示例。请注意,我的解决方案源自Microsoft 指南。
.xlam文件Chart Tools.xlam和Priveleged UDFs.xlam,以演示多个加载项如何与功能区交互。customUI和_rels文件夹。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)
.zip为其文件名添加后缀 a 。就我而言,我改名Chart Tools.xlam来Chart Tools.xlam.zip,并Privelged UDFs.xlam到Priveleged UDFs.xlam.zip。.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)
.rels每个.zip文件中的.rels文件替换为您在上一步中修改的文件。.customUI您创建的文件夹复制并粘贴到.zip文件/文件的主目录中。.zip从您创建的 Excel 文件中删除文件扩展名。.xlam文件,请返回 Excel,将它们添加到您的 Excel 加载项中。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 部分定义了所有回调签名。
这是我完成的示例的样子
一些结束技巧
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 的方法部分提供了更多详细信息。isMSO关键字。Microsoft 指南中的两种自定义 Fluent UI 的方法部分提供了更多详细信息。