Разбираем по кусочкам новый «ленточный» интерфейс Word 2007. Здесь нет и не будет советов о том, как его сделать похожим на Word 2003. Только усовершенствования уже существующего. Также приглашаю посетить мой блог, посвященный работе с макросами в Word.

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

четверг, 25 декабря 2008 г.

Возникает вопрос: как все это получилось?
Само создание панели инструментов на ленте не представляет особой сложности и довольно подробно рассмотрено на уже упомянутом сайте Максима Новикова.
А как же прикрутить к нему собственные кнопки или меню, которые должны выполнять мои собственные макросы?
Начнем по порядку.
Во-первых, нужно создать кнопку, или любой другой элемент, который должен запускать на выполнение определенный макрос.
Во-вторых, нужно указать параметр onAction, в котором определить имя макроса, который, собственно и должен запускаться при нажатии на данную кнопку или пункт меню, что в общем-то одно и тоже.
В-третьих, написать правильно сам макрос.
Вот меню, которое я использую постоянно в своей работе. Оно еще не содержит всех пунктов, которые мне нужны, но уже работает.
Собственное меню для запуска макросов
1 <menu id="__MyMacroses" label="Макросы">
2 <menuSeparator id="__Separator1" title="Вставка в документ" />
3 <button id="InsertQuotes"
4 label="Взять в кавычки"
5 image="QUOTES.png"
6 onAction="MyButtonAction"
7 tag="Macroses.ВзятьВКавычки"
8 supertip="Выделенный текст заключается в угловые кавычки."/>
9 <button id="ConvertToRoman"
10 label="Сделать римской цифрой"
11 image="roman.png"
12 onAction="MyButtonAction"
13 tag="Macroses.СделатьРимскойЦифрой"
14 supertip="Выделенный текст преобразуется в римскую цифру."/>
15 <button id="InsertFormula"
16 label="Вставить формулу с нумерацией"
17 image="function.png"
18 onAction="MyButtonAction"
19 tag="Macroses.Формула_с_нумерацией"
20 supertip="Вставка формулы по центру страницы и нумерацией по правому краю"/>
21 <menuSeparator id="__Separator2" title="Правка документа" />
22 <button id="ClearDoubleParagraphs"
23 label="Удалить абзацы"
24 image="parags.png"
25 onAction="MyButtonAction"
26 tag="Macroses.Удалить сдвоенные абзацы"
27 supertip="Удаление 2-х и более символов абзаца подряд."/>
28 <button id="ClearDoubleSpaces"
29 label="Удалить пробелы"
30 onAction="MyButtonAction"
31 tag="Macroses.Удалить_лишние_пробелы"
32 supertip="Удаление 2-х и более пробелов подряд."/>
33 </menu>

Как видно из кода макроса он запускает на выполнение другой макрос, имя которого прописано в свойстве tag нашей кнопки. Этот простой маневр позволяет использовать только один макрос, для обработки нажатий на все кнопки. Главное, не забывать, что для каждой кнопки нужно указывать свое свойство tag.
Пока все.

8 коммент.:

Анонимный комментирует...

Не понятно, как назначить Макрос кнопке. Всё очень запутано.

shjort_pobjeri комментирует...

Имя макроса, который выполняется при нажатии на кнопку, содержится в атрибуте onAction

Александр комментирует...

При попытке запустить макрос по кнопке выдает ошибку несовпадения количества аргументов (Wrong number of arguments or invalid property assigment). Нет мыслей о причине?

Александр комментирует...

Иопть, в аргументах процедуры должно быть:
control As IRibbonControl.

alex.viter комментирует...

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

San4es_lsk комментирует...

И есчо вопрос - какие требования к картинкам для кнопок? Ибо нарисовал .png, положил её в директорию моего дока, прописал атрибут image у button, но рядом с кнопкой она появляться как-то не хочет.

alex.viter комментирует...

картинку нужно поместить в сам документ, а в XML-схеме прописать ссылку на картинку. Это удобно делать в программе Ribbon XML Editor и описано здесь:
http://novikovmaxim.narod.ru/products/ribbon/ribbon.htm
Или в блоге wordexpert.ru
http://wordexpert.ru/page/kak-naznachit-svoyu-ikonku-dlya-makrosa-v-word-2007

Александр комментирует...

Спасибо! Эта мысль как раз уже пришла мне вчера :).
Не могу избавиться от привычки сначала писать, а потом думать)