Как я могу создать раскрывающийся список с двумя столбцами, который не является элементом управления ActiveX, где я могу программно заполнить это поле и использовать его в Excel VBA?

Фон

Предположим, у меня есть пример списка с (id, description) парами, полученными из базы данных, и список выглядит так:

1, aadvark
2, bubbles
3, carrot
4, depict

Что я хочу сделать:

Я хочу иметь возможность:

  1. программно скопировать извлеченные пары из базы данных в раскрывающийся список, где пользователь может выбрать один из вариантов списка
  2. дать пользователю возможность выбрать нужный description из списка выше
  3. Используйте id программно, например, покажите id во всплывающем окне MsgBox, чтобы подтвердить выбор пользователя.

Что я уже сделал

Я смог сделать это с помощью элемента управления ActiveX ComboBox, где я установил два столбца, первый столбец получает id, второй столбец получает description. Пользователь выбирает описание, и я использую получившееся id для дальнейшей обработки. Но у меня возникают проблемы, которые я не удается решить с помощью элементов управления ActiveX, поэтому я ищу другой способ, надеясь, что с другим подходом не возникнет проблем.

Можно ли сделать что-то подобное с полем со списком Form Control? Или напрямую с помощью ячеек Excel? Пожалуйста, порекомендуйте. В идеале я ищу ответ, содержащий код, в котором желаемая функциональность может быть достигнута либо с помощью поля со списком Form Control, либо с помощью конструкции Excel Cell и других собственных средств.


person Dennis    schedule 20.04.2021    source источник


Ответы (1)


Вы можете использовать поле со списком Form Control.

На данный момент у меня нет английской версии Excel, на которую я мог бы ссылаться, и я догадываюсь о фактических элементах меню, но щелкните правой кнопкой мыши поле со списком, которое вы внедрили, и выберите «Формат управления» (?), затем на крайней правой вкладке ( Control?), выберите первое текстовое поле (Input Range?) и выберите свой диапазон.

Предполагая, что у меня есть поле со списком с именем cbTest на рабочем листе 1, в модуле этого листа я могу ссылаться на него следующим образом.

Sub Test()
    Dim oCBTest As Object

    Set oCBTest = Me.Shapes("cbTest")
    
    With oCBTest

        Debug.Print .Name
        
        Debug.Print .ControlFormat.ListCount
    
        Debug.Print .ControlFormat.List(1)

    End With

    Set oCBTest = Nothing
    
End Sub

Замените Debug.Print на MsgBox, если вы не знаете, как использовать Immediate Window.

Эта ссылка показывает различные примеры, которые могут оказаться полезными.

person Andrew    schedule 20.04.2021