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

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

Как добавить свои команды в контекстное меню в Word 2007

Ранее я уже писал аналогичную заметку для редактора Word 2003. Но недавно ко мне обратились с вопросом о возможности добавления/изменения команд в контекстное меню редактора Word 2007. Я озадачился этим вопросом и стал искать информацию.

 

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

 

Я обнаружил информацию на англоязычных сайтах, посвященных программированию на VBA в Word. Для интересующихся предоставляю ссылки на источники:

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

 

Добавляем в меню существующую в Word-е команду, например, Специальная вставка.

Эта команда, позволяющая выбрать способ вставки в документ элементов с особым форматированием, в Ворд 2003 была доступна из меню Правка, а в Ворд 2007 команда находится в раскрывающемся меню при щелчке на кнопку Вставить на вкладке Главная в группе команд Буфер обмена.

 

Далее код (с комментариями). Если я в чем-то ошибся, прошу меня поправить.

Sub newItemToContextMenu()
'Добавляем новую команду (пункт меню) в контекстное меню, вызываемое по щелчку правой кнопкой мыши
Dim cb As CommandBar  'Объявляем переменные
Dim cbb As CommandBarButton
Dim cbc As CommandBarControl
CustomizationContext = NormalTemplate  'Сохраняем изменения настроек в глобальном шаблоне Normal.dotm
On Error GoTo Ex  'В случае ошибки переходим к метке
Set cb = CommandBars("text")  'Определяем конкретную панель (меню), куда будем вставлять нашу команду
Set cbb = cb.FindControl(ID:=755)  'Определяем ссылку на конкретный пункт (кнопку) меню для возможностей дальнейшего поиска этого элемента
If Not cbb Is Nothing Then Exit Sub 'Если пункт меню уже существует, то происходит выход из макроса без действий
Set cbb = cb.Controls.Add(Type:=msoControlButton, ID:=755, Parameter:="new", Before:=1, Temporary:=False)   'Создаем пункт меню "Специальная вставка"
Set cbb = Nothing 'Освобождаем переменную и память 
Ex: 'метка для ошибки
End Sub

В коде вы можете видеть идентификационный номер для команды Специальная вставка - 755. Вы можете заменить этот ID на другой номер нужной вам команды. Полный список команд с идентификаторами можно получить из файла CommandControlsID.zip (русские наименования команд) или CommandBarID.zip (английские наименования команд).

 

Вставленная нами команда будет находиться в самом верху контекстного меню. Об этом свидетельствует параметр Before:=1. Чтобы изменить расположение пункта меню, измените этот параметр на другое число.

 

Чтобы удалить этот пункт меню, выполните следующий макрос:

Sub RemoveItem()
'Удаление конкретного пункта (команды) из контекстного меню
Dim cb As CommandBar
Dim cbc As CommandBarControl
CustomizationContext = NormalTemplate
Set cb = CommandBars("Text")
For Each cbc In cb.Controls
   If cbc.Parameter = "new" Then  'Ищем параметр, который мы указывали в предыдущем макросе
      cbc.Delete
   End If
Next cbc
End Sub

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

Sub ResetCommandBar()
'Сброс пользовательских настроек для меню. Меню возвращается к оригинальному виду со стандартными командами.
Dim cb As CommandBar
CustomizationContext = NormalTemplate
Set cb = CommandBars("Text")
cb.Reset
End Sub

В следующий раз я расскажу о 2-ом варианте - макросе, который создает в контекстном меню ваши собственные раскрывающиеся пункты с вашими же командами.

 

Если вы не знаете, как подключить к документу и применить эти макросы, изучите следующие заметки с сайта:

Автоматическая запись макроса

Создание макроса из готового кода

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:

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

  1. Alexander Trofimov
    11.03.2008 в 11:38 | #1

    А поменять содержимое мини-меню, высвечивающегося при выделении текста можно? =)

  2. 11.03.2008 в 11:51 | #2

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

  3. Alexander Trofimov
    11.03.2008 в 11:59 | #3

    Ну... Предположим, что я заядлый ЖЖист и при этом фанат ворда (фантастика, наверное, но всякое бывает). Посему я люблю писать в блог из Winword и при этом часто пишу зачеркнутым текстом. Понятно, что как фанат WinWord я уже знаю shortcut для этого дела, но хотелось бы вынести поближе эту функцию. Чисто умозрительный сценарий и мне это не особенно нужно, просто это из разряда "F.A.Q" =)

  4. 12.03.2008 в 07:38 | #4

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

  5. Alexander Trofimov
    12.03.2008 в 09:55 | #5

    Антон, это кликать надо. А мини-меню появляется само - при выделении текста =)

    В общем, я согласен, что если есть настолько обыденный workaround, то городить огород, может и незачем. Но Вы таки подменили мой вопрос, я не спрашивал, как это обойти или нужно ли это. Я спрашивал - возможно ли это и если да, то как =)

  6. Олег
    07.12.2008 в 19:37 | #6

    Запустил макрос по Вашему исходнику добавления пункта "Специальная вставка". Пункт не добавился, а кнопка "Вставить" на закладке "Главная" стала неактивной.

  7. 07.12.2008 в 19:43 | #7

    Олег, попробуйте удалить эту команду (следующий макрос в заметке) и повторить. Только что сам еще раз проверил работоспособность макроса - все корректно.

  8. Олег
    08.12.2008 в 04:46 | #8

    Олег, попробуйте удалить эту команду (следующий макрос в заметке) и повторить. Только что сам еще раз проверил работоспособность макроса - все корректно.

    Пробовал удалять, запускал снова - не помогло. Где должна появиться кнопка "Специальная вставка" - на закладке "Главная" или на закладке "Вставка"? Макрос отдебагил по шагам, выполняется он корректно, в ошибку не вылетает.

    Суть в чем - "Специальная вставка" в настройках панели и так есть - ее можно вручную на панель быстрого запуска добавить. А мне нужно добавить кнопку "MS Equation" - ее в списке в настройках нет и в списке CommandControlsID тоже нет.

  9. 08.12.2008 в 07:40 | #9

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

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

  10. Андрей
    27.01.2009 в 14:32 | #10

    Здравствуйте, Антон.

    Расскажите, пожалуйста, Каким образом создается собственное меню в надстройках MS Word, которое бы появлялось при подключении dot-шаблона с макросами.

    Спасибо.

    27.01.2009

  11. 27.01.2009 в 15:22 | #11

    Здравствуйте, Антон.
    Расскажите, пожалуйста, Каким образом создается собственное меню в надстройках MS Word, которое бы появлялось при подключении dot-шаблона с макросами.
    Спасибо.
    27.01.2009

    Какой офис?

  12. Anna
    31.10.2009 в 13:29 | #12

    Здравствуйте, Антон. Скажите пожалуйста вы уже опубликовали статью о 2-ом варианте - макросе, который создает в контекстном меню собственные раскрывающиеся пункты с вашими же командами

  13. Юрий
    02.02.2010 в 22:41 | #13

    Вставил в собственное выпадающее меню (выпадает по шорткату) пункт

    .Controls.Add(Type:=msoControlButton, ID:=755, Parameter:="new", Before:=1, Temporary:=False)

    Он появился, но серый - disabled.

    Поменял ID на другой - тот же результат.

    В чем может быть причина disabled?

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

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

^ Наверх