Я столкнулся с трудностями с решением Roi-Kyi Bryant, когда несколько надстроек пытались изменить ленту. У меня также нет прав администратора на моем рабочем компьютере, что исключает установку Custom UI Editor. Итак, если вы находитесь в одной лодке со мной, вот альтернативный пример настройки ленты с использованием только Excel. Обратите внимание, мое решение взято из руководства Microsoft .
- Создайте файл / файлы Excel, ленты которых вы хотите настроить. В моем случае я создал два
.xlamфайла Chart Tools.xlamи Priveleged UDFs.xlam, чтобы продемонстрировать, как несколько надстроек могут взаимодействовать с лентой.
- Создайте папку с любым именем папки для каждого только что созданного файла.
- Внутри каждой из созданных вами папок добавьте
customUIи_rels папки.
- Внутри каждой
customUIпапки создайте customUI.xmlфайл. В customUI.xmlфайле подробно описано, как файлы Excel взаимодействуют с лентой. Часть 2 руководства Microsoft описывает элементы в 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>
Мой 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>
- Для каждого файла, созданного на шаге 1, добавьте суффикс a
.zipк имени файла. В моем случае я переименовал Chart Tools.xlamв Chart Tools.xlam.zipи Privelged UDFs.xlamв Priveleged UDFs.xlam.zip.
- Откройте каждый
.zipфайл и перейдите к _relsпапке. Скопируйте .relsфайл в _relsпапку, созданную на шаге 3. Отредактируйте каждый .rels файл в текстовом редакторе. Из руководства Microsoft
Между последним <Relationship>элементом и закрывающим
<Relationships>элементом добавьте строку, которая создает связь между файлом документа и файлом настройки. Убедитесь, что вы правильно указали имена папок и файлов.
<Relationship Type="http://schemas.microsoft.com/office/2006/
relationships/ui/extensibility" Target="/customUI/customUI.xml"
Id="customUIRelID" />
Мой .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>
Мой .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>
- Замените
.relsфайлы в каждом .zipфайле на .relsфайл / файлы, которые вы изменили на предыдущем шаге.
- Скопируйте и вставьте
.customUIсозданную вами папку в домашний каталог .zipфайла / files.
- Удалите
.zipрасширение файла из созданных вами файлов Excel .
- Если вы создали
.xlamфайлы, вернитесь в Excel и добавьте их в свои надстройки Excel.
- Если возможно, создайте обратные вызовы в каждой из своих надстроек. На шаге 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
Мой 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
У разных элементов разная подпрограмма обратного вызова. Для кнопок обязательный параметр подпрограммы ByRef control As IRibbonControl. Если вы не соответствуете требуемой подписи обратного вызова, вы получите сообщение об ошибке при компиляции проекта / проектов VBA. В части 3 руководства Microsoft определены все сигнатуры обратных вызовов.
Вот как выглядит мой готовый пример

Некоторые заключительные советы
- Если вы хотите , надстроек на долю Ribbon элементов, использовать
idQи xlmns:ключевое слово. В моем примере, Chart Tools.xlamи Priveleged UDFs.xlamоба имеют доступ к элементам с idQравными x:chartToolsTabи x:privelgedUDFsTab. Чтобы это работало, x:требуется, и я определил его пространство имен в первой строке моего customUI.xmlфайла <customUI xmlns="http://schemas.microsoft.com/office/2006/01/customui" xmlns:x="sao">. Раздел два способ Настройки интерфейса Fluent в руководстве Microsoft дает некоторые дополнительные детали.
- Если вы хотите, чтобы надстройки получали доступ к элементам ленты, поставляемым с Excel, используйте
isMSOключевое слово. Раздел два способ Настройки интерфейса Fluent в руководстве Microsoft дает некоторые дополнительные детали.