Я столкнулся с трудностями с решением 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 дает некоторые дополнительные детали.