2013-03-20 5 views
7

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

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

+1

вы имеете в виду у вас есть вариант «проверки» в этих клетках ?? не настоящий combobox, который является объектом формы/формы ... –

+1

@KazJaw этот вопрос действительно нуждается в разъяснении :) Если OP имеет «тысячи» combobox, ему понадобятся тысячи обработчиков событий. В противном случае, если это только опция проверки, обработчик 'Worksheet_Change' сделает трюк. –

+0

@DavidZemens, в конце концов ... вы правы :) Итак, я думаю, что уже есть ответ на вопрос в вашем комментарии и ниже (от @ user20623626) –

ответ

6

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

Private Sub Worksheet_Change(ByVal Target As Range) 

    MsgBox Target.Value 

End Sub 

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

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

4

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

Private Sub ComboBox1_Change() 
'your code here 
End Sub 

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

ComboBox1.Value 
+1

Определенно это сработает, но если у OP действительно есть «тысячи», из списков comboboxes на листе, потребуются соответствующие тысячи подпрограмм; 1 для каждого выпадающего списка. –

+0

У меня нет тысяч comboboxes, всего 1, и я очень благодарен за пример. – YetAnotherRandomUser

-1

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

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

for each cell 
    cell.setEventHandler(myHandler) 

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

Смежные вопросы