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, или если это вообще возможно.