2012-01-13 10 views
72

Я ищу способ добавить пользовательскую вкладку в ленте Excel, которая будет содержать несколько кнопок. Я оценил некоторые ресурсы, обращаясь к ним через Google, но все выглядят изворотливыми и возмутительно сложными.Как добавить пользовательскую вкладку Ribbon с помощью VBA?

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

UPDATE: Я попробовал этот пример из here но получить «Требуется объект» ошибка на последней инструкции:

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 
+0

Проверьте, какую версию Excel вы используете? –

+0

Я использую 2007 – Jerome

+0

Это для проекта. –

ответ

123

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

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


Edit: Для того, чтобы разместить новый запрос на OP

Учебник

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

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

    enter image description here

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

    enter image description here

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

    enter image description here

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

    enter image description here

    label="Custom Tab": Заменить "Custom Tab" с именем, которое вы хотите дать вкладку. Пока назовем это «Джером».

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

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

    imageMso: Это изображение, которое будет отображаться на кнопке. «HappyFace» - это то, что вы сейчас увидите. You can download more image ID's here.

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

Demo

С этим, давайте создадим 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

Надеется, что это помогает!

+0

просто скачал вещь. Вы рекомендуете любую страницу примера? – Jerome

+5

Да :) У Рона много примеров на его сайте. http://www.rondebruin.nl/ribbon.htm –

+0

хорошо, у меня есть первый пример. Но предоставленный XML заключается в добавлении на вкладку «Главная». Как добавить вкладку с выбранным именем? Я попробовал поиграть, но не могу вытащить. – Jerome

18

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

  1. Как говорят другие, один не может создать ленту CustomUI с VBA, однако, вам не нужно!
  2. Идея заключается в создании кода XML ленты с помощью файла в Excel> Параметры> Настройка ленты, а затем экспортировать ленты в файл .customUI (это просто TXT файл с XML в нем)
  3. Сейчас идет обмануть: вы можете включать код .customUI в файле .xlsm с помощью инструмента MS они относятся сюда, скопировав код из .customUI файла
  4. После того, как он включен в файл .xlsm, каждый раз вы открываете его, лента, которую вы определили, добавлен к ленте пользователя - но используйте < лента startFromScratch = "false"> или вы los Остальная часть ленты. При выходе из рабочей книги лента удаляется.
  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

14

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

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

Чтобы заставить кнопки работать с вашими настраиваемыми макросами, настройте макрос в своих .xlam subs, которые вызывают, как описано в этом ответе SO - Calling an excel macro from the ribbon. В принципе, вам нужно добавить параметр «control as IRibbonControl» в любой модуль, указанный на вашем ленточном xml. Кроме того, ваша лента XML должен иметь OnAction = «myaddin! Mymodule.mysub» синтаксис правильно называть любые модули, загруженные оных в.

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

+1

Это работает для тех из нас, у кого нет всех средств разработки. Спасибо за «простое» решение. – Evan

+1

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

20

Я смог выполнить это с помощью 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 открыть еще и вызвать ClearCustRibbon к югу в Before_Close Событие файла кода ThisWorkbook.

+0

Это работало для меня, но с несколькими второстепенными проблемами, с которыми я столкнулся. 1) Если я сохранил событие Before_Close, новая лента не загрузилась. 2) Когда мне удалось заставить ленту работать, удалив событие Before_Close, мне пришлось повторно загрузить Excel до того, как он появится. Если бы вы могли посоветовать, почему это происходит, это было бы здорово! – Petay87

+0

Является ли код точно таким же? Можете ли вы опубликовать его? Идея заключается в том, что Excel должен изменить стандартный ленточный файл до загрузки ленты и сбросить его до закрытия книги. Сброс ленты необходим, чтобы она не отображалась в других книгах. –

4

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

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

+0

Как бы вы передали аргументы с этим? Я использовал это, но не могу найти способ передать аргументы. – jDave1984

Смежные вопросы