VBA-получить выбранное значение Combobox
У меня есть тысячи ячеек на листе Excel, которые являются ComboBoxes. Пользователь выберет один наугад и заполнит его.
Как получить выбранное значение ComboBox? Есть ли способ вызвать функцию (т. е. обработчик событий), когда выбраны ComboxBoxes?
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. Делая это публично будет kepp его и всех его детей, в объеме. Они нужны вам в области действия, чтобы события запускались. В процедуре выполните цикл через все 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
вы можете использовать приведенное ниже событие изменения, к которому будет запускаться, когда значение 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, или если это вообще возможно.
