Я столкнулся с трудностями с решением Рой-Ки Брайант, когда несколько надстроек пытались изменить ленту. У меня также нет доступа администратора на моем рабочем компьютере, что исключает установку 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, добавьте суффикс
.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
file / 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 определяет все сигнатуры обратного вызова.
Вот как выглядит мой законченный пример
Несколько заключительных советов
- Если вы хотите, чтобы надстройки совместно использовали элементы ленты, используйте ключевые слова
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 приведены некоторые дополнительные сведения.