Как добавить настраиваемую вкладку ленты с помощью VBA?

98

Я ищу способ добавить настраиваемую вкладку на ленту Excel, на которой было бы несколько кнопок. Я случайно наткнулся на некоторые ресурсы, посвященные этой проблеме через Google, но все они выглядят хитроумно и невероятно сложно.

Как это сделать быстро и просто? Я бы хотел, чтобы новая вкладка загружалась, когда мой 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
BuZz
источник
Пожалуйста, подтвердите, какую версию Excel вы используете?
Siddharth Rout
Это для Project.
Nathan_Sav

Ответы:

146

AFAIK вы не можете использовать VBA Excel для создания настраиваемой вкладки на ленте Excel. Однако вы можете скрыть / сделать видимым компонент ленты с помощью VBA. Кроме того, ссылка, которую вы упомянули выше, предназначена для MS Project, а не для MS Excel.

Я создаю вкладки для своих приложений / надстроек Excel с помощью этой бесплатной утилиты под названием Custom UI Editor .


Изменить: для размещения нового запроса OP

Руководство

Вот краткое руководство, как и было обещано:

  1. После того, как вы установили Custom UI Editor (CUIE), откройте его и нажмите File | Откройте и выберите соответствующий файл Excel. Убедитесь, что файл Excel закрыт, прежде чем открывать его через CUIE. В качестве примера я использую новый рабочий лист.

    введите описание изображения здесь

  2. Щелкните правой кнопкой мыши, как показано на изображении ниже, и выберите «Пользовательский интерфейс Office 2007». Он вставит "customUI.xml"

    введите описание изображения здесь

  3. Далее Щелкните меню Вставить | Образец XML | Пользовательская вкладка. Вы заметите, что основной код создается автоматически. Теперь вы готовы отредактировать его в соответствии с вашими требованиями.

    введите описание изображения здесь

  4. Давайте проверим код

    введите описание изображения здесь

    label="Custom Tab": Замените «Custom Tab» на имя, которое вы хотите дать своей вкладке. А пока назовем его «Джером».

    В приведенной ниже части добавлена ​​пользовательская кнопка.

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

    imageMso: Это изображение, которое будет отображаться на кнопке. «HappyFace» - это то, что вы увидите сейчас. Вы можете скачать больше идентификаторов изображений здесь .

    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>

Удалите весь код, созданный в 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

Сохраните файл Excel как файл с поддержкой макросов. Теперь, когда вы нажмете на Смайлик или Солнце, вы увидите соответствующее окно сообщения:

введите описание изображения здесь

Надеюсь это поможет!

Сиддхарт Рут
источник
6
Да :) У Рона есть множество примеров на его сайте. rondebruin.nl/ribbon.htm
Siddharth Rout
1
Вы хотите создать новую вкладку? Если да, то предоставьте более подробную информацию, и я дам вам XML-код :)
Siddharth Rout
1
Дай мне 20 минут. Обновление вышеуказанного сообщения соответствующим кодом и снимками :)
Siddharth Rout
7
@SiddharthRout +1 - Я обнаружил, что мне не нужны никакие книги по Excel, просто следите за вашими постами, чтобы узнать, что мне нужно выучить за дневную работу (а сегодня вечером это XML-лента!) :)
Наш человек в Bananas
1
Я бы порекомендовал создать новый quesiton с базовым xml-кодом и кодом VBA, а затем мы можем взять его там? @YasserKhalil
Siddharth Rout
30

Мне удалось добиться этого с помощью VBA в Excel 2013. Никаких специальных редакторов не требуется. Все, что вам нужно, это редактор кода Visual Basic, доступ к которому можно получить на вкладке Разработчик. Вкладка «Разработчик» по умолчанию не отображается, поэтому ее необходимо включить в меню «Файл»> «Параметры»> «Настроить ленту». На вкладке Разработчик нажмите кнопку 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

Вызов подпрограммы LoadCustRibbon в Wookbook open even и вызов подпрограммы ClearCustRibbon в событии Before_Close файла кода ThisWorkbook.

Рой-Чи Брайант
источник
Это сработало для меня, но только с парой мелких проблем, с которыми я столкнулся. 1) Если я оставил событие Before_Close, новая лента не загрузилась. 2) Когда мне удалось заставить ленту работать, удалив событие Before_Close, мне пришлось повторно загрузить Excel, прежде чем оно появилось. Если бы вы могли посоветовать, почему это происходит, было бы здорово!
Petay87
Код точно такой же? Вы можете опубликовать это? Идея состоит в том, что Excel должен изменить стандартный файл ленты перед загрузкой ленты и сбросить его перед закрытием книги. Необходимо сбросить настройки ленты, чтобы она не отображалась в других книгах.
Рой-Чжи Брайант
3
Этот код перезаписывает все текущие настройки ленты, которые пользователь, возможно, уже сделал.
WizzleWuzzle
@WizzleWuzzle Это не обязательно. Ленту можно импортировать и преобразовать в объект, по которому можно перемещаться. Затем к объекту могут быть добавлены новые элементы. Результат можно сохранить в файл. Вопрос был в том, как создать собственную ленту; не как изменить существующий.
Roi-Kyi Bryant
1
@ Roi-Kyi-Bryant Вопрос состоял в том, чтобы добавить настраиваемый элемент ленты, а не перезаписывать всю текущую настраиваемую ленту. Этот код перезаписывает текущую ленту.
WizzleWuzzle 09
24

Я боролся как сумасшедший, но на самом деле это правильный ответ. Как бы то ни было, я пропустил следующее:

  1. Как говорят другие, нельзя создать ленту CustomUI с помощью VBA, однако нет необходимости!
  2. Идея состоит в том, что вы создаете код ленты xml с помощью меню Excel File> Options> Customize Ribbon, а затем экспортируете ленту в файл .customUI (это просто файл txt с xml в нем).
  3. А теперь уловка : вы можете включить код .customUI в свой файл .xlsm, используя инструмент MS, на который они здесь ссылаются, скопировав код из файла .customUI.
  4. После включения в файл .xlsm каждый раз, когда вы его открываете, добавляется определенная вами лента. к ленте пользователя, но используйте <tape startFromScratch = "false">, иначе вы потеряете остальную часть ленты. При выходе из книги лента удаляется.
  5. С этого момента все просто: создайте свою ленту, скопируйте XML-код, относящийся к вашей ленте, из файла .customUI и поместите его в оболочку, как показано выше (... <tabs> ваш xml </ tabs .. .)

Кстати, страница, которая объясняет это на сайте Рона, теперь находится по адресу 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

Ян Вейнинкс
источник
2
Тем не менее (5 лет спустя) лучший ответ, на мой взгляд, и, возможно, OP @BuZz хотел бы обновить исходное сообщение, по крайней мере, указав на этот ответ (?). Я его еле нашел, так как он лежал внизу довольно длинного списка ответов.
Chri.s
18

Ответы здесь относятся к использованию настраиваемого редактора пользовательского интерфейса. Я потратил некоторое время на создание интерфейса без этой замечательной программы, поэтому я документирую решение здесь, чтобы помочь всем остальным решить, нужен ли им этот пользовательский редактор пользовательского интерфейса или нет.

Я наткнулся на следующую веб-страницу справки Microsoft - https://msdn.microsoft.com/en-us/library/office/ff861787.aspx . Здесь показано, как настроить интерфейс вручную, но у меня возникли некоторые проблемы, когда я указал на свой собственный код надстройки.

Чтобы кнопки работали с вашими настраиваемыми макросами, настройте макрос в подпрограммах .xlam, который будет вызываться, как описано в этом ответе SO - Вызов макроса Excel с ленты . По сути, вам нужно добавить этот параметр «control As IRibbonControl» к любому модулю, указанному на вашей ленте xml. Кроме того, ваш XML-файл ленты должен иметь синтаксис onAction = "myaddin! Mymodule.mysub" для правильного вызова любых модулей, загруженных добавлением.

Используя эти инструкции, я смог создать надстройку Excel (файл .xlam), в которой загружается настраиваемая вкладка, когда мой VBA загружается в Excel вместе с надстройкой. Кнопки выполняют код из надстройки, а настраиваемая вкладка удаляется, когда Убираю надстройку.

Jomtung
источник
1
Это работает для тех из нас, у кого нет всех инструментов разработки. Спасибо за «простое» решение
Эван
2
Раньше я обучал этому методу своих студентов-программистов второго курса, но в итоге обнаружил, что использование инструмента CustomUI проще, если вы можете получить к нему доступ.
Рик Хендерсон,
8

В дополнение к ответу Рой-Чи Брайанта этот код полностью работает в 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 как String, groupName как String, btnName как String). Затем вызовите эти подпрограммы в соответствующем месте, как указал @Erikas.
Roi-Kyi Bryant
6

Я столкнулся с трудностями с решением Roi-Kyi Bryant, когда несколько надстроек пытались изменить ленту. У меня также нет прав администратора на моем рабочем компьютере, что исключает установку Custom UI Editor. Итак, если вы находитесь в одной лодке со мной, вот альтернативный пример настройки ленты с использованием только Excel. Обратите внимание, мое решение взято из руководства Microsoft .


  1. Создайте файл / файлы Excel, ленты которых вы хотите настроить. В моем случае я создал два .xlamфайла Chart Tools.xlamи Priveleged UDFs.xlam, чтобы продемонстрировать, как несколько надстроек могут взаимодействовать с лентой.
  2. Создайте папку с любым именем папки для каждого только что созданного файла.
  3. Внутри каждой из созданных вами папок добавьте customUIи_rels папки.
  4. Внутри каждой 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. Для каждого файла, созданного на шаге 1, добавьте суффикс a .zipк имени файла. В моем случае я переименовал Chart Tools.xlamв Chart Tools.xlam.zipи Privelged UDFs.xlamв Priveleged UDFs.xlam.zip.
  2. Откройте каждый .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>
  1. Замените .relsфайлы в каждом .zipфайле на .relsфайл / файлы, которые вы изменили на предыдущем шаге.
  2. Скопируйте и вставьте .customUIсозданную вами папку в домашний каталог .zipфайла / files.
  3. Удалите .zipрасширение файла из созданных вами файлов Excel .
  4. Если вы создали .xlamфайлы, вернитесь в Excel и добавьте их в свои надстройки Excel.
  5. Если возможно, создайте обратные вызовы в каждой из своих надстроек. На шаге 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 определены все сигнатуры обратных вызовов.


Вот как выглядит мой готовый пример

Готовый продукт


Некоторые заключительные советы

  1. Если вы хотите , надстроек на долю 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 дает некоторые дополнительные детали.
  2. Если вы хотите, чтобы надстройки получали доступ к элементам ленты, поставляемым с Excel, используйте isMSOключевое слово. Раздел два способ Настройки интерфейса Fluent в руководстве Microsoft дает некоторые дополнительные детали.
Джошуа Дейли
источник
0

Другой способ - загрузить бесплатный модуль класса Open XML Яна Карела Питерсе с этой страницы: Редактирование элементов в файле OpenXML с помощью VBA

Добавив это в свой проект VBA, вы можете распаковать файл Excel, использовать VBA для изменения XML, а затем использовать класс для повторного сжатия файлов.

Джон Корчок
источник