VBA-получить выбранное значение Combobox


У меня есть тысячи ячеек в рабочем листе Excel, которые являются ComboBoxes. Пользователь выберет один из них наугад и заполнит его.

Как получить выбранное значение ComboBox? Есть ли способ вызвать функцию (то есть обработчик событий), когда выбраны ComboxBoxes?

3 7

3 ответа:

Если вы имеете дело со списками проверки данных, вы можете использовать событие Worksheet_Change. Щелкните правой кнопкой мыши на листе с проверкой данных и выберите Просмотр кода. Затем введите следующее:

Private Sub Worksheet_Change(ByVal Target As Range)

    MsgBox Target.Value

End Sub

Если вы имеете дело с ActiveX comboboxes, это немного сложнее. Вам нужно создать пользовательский модуль класса для подключения событий. Во-первых, создать модуль класса с именем CComboEvent и поместить этот код в нем.

Public WithEvents Cbx As MSForms.ComboBox

Private Sub Cbx_Change()

    MsgBox Cbx.Value

End Sub

Далее создайте другой модуль класса CComboEvents. Эта воля держите все наши экземпляры CComboEvent и держите их в области действия. Поместите этот код в CComboEvents.

Private mcolComboEvents As Collection

Private Sub Class_Initialize()
    Set mcolComboEvents = New Collection
End Sub

Private Sub Class_Terminate()
    Set mcolComboEvents = Nothing
End Sub

Public Sub Add(clsComboEvent As CComboEvent)

    mcolComboEvents.Add clsComboEvent, clsComboEvent.Cbx.Name

End Sub

Наконец, создайте стандартный модуль (не модуль класса). Вам понадобится код, чтобы поместить все ваши comboboxes в модули класса. Вы можете поместить это в процедуру Auto_Open, чтобы это происходило всякий раз, когда книга открыта, но это зависит от вас.

Вам понадобится Открытая переменная для хранения экземпляра CComboEvents. Обнародование этой информации позволит сохранить ее и всех ее детей в полном объеме. Они нужны вам в области действия,чтобы события запускались. В этой процедуре выполните цикл через все comboboxes, создавая новый экземпляр CComboEvent для каждого из них и добавляя его к CComboEvents.

Public gclsComboEvents As CComboEvents

Public Sub AddCombox()

    Dim oleo As OLEObject
    Dim clsComboEvent As CComboEvent

    Set gclsComboEvents = New CComboEvents

    For Each oleo In Sheet1.OLEObjects
        If TypeName(oleo.Object) = "ComboBox" Then
            Set clsComboEvent = New CComboEvent
            Set clsComboEvent.Cbx = oleo.Object
            gclsComboEvents.Add clsComboEvent
        End If
    Next oleo

End Sub

Теперь, всякий раз, когда combobox изменяется, событие будет срабатывать, и в этом примере появится окно сообщения.

Пример можно посмотреть на странице https://www.dropbox.com/s/sfj4kyzolfy03qe/ComboboxEvents.xlsm

Вы можете использовать приведенное ниже событие change, которое сработает, когда значение combobox изменится.

Private Sub ComboBox1_Change()
'your code here
End Sub

Также вы можете получить выбранное значение, используя ниже

ComboBox1.Value

Возможно, вы сможете установить обработчики событий программно, используя что-то вроде (псевдокод)

sub myhandler(eventsource)
  process(eventsource.value)
end sub

for each cell
  cell.setEventHandler(myHandler)

Но я не знаю синтаксиса для достижения этого в VB/VBA, или если это вообще возможно.