Я уже рассказывал о динамических меню ранее:
- Динамические меню
- Динамические меню (продолжение)
- Динамические меню (продолжение 2)
- Динамические меню (продолжение 3)
Разбираем по кусочкам «ленточный» интерфейс Word 2007+. Здесь нет и не будет советов о том, как его сделать похожим на Word 2003. Только усовершенствования уже существующего. Также приглашаю посетить мой блог, посвященный работе с макросами в Word.
Напоминаю, что все коды программ, приведенные в блоге, вы используете на свой страх и риск. Не забывайте создавать резервные копии.
Вот уже месяц, как я начал настраивать поначалу недоступный интерфейс нового офиса. Как оказалось, информации на русском языке по этой теме совсем немного (я сумел найти 2 места где более или менее толково объясняется, что надо делать и куда нажимать).
Посему решил обратиться к мировому русско- украиноязычному сообществу с просьбой о совместной работе. Кстати, подвернулся и со своим
, поскольку не охота начинать такую тему на форуме.
Со своей стороны я уже немного разобрался как и где нажимать. Научился подключать к кнопкам свои макросы.
Пример моих кнопок:
Кого заинтересовала эта тема, милости просим.
На Украине (именно «на» а не «в» как хочется Задорнову) есть поговорка «Гуртом і батька легше бити», поэтому нужно подналечь и разобраться и этой темой.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | <menu id="__MyMacroses" label="Макросы"> <menuseparator id="__Separator1" title="Вставка в документ"/> <button id="InsertQuotes" image="QUOTES.png" label="Взять в кавычки" onaction="MyButtonAction" supertip="Выделенный текст заключается в угловые кавычки." tag="Macroses.ВзятьВКавычки"/> <button id="ConvertToRoman" image="roman.png" label="Сделать римской цифрой" onaction="MyButtonAction" supertip="Выделенный текст преобразуется в римскую цифру." tag="Macroses.СделатьРимскойЦифрой"/> <button id="InsertFormula" image="function.png" label="Вставить формулу с нумерацией" onaction="MyButtonAction" supertip="Вставка формулы по центру страницы и нумерацией по правому краю" tag="Macroses.Формула_с_нумерацией"/> <menuseparator id="__Separator2" title="Правка документа"/> <button id="ClearDoubleSpaces" label="Удалить пробелы" onaction="MyButtonAction" supertip="Удаление 2-х и более пробелов подряд." tag="Macroses.Удалить_лишние_пробелы"/> </menu> |
Sub УстановитьМежстрочныйИнтервал(editbox As IRibbonControl, text As String)/> Selection.ParagraphFormat.LineSpacing = LinesToPoints(Val(text)) End Sub
Public CustomRibbon As IRibbonUI 'указатель для хранения ссылки на ленту. Здесь необязателен, но рекомендуется Dim MyEvents As New EventClassModule 'конструктор класса для отслеживания событий Sub LoadRibbon(ribbon As IRibbonUI) 'загружаем ленту Set CustomRibbon = ribbon 'создаем указатель на ленту ribbon.Invalidate 'обновляем ленту Set MyEvents.App = Word.Application 'перенаправляем события из приложения в наш класс. End Sub Sub SetLineSpacing_GetText(control As IRibbonControl, ByRef text) text = PointsToLines(Selection.ParagraphFormat.LineSpacing) 'устанавливаем в поле ввода значение межстрочного интервала выделенного абзаца. End Sub
Sub DynMenuGetBookmarks_GetContent(control As IRibbonControl,ByRef content) ' 'Формирование меню с закладками документа ' Dim sXML As String Dim i As Integer Set bm = ActiveDocument.Bookmarks sXML = "" & vbCr '-------------------------- 'Разделитель '-------------------------- sXML = sXML & _ "" & vbCr '-------------------------- 'Кнопки с именами закладок '-------------------------- If bm.count = 0 Then sXML = sXML & _ " " 'возвращаем значение в компонент End Sub
Sub RefreshDynMenu_OnAction(control As IRibbonControl) 'Обновление динамического меню' CustomRibbon.Invalidate End Sub
Public Sub delbm_onAction(control As IRibbonControl) ' 'Удаление закладки при выборе ее в соответствующем меню ' bm.Item(control.Tag).Delete CustomRibbon.Invalidate End Sub
Sub GoToBookmark(control As IRibbonControl) ' 'Переход к закладке ' On Error Resume Next Selection.GoTo What:=wdGoToBookmark, Name:=control.Tag If Err.Number <> 0 Then MsgBox "Не удалось перейти к закладке «" & control.Tag & "»", vbOKOnly End If End Sub>
Public Sub menu_AddBookmark_onAction(control As IRibbonControl) ' 'Появление окна для добавления закладки в документ ' Dialogs(wdDialogInsertBookmark).Show CustomRibbon.Invalidate End Sub
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 | Sub DynMenuGetMacroAuto_GetContent(control As IRibbonControl, ByRef content) ' 'Формирование динамического меню со всеми макросами, доступными для данного документа ' Dim sXML As String 'строка, в которую записывается содержимое динамического меню Dim i, j, IDcounter As Integer 'счетчики циклов и идентификаторов компонентов Dim asModulesNames, asFuncNames As Variant 'массивы для хранения имен функций и модулей 'Начало формирования динамического меню sXML = "<menu xmlns=""" & "http://schemas.microsoft.com/office/2006/01/customui" & """>" & vbCr '-------------------------- 'Кнопка «Обновить» '-------------------------- sXML = sXML & vbTab & _ "<button id=""RefreshDynMenu"" " & _ "label=""Обновить"" " & _ "screentip=""Обновить содержимое этого меню"" " & _ "supertip=""Нажмите для обновления содержимого меню. Это необходимо делать, " & _ "если вы изменяете проект Visual Basic для данного документа. Или присоединяете " & _ "новые шаблоны."" " & _ "onAction=""RefreshDynMenu_OnAction"" " & _ "imageMso=""RecurrenceEdit""/>" & vbCr & vbTab & _ "<menuSeparator id=""MenuSep1""/>" & vbCr '---------------------------------------------------------------------- 'Формирование пунктов меню для каждого доступного шаблона с макросами '---------------------------------------------------------------------- Dim oTemplate As Object 'объект для шаблона из которого будут читаться макросы Dim bLockedProjOpened As Boolean 'флаг для определения состояния шаблона: закрыт он или открыт для чтения For Each oTemplate In Application.templates bLockedProjOpened = False If oTemplate.VBProject.Protection = vbext_pp_locked Then Set oTemplate = Application.Documents.Open(oTemplate.FullName, ReadOnly:=True) bLockedProjOpened = True End If 'Записываем строку, начинающую меню для каждого шаблона. 'Пробелы для идентификаторов заменяем на нижнее подчеркивание. sXML = sXML & vbTab & _ "<menu id=""ID_" & Replace(oTemplate.Name, " ", "_") & IDcounter & """ " & _ "label=""Макросы из «" & oTemplate.Name & "»""> " & vbCr 'Счетчик для идентификаторов IDcounter = IDcounter + 1 'Попытка прочитать имена программных модулей из указанного шаблона On Error Resume Next asModulesNames = fGetModulesNames(oTemplate) 'читаем программные модули из шаблона и записываем их в наш массив 'Если произошла ошибка при чтении модулей, то выводится сообщение и процедура прерывается. If Err.Number <> 0 Then MsgBox "Не удалось прочитать список модулей из " & oTemplate.Name, vbOKOnly, "Ошибка при формировании меню" Err.Clear Exit Sub End If For j = 0 To UBound(asModulesNames) 'Разделитель меню для каждого программного модуля в проекте шаблона. sXML = sXML & vbTab & vbTab & _ "<menuSeparator id=""ID_" & Replace(oTemplate.Name, " ", "_") & IDcounter & """ " & _ "title=""" & asModulesNames(j) & """/> " & vbCr IDcounter = IDcounter + 1 'Попытка прочитать имена функций из указанного шаблона указанного модуля. On Error Resume Next asFuncNames = fGetFuncNames(oTemplate, oTemplate.VBProject.VBComponents(asModulesNames(j))) 'Если произошла ошибка при чтении имен функций, то выводится сообщение и процедура прерывается. If Err.Number <> 0 Then MsgBox "Не удалось прочитать список функций из модуля " & asModulesNames(j) & _ " шаблона " & oTemplate.Name, vbOKOnly, "Ошибка при формировании меню" Err.Clear Exit Sub End If For i = 0 To UBound(asFuncNames) 'Создаем кнопку в меню, которая запускает соответствующий макрос. Путь к макросу записываем в свойство '«tag». При вызове макроса «onAction» свойство «tag» передается в качестве аргумента. Свойство «tag» 'записываем в виде ‹имя_проекта›.‹имя_модуля›.‹имя_макроса›. Это позволяет запускать любые макросы из 'загруженных проектов. sXML = sXML & vbTab & vbTab & _ "<button id=""menubtn_" & asModulesNames(j) & IDcounter & """ " & _ "label=""" & asFuncNames(i) & """ " & _ "tag=""" & oTemplate.VBProject.Name & "." & asModulesNames(j) & "." & asFuncNames(i) & """ " & _ "onAction=""MyButtonAction""" & "/>" & vbCr IDcounter = IDcounter + 1 Next i Next j 'Заканчиваем формирование меню с макросами для данного шаблона sXML = sXML & vbTab & "</menu>" & vbCr 'Проверяем открывался ли закрытый для просмотра документ. Если да, то закрываем его. If bLockedProjOpened Then oTemplate.Close End If Next oTemplate 'Добавляем стандартные кнопки управлением средой Visual Basic через разделитель sXML = sXML & vbTab & _ "<menuSeparator id=""MenuSep2"" title=""Visual Basic for Application""/>" & vbCr & vbTab & _ "<control idMso=""MacroPlay"" showLabel=""false""/>" & vbCr & vbTab & _ "<control idMso=""MacroRecordOrStop"" showLabel=""false""/>" & vbCr & vbTab & _ "<control idMso=""MacroRecorderPause"" showLabel=""false""/>" & vbCr & vbTab & _ "<control idMso=""VisualBasic"" showLabel=""false""/>" & vbCr 'Завершаем формирование меню content = sXML & "</menu>" 'Отладочные строки. Нужны для просмотра готового кода в редакторе XML. При нормальной работе эти строки 'нужно закомментировать. '''''''''''''''''''''''' Selection.InsertAfter content '''''''''''''''''''''''' Selection.Cut |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 | <menu xmlns="http://schemas.microsoft.com/office/2006/01/customui"> <button id="RefreshDynMenu" label="Обновить" screentip="Обновить содержимое этого меню" supertip="Нажмите для обновления содержимого меню. Это необходимо делать, если вы изменяете проект Visual Basic для данного документа. Или присоединяете новые шаблоны." onAction="RefreshDynMenu_OnAction" imageMso="RecurrenceEdit"/> <menuSeparator id="MenuSep1"/> <menu id="ID_Шаблон_с_панелью_инструментов_и_макросами.dotm0" label="Макросы из «Шаблон с панелью инструментов и макросами.dotm»"> <menuSeparator id="ID_Шаблон_с_панелью_инструментов_и_макросами.dotm1" title="Macroses"/> <button id="menubtn_Macroses2" label="ФормулаСНумерацией" tag="ПроектСМакросамиИЛентой.Macroses.ФормулаСНумерацией" onAction="MyButtonAction"/> <button id="menubtn_Macroses3" label="ВзятьВКавычки" tag="ПроектСМакросамиИЛентой.Macroses.ВзятьВКавычки" onAction="MyButtonAction"/> <button id="menubtn_Macroses4" label="УвеличитьШрифт" tag="ПроектСМакросамиИЛентой.Macroses.УвеличитьШрифт" onAction="MyButtonAction"/> <button id="menubtn_Macroses5" label="УменьшитьШрифт" tag="ПроектСМакросамиИЛентой.Macroses.УменьшитьШрифт" onAction="MyButtonAction"/> <button id="menubtn_Macroses6" label="СделатьРимскойЦифрой" tag="ПроектСМакросамиИЛентой.Macroses.СделатьРимскойЦифрой" onAction="MyButtonAction"/> </menu> <menu id="ID_Normal.dotm7" label="Макросы из «Normal.dotm»"> <menuSeparator id="ID_Normal.dotm8" title="ThisDocument"/> <button id="menubtn_ThisDocument9" label="Формула_с_нумерацией" tag="Normal.ThisDocument.Формула_с_нумерацией" onAction="MyButtonAction"/> <button id="menubtn_ThisDocument10" label="ВзятьВКавычки" tag="Normal.ThisDocument.ВзятьВКавычки" onAction="MyButtonAction"/> <button id="menubtn_ThisDocument11" label="УвеличитьШрифт" tag="Normal.ThisDocument.УвеличитьШрифт" onAction="MyButtonAction"/> <button id="menubtn_ThisDocument12" label="УменьшитьШрифт" tag="Normal.ThisDocument.УменьшитьШрифт" onAction="MyButtonAction"/> <menuSeparator id="ID_Normal.dotm13" title="NewMacros"/> <button id="menubtn_NewMacros14" label="BigCardText" tag="Normal.NewMacros.BigCardText" onAction="MyButtonAction"/> <button id="menubtn_NewMacros15" label="EndOfWord" tag="Normal.NewMacros.EndOfWord" onAction="MyButtonAction"/> <button id="menubtn_NewMacros16" label="СделатьРимскойЦифрой" tag="Normal.NewMacros.СделатьРимскойЦифрой" onAction="MyButtonAction"/> <button id="menubtn_NewMacros17" label="Макрос2" tag="Normal.NewMacros.Макрос2" onAction="MyButtonAction"/> </menu> <menuSeparator id="MenuSep2" title="Visual Basic for Application"/> <control idMso="MacroPlay" showLabel="false"/> <control idMso="MacroRecordOrStop" showLabel="false"/> <control idMso="MacroRecorderPause" showLabel="false"/> <control idMso="VisualBasic" showLabel="false"/> </menu> |
<?xml version="1.0" encoding="UTF-8" standalone="yes"?> <customUI xmlns="http://schemas.microsoft.com/office/2006/01/customui" onLoad="RibbonLoading"> <ribbon startFromScratch="false"> <tabs> <tab idMso="TabHome"> <group id="grAutoText" label="Автотекст"> <dropDown id="ddAutoText" onAction="ddAutoText_onAction" getItemLabel="ddAutoText_getItemLabel" getItemSupertip="ddAutoText_getItemSupertip" getItemCount="ddAutoText_getItemCount" getItemID="ddAutoText_getItemID" getSelectedItemIndex="ddAutoText_getSelectedItemIndex" > </dropDown> <button id="btnRefresh" label="Обновить" imageMso="RecurrenceEdit" onAction="btnRefresh_onAction" /> </group> </tab> </tabs> </ribbon> </customUI>
Option Explicit Dim tmp As Template Dim bb As BuildingBlocks Dim MyRibbon As IRibbonUI ' (компонент: customUI, атрибут: onLoad), 2007 Sub RibbonLoading(ribbon As IRibbonUI) Set tmp = ActiveDocument.AttachedTemplate Set bb = tmp.BuildingBlockTypes(wdTypeAutoText).Categories("Общие").BuildingBlocks Set MyRibbon = ribbon End Sub 'ddAutoText (компонент: dropDown, атрибут: onAction), 2007 Sub ddAutoText_onAction(control As IRibbonControl, selectedId As String, selectedIndex As Integer) bb(selectedIndex).Insert Where:=Selection.Range, RichText:=True End Sub 'ddAutoText (компонент: dropDown, атрибут: getItemLabel), 2007 Sub ddAutoText_getItemLabel(control As IRibbonControl, index As Integer, ByRef label) label = bb(index + 1).Name End Sub 'ddAutoText (компонент: dropDown, атрибут: getItemSupertip), 2007 Sub ddAutoText_getItemSupertip(control As IRibbonControl, index As Integer, ByRef superTip) superTip = bb(index + 1).Value End Sub 'ddAutoText (компонент: dropDown, атрибут: getItemCount), 2007 Sub ddAutoText_getItemCount(control As IRibbonControl, ByRef count) ' Dim tmp As Template count = bb.count End Sub 'ddAutoText (компонент: dropDown, атрибут: getItemID), 2007 Sub ddAutoText_getItemID(control As IRibbonControl, index As Integer, ByRef id) id = bb(index + 1).Name End Sub 'ddAutoText (компонент: dropDown, атрибут: getSelectedItemIndex), 2007 Sub ddAutoText_getSelectedItemIndex(control As IRibbonControl, ByRef index) index = 0 End Sub 'btnRefresh (компонент: button, атрибут: onAction), 2007 Sub btnRefresh_onAction(control As IRibbonControl) MyRibbon.InvalidateControl "ddAutoText" End Sub