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

114

我正在寻找一种方法来添加自定义选项卡到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

请确认您正在使用哪个版本的Excel? - Siddharth Rout
那是为项目而设的。 - Nathan_Sav
8个回答

159
据我所知,您无法使用VBA Excel创建Excel功能区中的自定义选项卡。但是,您可以使用VBA隐藏/显示功能区组件。另外,您提到的链接适用于MS Project而不是MS Excel。
我使用这个免费工具Custom UI Editor为我的Excel应用程序/插件创建选项卡。

编辑:为了满足OP的新要求

教程

以下是承诺的简短教程:

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

enter image description here

  1. 右键单击如下图所示,并单击“Office 2007自定义UI部件”。它将插入“customUI.xml”

enter image description here

  1. 接下来点击菜单插入 | 示例 XML | 自定义选项卡。您会注意到基本代码已经自动生成。现在您可以根据需要进行编辑。

enter image description here

  1. 让我们检查代码

enter image description here

label="自定义选项卡": 用你想要的名称替换“自定义选项卡”。现在,我们先称其为“Jerome”。

以下部分添加了一个自定义按钮。

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

`imageMso`: This is the image that will display on the button. "HappyFace" is what you will see at the moment. [You can download more image ID's here](https://www.dropbox.com/s/8mvexoalel6icix/Office2007IconsGallery.EXE?dl=0).

`onAction="Callback"`: "Callback" is the name of the procedure which runs when you click on the button.

演示

有了这个,让我们创建两个按钮,分别称为“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>

删除在CUIE中生成的所有代码,然后将上述代码粘贴替换。保存并关闭CUIE。现在打开Excel文件,它将看起来像这样:

enter image description here

现在是代码部分。打开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文件另存为启用宏的文件。现在当您单击笑脸或太阳图标时,将会看到相关的消息框:

enter image description here


7
好的 :) Ron的网站上有很多实例。http://www.rondebruin.nl/ribbon.htm - Siddharth Rout
1
你想创建一个新的选项卡吗?如果是,请提供更多细节,我会给你XML代码 :) - Siddharth Rout
1
给我20分钟。将上面的帖子更新为相关代码和快照 :) - Siddharth Rout
7
@SiddharthRout +1 - 我发现我不需要任何Excel书籍,只需跟随您的帖子学习一天的工作所需(今晚是功能区XML!):) - Our Man in Bananas
1
我建议您创建一个新的问题,包括您的基本XML代码和VBA代码,然后我们可以从那里开始讨论。@YasserKhalil - Siddharth Rout
显示剩余20条评论

36

我能够在Excel 2013中使用VBA完成此操作,不需要特殊的编辑器。你只需要访问开发者选项卡中的Visual Basic代码编辑器即可。默认情况下,开发者选项卡是不可见的,因此需要在“文件” >“选项” >“自定义功能区”中启用它。在开发者选项卡上,单击“Visual Basic”按钮。代码编辑器将启动。在左侧的“项目资源管理器”窗格中右键单击,单击插入菜单,然后选择模块。将下面的两个子程序添加到新模块中。

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

在工作簿打开事件中调用LoadCustRibbon子程序,然后在ThisWorkbook代码文件的Before_Close事件中调用ClearCustRibbon子程序。


这对我有用,但只遇到了一些小问题。1)如果我保留Before_Close事件,则新的功能区不会加载。2)当我通过删除Before_Close事件成功使功能区工作时,我必须重新加载Excel才能看到它。如果您能告诉我为什么会发生这种情况,那就太好了! - Petay87
代码完全一样吗?你能发一下吗?这个想法是Excel在加载菜单之前修改标准菜单文件,然后在工作簿关闭之前重置它。重置菜单是必要的,这样它就不会显示在其他工作簿中。 - Roi-Kyi Bryant
4
这段代码将覆盖用户已经进行的所有功能区自定义设置。 - WizzleWuzzle
1
@WizzleWuzzle 不一定需要这样做。可以将功能区导入并解析为一个对象,然后遍历该对象。然后可以向该对象添加新元素。最终结果可以保存到文件中。问题是如何创建自定义功能区,而不是如何修改现有的功能区。 - Roi-Kyi Bryant
2
@Roi-Kyi-Bryant 这个问题是要添加一个自定义的功能区项,而不是覆盖整个当前的自定义功能区。这段代码会覆盖当前的功能区。 - WizzleWuzzle
显示剩余6条评论

29

我非常努力地尝试了很久,但这实际上是正确的答案。值得一提的是,我错过的是:

  1. 正如其他人所说,你不能使用VBA创建CustomUI功能区,然而,你不需要这样做!
  2. 你的想法应该是在Excel的“文件”>“选项”>“自定义功能区”中创建xml功能区代码,然后将功能区导出到一个.customUI文件中(这只是一个带有xml文件的txt文件)
  3. 现在来了个诀窍:你可以使用MS工具,通过复制.customUI文件中的代码,在.xlsm文件中包含.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


4
在我看来,这仍然是最好的答案,可能发布者@BuZz想要更新原始帖子,至少指向这个答案吧?我很难找到它,因为它被埋在一个相当长的答案列表底部。 - Chri.s

22

这里的答案是针对使用自定义UI编辑器的。我花了一些时间创建界面,未使用该编辑器,因此在此记录解决方案,以帮助任何其他人决定是否需要自定义UI编辑器。

我发现了以下Microsoft帮助网页-https://msdn.microsoft.com/en-us/library/office/ff861787.aspx。这显示了如何手动设置接口,但是当指向我的自定义插件代码时遇到了一些问题。

要使按钮与您的自定义宏配合工作,请按照此SO答案中描述的方式设置.xlam子文件夹中的宏-Calling an excel macro from the ribbon。基本上,您需要将“control As IRibbonControl”参数添加到从您的Ribbon xml指向的任何模块中。此外,您的Ribbon xml应具有onAction =“myaddin!mymodule.mysub”的语法,以正确调用由插件加载的任何模块。

使用这些说明,我能够创建一个Excel插件(.xlam文件),当我的VBA与插件一起加载到Excel中时,会加载一个自定义选项卡。按钮执行来自插件的代码,并且在删除插件时自定义选项卡将被卸载。


1
这对于我们这些没有所有开发工具的人来说非常有效。感谢这个“简单”的解决方案。 - Evan
2
我曾经教过我的二年级编程学生这种方法,但最终发现如果您可以访问它,使用CustomUI工具会更简单。 - Rick Henderson

10

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

别忘了保存并重新打开工作簿。希望这有所帮助!


你要怎样传递参数?我一直在使用这个,但找不到传递参数的方法。 - jDave1984
使用我的答案,您将向每个子例程添加参数列表,例如LoadCustomRibbon(tabName as String,groupName as String,btnName as String)。然后按照@Erikas指出的适当位置调用这些子例程。 - Roi-Kyi Bryant
此解决方案在 Microsoft 365 Excel 中可直接使用。+1 @erikas - user10186832

9
我在使用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指南的第二部分介绍了customUI.xml文件中的元素。

我的Chart Tools.xlamcustomUI.xml文件如下:

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

我为Priveleged UDFs.xlam准备的customUI.xml文件如下所示:

<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>
  1. 对于你在步骤1中创建的每个文件,将.zip作为它们的文件名后缀。例如,在我的情况下,我把Chart Tools.xlam重命名为Chart Tools.xlam.zip,并把Privelged UDFs.xlam重命名为Priveleged UDFs.xlam.zip
  2. 打开每个.zip文件,并导航到_rels文件夹。将.rels文件复制到步骤3中创建的_rels文件夹中。使用文本编辑器编辑每个.rels文件。从Microsoft指南中获取以下信息:

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

<Relationship Type="http://schemas.microsoft.com/office/2006/
  relationships/ui/extensibility" Target="/customUI/customUI.xml" 
  Id="customUIRelID" />

我的Chart Tools.xlam.rels文件如下所示

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

我用于特权UDFs.rels文件如下所示。

<?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>
  1. 将每个.zip文件中的.rels文件替换为您在上一步中修改的.rels文件/文件。
  2. 将您创建的.customUI文件夹复制并粘贴到.zip文件/文件的主目录中。
  3. 从您创建的Excel文件中删除.zip文件扩展名
  4. 如果您创建了.xlam文件,请返回Excel,将它们添加到您的Excel加载项中。
  5. 如适用,在每个加载项中创建回调函数。在第4步中,我的按钮中有onAction关键字。 onAction关键字表示,当触发包含元素时,Excel应用程序将直接在引号后触发封装在onAction关键字之后的子例程。这被称为回调函数。在我的.xlam文件中,我有一个名为CallBacks的模块,其中包含我的回调子例程。

CallBacks Module

我的Chart Tools.xlamCallBacks模块如下所示:

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

我的CallBacks模块针对Priveleged UDFs.xlam看起来像这样:

Option Explicit

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

Public Sub DeInitialisePrivelegedUDFsCallBack(ByRef control As IRibbonControl)
  ThisWorkbook.DeInitialisePrivelegedUDFs
End Sub

不同的元素有不同的回调子例程签名。对于按钮,所需的子例程参数是ByRef control As IRibbonControl。如果不符合所需的回调签名,则在编译VBA项目/项目时会收到错误提示。Microsoft指南的第3部分定义了所有回调签名。
这是我的完成示例的样子

Finished Product


一些结尾提示
  1. 如果您想让插件共享功能区元素,请使用idQxlmns:关键字。在我的示例中,Chart Tools.xlamPriveleged UDFs.xlam都可以访问具有等于x:chartToolsTabx:privelgedUDFsTabidQ的元素。为使此工作正常,需要x:,并且我已在customUI.xml文件的第一行中定义了它的命名空间,<customUI xmlns="http://schemas.microsoft.com/office/2006/01/customui" xmlns:x="sao">。在Microsoft指南自定义流畅UI的两种方法部分提供了更多详细信息。
  2. 如果您想让插件访问Excel附带的功能区元素,请使用isMSO关键字。在Microsoft指南自定义流畅UI的两种方法部分提供了更多详细信息。

3
另一种方法是从此页面下载Jan Karel Pieterse的免费Open XML类模块:使用VBA编辑OpenXML文件中的元素。将其添加到您的VBA项目后,您可以解压缩Excel文件,使用VBA修改XML,然后使用该类重新压缩文件。

我很高兴能够看到这个帖子的底部。这正是我在寻找的!谢谢,约翰 :-) - scott_f

2

这是一个简单的解决方案,适用于Excel 365。

首先将此代码输入到一个空白工作簿中。

Option Explicit

Sub sbHelloWorld()
 MsgBox "Hello World!"
End Sub

这是一个基本自定义功能区的XML代码。我使用记事本将此XML粘贴到名为“rb_HelloWorld.txt”的文件中,然后保存并复制到文件夹 - “C:\ Users \ david \ AppData \ Local \ Microsoft \ Office”中。这个文件夹一开始是隐藏的,所以需要将其取消隐藏。

<mso:customUI      xmlns:mso='http://schemas.microsoft.com/office/2009/07/customui'>
    <mso:ribbon>
        <mso:qat/>
        <mso:tabs>
        <mso:tab idQ="mso:TabDrawInk" visible="false"/>
        <mso:tab id="mso_c1.2A492F1" label="New Tab">
            <mso:group id="mso_c2.2A492F1" label="New Group" autoScale="true">
                <mso:button id="sbHelloWorld" label="sbHelloWorld" imageMso="ListMacros" onAction="sbHelloWorld" visible="true"/>
            </mso:group>
        </mso:tab>
        </mso:tabs>
    </mso:ribbon>
</mso:customUI>

以下是两个用于将新的功能区复制到指定位置并在工作簿退出时删除它的程序。

Sub sbCopyFile()
 Dim sOfficeUIDir As String
 Dim sHWFile As String
 Dim sUIFile As String
 Dim sTest As String
 sOfficeUIDir = "C:\Users\david\AppData\Local\Microsoft\Office\"
 sHWFile = sOfficeUIDir & "rb_HelloWorld.txt"
 sUIFile = sOfficeUIDir & "Excel.officeUI"
 sTest = Dir(sHWFile)
 If Not sTest = "" Then
  FileCopy sHWFile, sUIFile
 End If
End Sub



Sub sbDeleteFile()
 Dim sOfficeUIDir As String
 Dim sUIFile As String
 Dim sTest As String
 sOfficeUIDir = "C:\Users\david\AppData\Local\Microsoft\Office\"
 sUIFile = sOfficeUIDir & "Excel.officeUI"
 sTest = Dir(sUIFile)
 If Not sTest = "" Then
  Kill (sUIFile)
 End If
End Sub

使用内置程序Workbook_Activate和Workbook_Deactivate,可以添加和删除自定义功能区。

Private Sub Workbook_Activate()
 Call sbCopyFile
End Sub

Private Sub Workbook_Deactivate()
 Call sbDeleteFile
End Sub

从自定义功能区的按钮调用例程sbHelloWorld()。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接