2016-02-04 5 views
0

У меня есть следующий код в UserForm. Я пытаюсь добавить определенное подмножество comboboxes в форме в коллекцию, а затем пропустить эту коллекцию. Кажется, что добавление значения combobox к коллекции, а не сам объект управления ...? Какой идентификатор или свойство необходимо использовать, чтобы иметь возможность доступа к свойству .Text объекта combobox после его добавления в коллекцию?Как добавить объекты управления в пользовательскую форму в коллекцию, а затем прокрутить коллекцию и получить доступ к их свойствам?

'Put comboboxes in a collection 
Dim oColl As Collection 
Set oColl = New Collection 
Dim cb As Control 
For Each cb In Me.Controls 
    If TypeName(cb) = "ComboBox" Then 
     ' I suspect it may be this line going wrong: 
     If IsNumeric(cb.Text) Then oColl.Add (cb) 
    End If 
Next 

' Trying to loop through the collection of comboboxes 
' I've tried to declare ctrl as MSForms.ComboBox, ComboBox, Control, Object, 
' and Variant, results are the same... 
Dim ctrl As MSForms.ComboBox 
Dim i As Integer 
For i = 1 To oColl.count 
    For Each ctrl In oColl 
     ' This line produces an object required error on ctrl 
     If CInt(ctrl.Text) = line Then 

ответ

1

Вы так близко. Это просто некоторые синтаксические ошибки, т. Е. Collection.add с скобками за ним.

Пример: Проводя все сопоставимые формы в пользовательской форме, сохраняет те, у которых в коллекции есть число. Циклы через сбор и отображение сообщений для каждого combobox.text. Пожар на событие CommandButton1 click. Код идет в самом UserForm, так как мы ссылаемся me.controls

Private Sub CommandButton1_Click() 
    Dim oColl As Collection 
    Set oColl = New Collection 

    Dim cb As Control 

    For Each cb In Me.Controls 
    If TypeName(cb) = "ComboBox" Then 
     If IsNumeric(cb.Text) Then oColl.Add cb 'Indeed here you had unneeded brackets. Alternative would be "Call oColl.Add(cb)" 
    End If 
    Next cb 

    For Each cb In oColl 
    MsgBox cb.Text 
    Next cb 
    End Sub 

Edit: Вы можете просто объявить переменную ComboBox, но когда вы перебрать все элементы управления (For Each Control in Me.Controls) вы получите ошибку несоответствия типов.

+0

Большое спасибо! Знал, что это было, наверное, что-то простое. Почему скобки заставляют его добавлять значение combobox, а не самого объекта? – FredGooch

+1

@ JWarren, на который подробно ответили здесь ... http://stackoverflow.com/questions/5413765/what-are-the-rules-government-usage-of-brackets-in-vba-function-calls –

+0

Спасибо, что очистили много. У меня были странные проблемы с этим раньше, и я никогда не потрудился изучить настоящие правила. – FredGooch