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 здесь не может помочь.

Но в любом случае есть код для получения идентификатора выпадающего элемента - возможно, вы можете преобразовать его для вызова этого саба из другого 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: Я думаю, что это возвращает позицию индекса выбранного элемента из выпадающего списка.
  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объект.

Практически говоря, с объектом Ribbon есть некоторые трудности, и я обнаружил, что с ним легче работать, первоначально загружая его в объект пользовательского класса (сохраняя прямые ссылки на объекты для каждого из элементов управления вDictionary свойство, с ключом управления именем / идентификатором), чтобы я мог передать их по желанию из других процедур). Здесь есть некоторый фон, который может быть достаточен для продолжения, с точки зрения настройки объекта Class, вам просто нужно добавить другое свойство Get а также Let процедура как Dictionary введите, чтобы вы могли добавить каждый элемент управления ленты в DICT. Если у вас есть проблемы с этой реализацией, пожалуйста, задайте отдельный вопрос, и я постараюсь помочь.

Итак, когда вы можете получить доступ к соответствующему элементу управления, вы передаете этот объект 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)
Другие вопросы по тегам