2016-12-09 7 views
2

Как я могу получить доступ к своим пользовательским элементам ленты?VBA прямой доступ к значениям элементов ленты

элементы выполнены в (.xlsm \ customUI \ customUI.xml)

<ribbon startFromScratch="false"> 
    <tabs> 
     <tab idMso="TabHome"> 
      <group id="MatrixGroup" label="xxx" insertBeforeMso="GroupClipboard"> 
       <button id="b1" label="111" imageMso="DataFormSource" onAction="asas" /> 
       <button id="b2" label="222" imageMso="ConditionalFormattingClearMenu" onAction="sasa" /> 
       <dropDown id="Drop" label=" Env" sizeString="WWWWWWWWW"> 
        <item id="Item1" label="1"/> 
        <item id="Item2" label="2"/> 
        <item id="Item3" label="3"/>    
        <item id="Item4" label="4"/> 
       </dropDown> 
      </group> 
     </tab> 
    </tabs> 
</ribbon> 

Мне нужно, чтобы получить выбрали DropDown имя элемента/идентификатор при щелчке по кнопке ID = "b1" так OnAction =» myMacro "для элемента dropDown не может помочь здесь.

Но в любом случае есть код, чтобы получить выпадающий элемент ID - может быть, вы можете преобразовать его назвать этот подпункт из другого Sub (который срабатывает при нажатии кнопки ID = «b1»)

Sub GetS(control As IRibbonControl, id As String, index As Integer) 
    If control.id = "Drop" Then 
    MsgBox id 
End If End Sub 

ответ

1

Есть несколько обратных вызовов вы можете использовать в этом случае:

  1. GetSelectedItemIndex: Я думаю, что это возвращает индекс выбранного элемента из управления Dropdown.
  2. GetItemLabel: Возвращает выбранный ярлык элемента из элемента управления ленты ниспадающего
  3. GetItemID: Возвращает идентификатор указанного Index элемента

Подписи для каждого из них:

Sub GetSelectedItemIndex(control As IRibbonControl, ByRef returnedVal) 

End Sub 

Sub GetItemLabel(control As IRibbonControl, Index As Integer, ByRef returnedVal) 

End Sub 

Sub GetItemID(control As IRibbonControl, Index As Integer, ByRef id) 

End Sub 

Вы исправьте, что вы можете передать объект control из одного обратного вызова в другой (по сути, вручную вызывая/запуская процедуру обратного вызова для них).

Я не в состоянии проверить это, поэтому я немного перехожу от памяти и немного догадываюсь, вам может понадобиться настроить это и самостоятельно отлаживать, но, надеюсь, это полезно. То, как это должно было бы работать, если я правильно помню, когда вызывается обратный вызов sasa, вам необходимо вручную вызвать GetSelectedItemIndex, а затем GetItemLabel, передав соответствующий объект control.

Это сложная часть, держа ручку на dropDown control объект.

Практически говоря, есть некоторые трудности с объектом ленточки, и я нашел, что это было более легко работать с загрузкой его сначала в объект пользовательского класса (с сохранением ссылки прямых объектов для каждого из элементов управления в Dictionary собственности, с помощью управляющего имени/id), чтобы я мог передавать их по желанию из других процедур). В этом here есть некоторый фон, который может быть достаточным для того, чтобы с точки зрения настройки объекта класса вам просто нужно добавить другое свойство Get и Let в качестве типа Dictionary, чтобы вы могли добавить каждый элемент управления лентой к ДИКТ. Если у вас возникли проблемы с этой реализацией, задайте отдельный вопрос по этому вопросу, и я постараюсь помочь.

Итак, когда вы можете получить доступ соответствующий элемент управления, необходимо передать этот объект в GetSelectedItemIndex т.д .:

Dim ctrl as IRibbonControl 
Dim itm_id, itm_index 
Set ctrl = {some object reference to the dropDown control} 

Call GetSelectedItemIndex(ctrl, itm_index) 
Call GetItemId(ctrl, itm_index, itm_id) 
MsgBox(itm_id)