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. Обнародование этой информации позволит сохранить ее и всех ее детей в полном объеме. Они нужны вам в области действия,чтобы события запускались. В этой процедуре выполните цикл через все 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