Как установить выбранный элемент в пользовательском элементе управления ленты DropDown

Я создаю пользовательскую вкладку для Excel с помощью пользовательского редактора пользовательского интерфейса, и у меня есть два элемента управления DropDown. Назовем их DropDown1 и DropDown2. Моя цель состоит в том, что всякий раз, когда я меняю выбор DropDown1, он автоматически меняет выбор DropDown2, но я не знаю, как установить «SelectedItem» в элементе управления DropDown.

Пока у меня есть функция VBA, которая запускается каждый раз, когда я меняю выбор DropDown1, я думаю, что это может быть полезно.


person Oliver Mohr Bonometti    schedule 23.04.2017    source источник
comment
Являются ли эти раскрывающиеся списки проверки данных или поля со списком ActiveX? Вы должны опубликовать код, чтобы не было путаницы.   -  person Amorpheuses    schedule 24.04.2017
comment
@Amorpheuses Это элемент управления DropDown, добавленный на ленту Excel. Это объект: msdn.microsoft.com/ en-us/library/dd947478(v=office.12).aspx   -  person Oliver Mohr Bonometti    schedule 24.04.2017


Ответы (1)


Вам нужно добавить функцию обратного вызова в XML-код ленты в редакторе пользовательского интерфейса, а затем добавить соответствующий код в проект VBA, который будет вызываться, когда вкладка ленты становится недействительной. Обратный вызов, который вам нужен, чтобы установить выбранный элемент для раскрывающегося списка, — это либо getSelectedItemIndex, либо getSelectedItemID, в зависимости от того, хотите ли вы выбрать элемент по индексу или по идентификатору. Поскольку вы не предоставили никакого кода, мой пример является общим (и не проверенным):

XML ленты:

<dropDown id="drpTest" label="Test dropdown" getSelectedItemIndex="drpTestGetSelectedItem" ></dropDown>

Обратный вызов VBA

'Callback for drpTest getSelectedItemIndex
Sub drpTestGetSelectedItem(control As IRibbonControl, ByRef returnedVal)
    returnedVal = 1   '***** To select the item with index 1,
                      '***** replace with code to select the desired item
End Sub

ИЗМЕНИТЬ:

Пример, когда индекс выбирается на основе другого выпадающего списка. В подобных решениях я установил значение в функции onAction одного элемента управления и использовал его для установки выбранного индекса в другом элементе управления, что-то вроде следующего:

XML ленты:

<dropDown id="drpTest1" label="Test dropdown 1" onAction="drpTest1OnAction" ></dropDown>
<dropDown id="drpTest2" label="Test dropdown 2" getSelectedItemIndex="drpTest2GetSelectedItem" ></dropDown>

Обратные вызовы VBA

Global myRibbon As IRibbonUI
Global giIndex As Integer

'Callback for customUI.onLoad
Sub RibbonOnLoad(ribbon As IRibbonUI)
    '***** Save reference to ribbon object to invalidate
    Set myRibbon = ribbon
End Sub

'Callback for drpTest1 onAction
Sub drpTest1OnAction(control As IRibbonControl, id As String, index As Integer)
    '***** Set selected item variable for drpTest2
    giIndex = index
    '***** Tell Excel to redraw ribbon
    '(you could invalidate only parts of the ribbon with InvalidateControl
    'or InvalidateControlMso)
    myRibbon.Invalidate
End Sub

'Callback for drpTest2 getSelectedItemIndex
Sub drpTest2GetSelectedItem(control As IRibbonControl, ByRef returnedVal)
    '***** Return selected item for drpTest2 based on value stored in giIndex
    returnedVal = giIndex
End Sub
person Olle Sjögren    schedule 24.04.2017
comment
Спасибо Оле! Но я все еще не понимаю, как это сделать. Итак, у меня есть 2 DropDown (и, как я понял), у меня будет 2 функции getSelectedItemIndex. Эти функции будут вызываться при изменении выбора DropDown. Так что в моем случае в функции getSelectedItemIndex моего DropDown1 нужен некоторый код, который устанавливает SelectedItem в DropDown2. Я до сих пор не знаю, как это сделать. Я был бы признателен за помощь в этом. - person Oliver Mohr Bonometti; 03.05.2017
comment
getSelectedItemIndex вызывается, когда лента признана недействительной и ее необходимо перерисовать, поэтому вы используете ее, чтобы решить, какой индекс будет выбран. Как вы решаете, какой индекс зависит от вас. Добавлю один пример к моему ответу. - person Olle Sjögren; 08.05.2017
comment
Я искал это в течение довольно долгого времени... спасибо, Олле! - person rohrl77; 24.09.2018
comment
@OlleSjögren, если вы можете помочь мне с этим, пожалуйста, дайте мне знать. Я боролся с чем-то почти таким же, как это! - person Eitel Dagnin; 29.07.2019
comment
Надеюсь, это не противоречит правилам сообщества... @OlleSjögren Мой вопрос опубликован здесь: stackoverflow.com/questions/57215698/ - Если у вас есть возможность посмотреть. - person Eitel Dagnin; 29.07.2019