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

Я ищу способ добавить пользовательскую вкладку на ленте 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

5 ответов


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

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


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

учебник

здесь краткий учебник, как и было обещано:

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

    enter image description here

  2. щелкните правой кнопкой мыши, как показано на рисунке ниже, и нажмите "Office 2007 Custom UI Part". Это будет вставить "использования customui.XML-код"

    enter image description here

  3. далее нажмите на вкладку меню Вставка / пример XML / Custom. Вы заметите, что основной код генерируется автоматически. Теперь вы все готовы редактировать его в соответствии с вашими требованиями.

    enter image description here

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

    enter image description here

    label="Custom Tab": замените "пользовательская вкладка" на имя, которое вы хотите дать вашей вкладке. Пока что давай назовем это "Джером."

    ниже Часть добавляет пользовательскую кнопку.

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

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

    onAction="Callback":" обратный вызов " - это название процедуры, которая выполняется при нажатии на кнопку.

демо

С этим, давайте создадим 2 кнопки и назовем их "JG Button 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

надеюсь, что это помогает!


я смог выполнить это с помощью 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 sub в Wookbook open even и вызовите clearcustribbon sub в событии Before_Close файла кода ThisWorkbook.


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

  1. как говорят другие, нельзя создать ленту CustomUI с помощью VBA,, вам не надо!
  2. идея заключается в том, что вы создаете код XML-ленты, используя файл Excel > Параметры > Настроить ленту, а затем экспортируете ленту В a .customUI файл (это просто txt файл, с xml в нем)
  3. сейчас идет трик!--5--> вы можете включить the .код customUI в вашем .xlsm-файл с помощью инструмента MS, на который они ссылаются здесь, путем копирования кода из .файл customUI
  4. как только он будет включен в.xlsm файл, каждый раз, когда вы открываете его, лента, которую вы определили добавил к ленте пользователя-но используйте или вы потеряете остальную часть ленты. При выходе из книги лента удаляется.
  5. отсюда это просто, создайте ленту, скопируйте из нее xml-код, специфичный для вашей ленты .файл customUI и поместите его в оболочку, как показано выше (... ваш xml

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


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

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

чтобы заставить кнопки работать с вашими пользовательскими макросами, настройте макрос в своем .xlam subs, который будет называться, как описано в этом ответе SO -вызов макроса excel с ленты. В принципе, вам нужно добавить этот параметр "control As IRibbonControl" в любой модуль, указанный из xml-файла ленты. Кроме того, ваша лента xml должна иметь onAction= " myaddin!сборка mymodule.mysub " синтаксис для правильного вызова любых модулей, загруженных add in.

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


в дополнение к ответу 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

Не забудьте сохранить и снова открыть книгу. Надеюсь, это поможет!