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