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