Итак, задача: сформировать список из элементов автотекста, содержащихся в шаблоне, на котором основан документ. При выборе элемента из списка, вставлять его в документ.
Как всегда, начнём с XML-схемы. На ленту поместим группу "Автотекст" с выпадающим списком и кнопкой для обновления этого списка, если при работе с документом мы добавим элемент автотекста шаблон. В качестве списка я буду использовать не comboBox, а dropDown. Они абсолютно идентичны, но comboBox позволяет принимать текст, введённый пользователем. Нам это не нужно, поэтому используем dropDown.
<?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>
Пояснения к атрибутам элемента dropDown.
- onAction — процедура, вызываемая при нажатии на пункте списка
- getItemLabel — процедура для задания текста элемента списка
- getItemSupertip — процедура для задания текста расширенной подсказки элемента списка
- getItemCount — процедура для задания количества элементов списка
- getItemID — процедура для задания идентификаторов элементво списка (необязательная)
- getSelectedItemIndex — процедура для выбора определённого элемента списка
Кнопка совершенно обычная и никаких трудностей у вас не должна вызвать, если вы дошли до создания списка. Если же возникли трудности, то ознакомьтесь с этой заметкой. Сохраняем шаблон и открываем его в Word, не забыв перед этим получить заготовку для кода VBA. Для этого в программе Ribbon XML Editor, которую я настоятельно рекомендую к использованию, предусмотрена специальная функция

Теперь код VBA. Открываем шаблон в Word, импортируем сохранённый модуль с процедурами ленты и доводим его до такого состояния:
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
В результате получим вот такой симпатичный список

В конце, несколько замечаний. Как видно из кода, для выборки элементов автотекста используется только одна категория: "Общие". Если автотекст распределён по нескольким категориям, они не будут видны. Если нужно распределить по категориям, то либо создавать столько списков, сколько в шаблоне категорий автотекста, либо использовать не список, а динамическое меню. Естественно это потребует переделки кода.
Пример шаблона