Статьи из блога
Статьи из блога
Как назначить свою иконку для макроса в Word 2007
Метки: word 2007 | иконки | макросы | панель быстрого доступа
Пятница, 20 марта 2009 г.
Просмотров: 3562
Подписаться на комментарии по RSS
Версия для печати
Несколько месяцев назад я получил письмо от пользователя, в котором меня спрашивали о возможности назначить для кнопки макроса (выведенного на панель быстрого доступа в редакторе Word 2007) своей иконки.
Как известно, в прежних версиях редактора можно было назначить для любой команды на панели инструментов свою собственную картинку. Можно было отредактировать иконку на кнопке или нарисовать собственную с помощью окна Редактор кнопок:

В редакторе Word 2007 этой возможности нет.
Однако, на прошлой неделе я просматривал сайт Грэга Макси (Greg Maxey) и обнаружил у него , в которой он предлагает свое решения этой проблемы.
Мне показалось интересной его статья и я повторил эксперимент.
Все удалось, но многое пришлось додумывать самостоятельно. В этой заметке я расскажу своими словами суть решения и покажу, как можно назначить свою иконку для собственных макросов.
Во-первых, необходимо скачать и установить у себя специальную программу для редактирования XML-скриптов - . Можно использовать и альтернативный редактор (с дополнительными функциями), созданный Максимом Новиковым - .
Замечу также, что на своем сайте Максим опубликовал замечательную статью-инструкцию в трех частях .
Во-вторых, подготовьте картинку для вашей иконки-кнопки. Она должна быть в формате 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.
- В поле Выбрать команды из: выбираете строку Все команды. Ниже в панели появляется список всех доступных команд редактора.
- Находите и выбираете вашу команду (в моем случае это "Моя кнопка"):

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

Вот и все!


Поиск
Рубрики
Подписка
Читают
Обсуждают
страницы
сайты
статистика
Комментариев: 16
Тогда уж и общую статью этого автора по "Customizing Ribbon" - http://gregmaxey.mvps.org/Customize_Ribbon.htm
Добрый день, Антон.
Хочу в начале поблагодарить за действительно полезный сайт, таких сейчас немного - с удовольствием читаю его и мотаю себе на ус все хитрости Word'а
Вы делаете хорошую работу, спасибо Вам за это!
Теперь к моей проблеме: у меня есть документ в Word'е, в котором большая двухколоночная таблица с текстом (англо-русский словарь слов и выражений). Мне нужно удалить в этой таблице все одиночные слова - т.е. если в одной из ячеек строчки или в обоих встречается одно единственное слово, эту строку таблицы надо удалить. Если слов в ячейке больше одного, строчку нужно оставить - и так для всей таблицы. Возможно ли это дело как-нибудь автоматизировать? Пробовал искать единичное слово с помощью регулярных выражений, что-то не получилось :(
Очень надеюсь на Ваш ответ - документ очень большой, не хотелось бы выискивать одиночные слова вручную.
Заранее благодарю,
Алексей
Как-то после праздников туговато соображается.
Вот, что получилось на скорую руку.
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Небольшое замечание. В ячейках не должно быть лишних пробелов, знаков абзаца и прочей нечисти. Т.е., если слово в ячейке одно, то в ячейке кроме него и символа конца ячейки больше ничего не должно быть.
Александр Витер, огромное Вам спасибо!
Всё получилось, макрос работает, как часы. Теперь рутина мне не страшна =)
Ещё раз благодарю!
В Word 2007 намного больше иконок для кнопки макроса, чем в Word 2003. Вопрос:
Где находятся иконки для кнопки макроса (Word 2007)?
Можно ли туда добавить несколько своих иконок?
Если вы имеете в виду кнопки на панели быстрого доступа, то никак. Пользуйтесь тем, что есть
а можно ли такую же фишку и в excel 2007 проделать, а?
Можно!
Отлично! тогда распишу свою проблему по подробнее. в общем у меня есть куча макросов сохраненные в "личной книге макросов", т.е. они не привязанны к какой то одной книге. так ка их у меня уже много то их кнопки с трудом уже помещаются на панели бымтрого доступа, поэтому хочется создать свою вкладку "Мои макросы" на ленте и разместить кнопки макросов со своими рисунками в этой новой вкладке. есть какие нибудь предложения по решению такой проблемки?
Предлагаю более подробно описать формат самой команды onAction и формат заголовков соответствующих ей макросов.
Вот пару вопросов:
1. Где найти полную документацию по формату команды для свойства onAction и ему подобным? Интересуют варианты типа onAction="MyProject.MyModule.MyProcedure", onAction="!" и все остальные.
2. Где найти список всех элементов ленты и формат соответствующих им макросов onAction, onChange и др.?
onAction это не команда, а атрибут элемента ленты, определяющий имя макроса, выполняющегося при щелчке на этом элементе. Эти макросы называются процедурами обратного вызова или callbacks по-английски. Их полный список приведён здесь (на английском), так же как и список остальных атрибутов элементов управления.
Все процедуры обратного вызова в качестве одного из параметров имеют control As IRibbonControl, содержащий элемент управления, вызвавший эту процедуру.
При работе с интерфейсом я рекомендую использовать программу Ribbon XML Editor, которая автоматически генерирует шаблоны для процедур обратного вызова, если таковые были указаны для элемента управления.
В качестве примера использования динамических атрибутов и процедур обратного вызова предлагаю ознакомится с моей галереей для вставки изображений из папки.
Спасибо. C callbacks процедурами ситуация прояснилась.
Ribbon XML Editor - полезная и удобная вещь.
А насчет свойства onAction, я имед ввиду формат команды содержащейся в этом свойстве.
В 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В результате появится дополнительная вкладка с двумя кнопками. Нажатие на одну кнопку активирует или дезактивирует другую. Пример файла можно скачать здесь
А в Excel 2003, можно также сделать? И можно ли сделать так, чтобы в иконке было несолько кнопок для разных макросов. Заранее благодарю за ответ.
С появлением Office 2010 необходимость в создании ленты с помощью XML-кода отпала. Возможно ли редактировать созданные Word-ом ленты? Каким образом привязать картинку именно к макросу, а не к кнопке?
Нет, Никита, не отпала. И вы сами это поймёте, когда
начнётезахотите редактировать созданные Word'ом ленты, точнее ленту. Дело в том, что настройки ленты, изменённой при помощи стандартных средств, хранятся в одном файле и изменённая лента доступна всегда, вне зависимости от открытого документа. Если же вам, для вашего документа нужны свои вкладки, то придётся лезть в XML и править руками. Кроме того, в 2010-м нет возможности настроить Backstage (то, что заменило кнопку Office)