Заполните поле со списком Custom Ribbon (время выполнения)

У меня есть поле со списком на пользовательской ленте, созданное с помощью CustomEditor (XML).

Я хотел бы изменить элементы со списком, когда я нажимаю командную кнопку, расположенную на листе Excel.

            <comboBox id="Combo3" getItemCount="Módulo4.Número_Elementos_Combobox" getItemID="Módulo4.Identificador_Items" getItemLabel="Módulo4.Texto_Items" image="Foto_Excel" onChange="Módulo1.Todos_Los_Combos">
            </comboBox>

Спасибо заранее. С уважением. Хосе.


person José Santos    schedule 15.05.2020    source источник


Ответы (1)


Вам потребуется использовать метод InvalidateControl объекта Ribbon, чтобы сделать кеш недействительным и обновить поле со списком.

Во-первых, если вы еще этого не сделали, вам необходимо включить параметр onLoad для вашего тега customUI в код RibbonX. Этот параметр задает процедуру обратного вызова VBA, которая будет выполняться при открытии книги, чтобы можно было создать объект ленты.

Затем вам нужно включить процедуры обратного вызова VBA для getItemCount, getItemLabel и getItemID. Когда поле со списком становится недействительным, вызывается getItemCount. Затем, в свою очередь, вызываются методы getItemLabel и getItemID.

В процедуре getItemCount вы указываете, сколько элементов вы хотите включить в поле со списком. В результате и getItemLabel, и getItemID вызываются одинаковое количество раз, поэтому идентификаторы и метки могут быть обновлены соответствующим образом.

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

Поскольку вы не предоставили все необходимые сведения, вот пример, который, надеюсь, вы сможете адаптировать под свои нужды.

Код RibbonX

<!--RibbonX Visual Designer 2.33 for Microsoft Excel CustomUI14 . XML Code produced on 2020/05/16-->
<customUI 
    xmlns="http://schemas.microsoft.com/office/2009/07/customui"
    onLoad="Initialize">
    <ribbon >
        <tabs >
            <tab 
                id="Tab1"
                label="Tab1">
                <group 
                    id="Group1"
                    label="Group1">
                    <comboBox 
                        id="Combo3"
                        label="MyCombobox"
                        getItemCount="Combo3_getItemCount"
                        getItemID="Combo3_getItemID"
                        getItemLabel="Combo3_getItemLabel"
                        getText="Combo3_getText"
                        onChange="Combo3_onChange"/>
                </group >
            </tab >
        </tabs >
    </ribbon >
</customUI >

Код VBA

Option Explicit

Dim myRibbon As IRibbonUI

'Callback for customUI.onLoad
Sub Initialize(ribbon As IRibbonUI)
    Set myRibbon = ribbon
End Sub

'Callback for Combo3 getItemCount (called once when the combobox is invalidated)
Sub Combo3_getItemCount(control As IRibbonControl, ByRef returnedVal)
    returnedVal = 10 'the number of items for combobox
End Sub

'Callback for Combo3 getItemID (called 10 times when combobox is invalidated)
Public Sub Combo3_getItemID(control As IRibbonControl, index As Integer, ByRef id)
    id = "ComboboxItem" & index + 1
End Sub

'Callback for Combo3 getItemLabel (called 10 times when combobox is invalidated)
Sub Combo3_getItemLabel(control As IRibbonControl, index As Integer, ByRef returnedVal)
    returnedVal = "Item" & index + 1
End Sub

'Callback for Combo3 getText
Sub Combo3_getText(control As IRibbonControl, ByRef returnedVal)
    returnedVal = "" 'clears the text from the combobox
End Sub

'Callback for Combo3 onChange
Sub Combo3_onChange(control As IRibbonControl, text As String)
    MsgBox "You have chosen " & text
End Sub

Sub UpdateCombo3()
    myRibbon.InvalidateControl "Combo3" 'invalidates the cache for the combobox
End Sub
person Domenic    schedule 16.05.2020
comment
Спасибо!!!! У меня все было хорошо закодировано, и мне не хватало толщины, чтобы сделать поле со списком недействительным. С уважением, Хосе. - person José Santos; 17.05.2020