Статьи из блога

Как назначить свою иконку для макроса в Word 2007

Несколько месяцев назад я получил письмо от пользователя, в котором меня спрашивали о возможности назначить для кнопки макроса (выведенного на панель быстрого доступа в редакторе Word 2007) своей иконки.

 

Как известно, в прежних версиях редактора можно было назначить для любой команды на панели инструментов свою собственную картинку. Можно было отредактировать иконку на кнопке или нарисовать собственную с помощью окна Редактор кнопок:

 

Редактор кнопок

 

В редакторе Word 2007 этой возможности нет.

Однако, на прошлой неделе я просматривал сайт Грэга Макси (Greg Maxey) и обнаружил у него статью, в которой он предлагает свое решения этой проблемы.

Мне показалось интересной его статья и я повторил эксперимент.

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

 

Во-первых, необходимо скачать и установить у себя специальную программу для редактирования XML-скриптов - Office 2007 Custom UI Editor. Можно использовать и альтернативный редактор (с дополнительными функциями), созданный Максимом Новиковым - RibbonXMLEditor.

 

Замечу также, что на своем сайте Максим опубликовал замечательную статью-инструкцию в трех частях Microsoft Word 2007. Меняем интерфейс.

 

Во-вторых, подготовьте картинку для вашей иконки-кнопки. Она должна быть в формате PNG или GIF. Если у вас нет подходящей картинки, то вы можете создать ее в упомянутом Редакторе кнопок Word 2003. После того, как вы нарисовали иконку в редакторе, скопируйте ее:

 

 

После этого откройте любой графический редактор, вставьте скопированное изображение и сохраните его в нужном формате.

 

В-третьих, запустите редактор Word 2007 и откройте в режиме редактирования ваш шаблон с макросами или документ с вашими макросами. Шаблон должен быть пересохранен в формате DOTM, а документ в формате DOCM. Закройте теперь все документы и сам редактор.

 

В-четвертых, запустите редактор XML-скриптов (я использую Office 2007 Custom UI Editor) и откройте в нем ваш шаблон или документ.

 

В-пятых, вставьте в окно редактора следующий код:

<!-- Создаем свою вкладку на ленте, группу команд и кнопку с собственной картинкой. -->
<customui xmlns="http://schemas.microsoft.com/office/2006/01/customui">
<ribbon>
  <tabs>
    <tab id="MyTab" label="Моя вкладка" insertbeforemso="TabInsert">
      <group id="MyGroup" label="Группа">
        <button id="MyButton" label="Кнопка" image="face_me" size="large" onaction="MyNewAvatar">
      </button></group>
    </tab>
  </tabs>
</ribbon>
</customui>

 

Кратко объясню, что делает этот скрипт. С его помощью мы создаем собственную вкладку на ленте с заголовком "Моя вкладка". На этой вкладке будет создана группа команд с наименованием "Группа", в которой будет размещена кнопка с нашей картинкой (имя файла картинки "face_me"). По щелчку на этой кнопке будет выполняться макрос, который вы определите для кнопки. В данном примере, это макрос с именем "MyNewAvatar".

 

В-шестых, подключим к документу выбранную заранее картинку. Для этого щелкаем на кнопке Insert Icons:

 

 

Находим и выбираем свою картинку. Ее иконка должна появиться в правой панели редактора:

 

 

ID (идентификатор) картинки нужно вставить в наш код в тег Image (cмотрите код выше). У меня это image="face_me".

 

В-седьмых, сохраняете файл и открываете в редакторе Word 2007 ваш документ или шаблон, для которого вы делали иконку. Должно получиться примерно следующее:

 

 

Как видите, все получилось. Но если вы сейчас нажмете на кнопку, то скорее всего появится сообщение, что не найден макрос. Это значит, что в вашем документе (шаблоне) нет макроса с именем, который вы задали для кнопки. Напоминаю, в моем случае в коде это onAction="MyNewAvatar". Но перед этим отредактируйте код макроса, добавив в скобки следующий агрумент:

control As IRibbonControl

Должно получиться примерно следующее (мой тестовый макрос):

Sub MyNewAvatar(control As IRibbonControl)
   MsgBox "Работа кнопки с собственной иконкой"
End Sub

 

Замените имя макроса на имя вашего макроса и проверьте работоспособность.

Кстати, проверить правильность вызова макроса можно и из редактора XML-скриптов, нажав на кнопку Generate Callbacks:

 

 

Откроется новая вкладка с октрывающим и закрывающим операторами кода на VBA:

 

 

Чтобы добавить иконку на панель быстрого доступа (и не создавать собственную вкладку), нам потребуется слегка изменить код скрипта и выполнить дополнительные действия для размещения на панели своей кнопки.

  • Открываем наш документ в редакторе XML-скриптов и вставляем следующий код:

<!-- Добавление иконки на панель быстрого доступа -->
<customui xmlns="http://schemas.microsoft.com/office/2006/01/customui">
<ribbon>
  <tabs>
    <tab idmso="TabInsert">
      <group id="MyGroup" label="Группа" visible="false">
        <button id="MyButton" label="Моя кнопка" image="face_me" onaction="MyNewAvatar">
      </button></group>
    </tab>
  </tabs>
</ribbon>
</customui>

  • Добавляете иконку-картинку, как это было описано выше.
  • Сохраняете файл.
  • Открываете документ (шаблон) в редакторе Word 2007.
  • Щелкаете на кнопке Настройка панели быстрого доступа:

     

     

    и выбираете из раскрывшегося меню команду Другие команды. Откроется диалоговое окно Параметры Word.

  • В поле Выбрать команды из: выбираете строку Все команды. Ниже в панели появляется список всех доступных команд редактора.
  • Находите и выбираете вашу команду (в моем случае это "Моя кнопка"):

     

     

    Затем нажимаете кнопку Добавить, чтобы перенести команду на панель быстрого доступа.

  • Закрываете окно и тестируете получившийся результат. Он должен выглядеть примерно так:

     

Вот и все!

twitter.com facebook.com vkontakte.ru odnoklassniki.ru mail.ru ya.ru rutvit.ru myspace.com technorati.com digg.com friendfeed.com pikabu.ru blogger.com liveinternet.ru livejournal.ru memori.ru google.com bobrdobr.ru mister-wong.ru yahoo.com yandex.ru del.icio.us

Еще записи по вопросам использования Microsoft Word:

Комментариев: 26

  1. Luna
    24.03.2009 в 21:19 | #1

    Тогда уж и общую статью этого автора по "Customizing Ribbon" - http://gregmaxey.mvps.org/Customize_Ribbon.htm

  2. Алексей
    21.04.2009 в 07:00 | #2

    Добрый день, Антон.

    Хочу в начале поблагодарить за действительно полезный сайт, таких сейчас немного - с удовольствием читаю его и мотаю себе на ус все хитрости Word'а grin Вы делаете хорошую работу, спасибо Вам за это!

    Теперь к моей проблеме: у меня есть документ в Word'е, в котором большая двухколоночная таблица с текстом (англо-русский словарь слов и выражений). Мне нужно удалить в этой таблице все одиночные слова - т.е. если в одной из ячеек строчки или в обоих встречается одно единственное слово, эту строку таблицы надо удалить. Если слов в ячейке больше одного, строчку нужно оставить - и так для всей таблицы. Возможно ли это дело как-нибудь автоматизировать? Пробовал искать единичное слово с помощью регулярных выражений, что-то не получилось :(

    Очень надеюсь на Ваш ответ - документ очень большой, не хотелось бы выискивать одиночные слова вручную.

    Заранее благодарю,

    Алексей

  3. 21.04.2009 в 08:40 | #3

    Как-то после праздников туговато соображается.

    Вот, что получилось на скорую руку.

    Sub DeleteOneWordCell()
      On Error Resume Next
      Dim i%, j%, oTbl As Table
      Set oTbl = ActiveDocument.Tables(1)
      For i = oTbl.Rows.Count To 1 Step -1
        For j = 1 To oTbl.Columns.Count
          If oTbl.Cell(i, j).Range.Words.Count - 1 = 1 Then oTbl.Rows(i).Delete
        Next
      Next
    End Sub

    Небольшое замечание. В ячейках не должно быть лишних пробелов, знаков абзаца и прочей нечисти. Т.е., если слово в ячейке одно, то в ячейке кроме него и символа конца ячейки больше ничего не должно быть.

  4. Алексей
    22.04.2009 в 16:17 | #4

    Александр Витер, огромное Вам спасибо!

    Всё получилось, макрос работает, как часы. Теперь рутина мне не страшна =)

    Ещё раз благодарю!

  5. Иван Петров
    16.10.2009 в 15:28 | #5

    В Word 2007 намного больше иконок для кнопки макроса, чем в Word 2003. Вопрос:

    Где находятся иконки для кнопки макроса (Word 2007)?

    Можно ли туда добавить несколько своих иконок?

  6. 16.10.2009 в 16:13 | #6

    Если вы имеете в виду кнопки на панели быстрого доступа, то никак. Пользуйтесь тем, что есть

  7. сергей
    26.10.2009 в 07:39 | #7

    а можно ли такую же фишку и в excel 2007 проделать, а?

  8. 26.10.2009 в 10:05 | #8

    а можно ли такую же фишку и в excel 2007 проделать, а?

    Можно!

  9. сергей
    26.10.2009 в 10:29 | #9

    а можно ли такую же фишку и в excel 2007 проделать, а?

    Можно!

    Отлично! тогда распишу свою проблему по подробнее. в общем у меня есть куча макросов сохраненные в "личной книге макросов", т.е. они не привязанны к какой то одной книге. так ка их у меня уже много то их кнопки с трудом уже помещаются на панели бымтрого доступа, поэтому хочется создать свою вкладку "Мои макросы" на ленте и разместить кнопки макросов со своими рисунками в этой новой вкладке. есть какие нибудь предложения по решению такой проблемки?

  10. Вождь
    08.02.2010 в 15:45 | #10

    Предлагаю более подробно описать формат самой команды onAction и формат заголовков соответствующих ей макросов.

    Вот пару вопросов:

    1. Где найти полную документацию по формату команды для свойства onAction и ему подобным? Интересуют варианты типа onAction="MyProject.MyModule.MyProcedure", onAction="!" и все остальные.

    2. Где найти список всех элементов ленты и формат соответствующих им макросов onAction, onChange и др.?

  11. 08.02.2010 в 21:09 | #11

    onAction это не команда, а атрибут элемента ленты, определяющий имя макроса, выполняющегося при щелчке на этом элементе. Эти макросы называются процедурами обратного вызова или callbacks по-английски. Их полный список приведён здесь (на английском), так же как и список остальных атрибутов элементов управления.

    Все процедуры обратного вызова в качестве одного из параметров имеют control As IRibbonControl, содержащий элемент управления, вызвавший эту процедуру.

    При работе с интерфейсом я рекомендую использовать программу Ribbon XML Editor, которая автоматически генерирует шаблоны для процедур обратного вызова, если таковые были указаны для элемента управления.

    В качестве примера использования динамических атрибутов и процедур обратного вызова предлагаю ознакомится с моей галереей для вставки изображений из папки.

  12. Вождь
    09.02.2010 в 01:02 | #12

    Спасибо. C callbacks процедурами ситуация прояснилась.

    Ribbon XML Editor - полезная и удобная вещь.

    А насчет свойства onAction, я имед ввиду формат команды содержащейся в этом свойстве.

  13. 09.02.2010 в 10:22 | #13

    В XML для onAction указывается просто имя соответствующей процедуры. Имя можно указывать как полное, с указанием имени проекта, модуля и имени процедуры, так и только имя процедуры. Я всегда указываю только имя процедуры, а чтобы имена процедур в разных шаблонах не конфликтовали между собой, я ставлю в начале модуля с процедурами строку Option Private Module.

    Из опыта могу сказать, что нецелесообразно указывать разные процедуры onAction, если всё действие сводится к двум-трём строкам кода. Лучше указать одну процедуру для нескольких компонентов, а уже внутри неё, с помощью оператора Select Case, определять Id элемента управления, вызвавшего процедуру, и выполнять действие.

    Пример. Поместите в документ такое XML-содержимое

    
    

    В сам документ добавьте модуль с таким содержимым:

    Option Private Module
    Option Explicit
    'Переменная для хранения ссылки на интерфейс
    Dim myRibbon As IRibbonUI
    'Переменные для хранения состояния элементов управления
    Dim but1Enabled As Boolean
    Dim but2Enabled As Boolean
    ' (компонент: customUI, атрибут: onLoad), 2007
    Sub onLoadUI(ribbon As IRibbonUI)
      Set myRibbon = ribbon
      but1Enabled = True
      but2Enabled = True
    End Sub
    'but1 (компонент: button, атрибут: onAction), 2007
    'but2 (компонент: button, атрибут: onAction), 2007
    Sub onAction(control As IRibbonControl)
      'Определяем какой элемент управления вызвал событие
      'И меняем значение соотвествующей переменной на противоположное
      Select Case control.ID
        Case "but1"
          but2Enabled = Not but2Enabled
        Case "but2"
          but1Enabled = Not but1Enabled
      End Select
      myRibbon.Invalidate
    End Sub
    'but1 (компонент: button, атрибут: getEnabled), 2007
    'but2 (компонент: button, атрибут: getEnabled), 2007
    Sub getEnabled(control As IRibbonControl, ByRef enabled)
      'Определяем какой элемент управления вызвал событие
      'и устанавливаем его состояние значением соответствующей переменной.
      Select Case control.ID
        Case "but1"
          enabled = but1Enabled
        Case "but2"
          enabled = but2Enabled
      End Select
    End Sub

    В результате появится дополнительная вкладка с двумя кнопками. Нажатие на одну кнопку активирует или дезактивирует другую. Пример файла можно скачать здесь

  14. kuzy
    12.02.2010 в 20:44 | #14

    А в Excel 2003, можно также сделать? И можно ли сделать так, чтобы в иконке было несолько кнопок для разных макросов. Заранее благодарю за ответ.

  15. Никита
    27.03.2010 в 09:11 | #15

    С появлением Office 2010 необходимость в создании ленты с помощью XML-кода отпала. Возможно ли редактировать созданные Word-ом ленты? Каким образом привязать картинку именно к макросу, а не к кнопке?

  16. 27.03.2010 в 10:40 | #16

    Нет, Никита, не отпала. И вы сами это поймёте, когда начнёте захотите редактировать созданные Word'ом ленты, точнее ленту. Дело в том, что настройки ленты, изменённой при помощи стандартных средств, хранятся в одном файле и изменённая лента доступна всегда, вне зависимости от открытого документа. Если же вам, для вашего документа нужны свои вкладки, то придётся лезть в XML и править руками. Кроме того, в 2010-м нет возможности настроить Backstage (то, что заменило кнопку Office)

  17. Марина
    18.10.2010 в 13:00 | #17

    Здравствуйте! Вопрос: как сделать чтоб созданная группа и и вкладка (настройка ленты) была привязана к определенному шаблону *dotm. Чтобы призагрузке этого шаблона появлялись эта вкладка с группами. У меня Word 2010

  18. 18.10.2010 в 18:29 | #18

    Марина, для этого нужно создать отдельный шаблон и в нем уже создавать нужные вкладки и команды.

  19. Марина
    19.10.2010 в 03:10 | #19

    Антон, я уже создала шаблон, в нем макросы. В ленте, в Главной, создала группу и в нее добавила макросы. Но когда закрываю шаблон и Word, открываю вновь Word (не этот шаблон) группа эта в Главной присутствует, но естественно не работает. Мне нужно чтобы эта группа появлялась только в документах созданных на этом шаблоне или при открытии этого шаблона. А получается группа присутствует теперь всегда. Понять не могу как эта привязка осуществляется...Помогите пожалуйста

  20. 19.10.2010 в 16:57 | #20

    Марина, вероятно, ваш новый шаблон присоединен к текущему шаблону. Нажмите кнопку "Шаблон документа" на вкладке "Разработчик" и в открывшемся окне посмотрите, что загружено в качестве шаблона. Если там присутствует ваш шаблон, то удалите его из панели "Общие шаблоны и надстройки".

  21. 19.10.2010 в 17:01 | #21

    И второй момент: возможно, что ваш новый шаблон размещен в папке StartUp. В этом случае он будет доступен и для других документов. Перенесите ваш шаблон в другую папку (общую) для остальных шаблонов.

  22. Аноним
    24.10.2010 в 20:25 | #22

    Друзья, помогите, пожалуйста, решить проблему. При работе в Ворде-2003 макрос активизируется нажатием иконки. Результат работы макроса – появляется несколько панелей инструментов. На каждой своя одна кнопка-иконка (или несколько), включающая свой собственный макрос. Нажимая на кнопки, оператор выполняет работу на своём компьютере в нескольких документах, которые открываются, обрабатываются и закрываются по программам, записанным в макросах. В Ворде-2003 проблем не возникало: панели появлялись в нужном мне месте экрана и т.д. Но в Ворде 2007 я не могу добиться того, чтобы панели находились в определённом месте на экране. Знает ли кто-нибудь, как помочь моей беде? Буду признателен за подсказку. Алексей Анатольевич.

  23. Таня
    26.09.2011 в 17:28 | #23

    хм....кликаем по панели -->More commands-->Customize-->Macros-->modify-->выбираем иконку smile

  24. Olga
    09.10.2012 в 14:08 | #24

    спасибо, статья все еще актуальна.

    но я не могу создать названия ленты, групп и кнопок на русском.

    редактор Office 2007 Custom UI Editor просто во время написания заменяет русские буквы какими-то иероглифами . не подскажите как быть?

  25. 12.10.2012 в 11:48 | #25

    Обратитесь на наш форум, там помогут.

  26. Степан Непан
    14.07.2013 в 10:51 | #26

    Да, наверное, сайт полезный. Но, к сожаление, снова не для меня. Мудрёный. Если бы я врубался в то, что пишут и читают, то я бы и сам всё находил. Без советчиков.

    К примеру, из этой ленты мне понятны лишь слова КЛИКАЕМ ПО ПАНЕЛИ, и понятен покемон (или как он там называется?). Во, вспомнил,- смайлик.

    хм....кликаем по панели -->More commands-->Customize-->Macros-->modify-->выбираем иконку smile

Оставьте комментарий!

(обязательно)

^ Наверх