2016-08-19 2 views
0

У меня есть диапазон в рабочей книге, который я бы хотел установить в список элементов в Combobox из одного из моих Userforms. Проблема в том, что диапазон может быть любого размера. В настоящее время я обрабатываю нулевой регистр, выйдя из Sub, но когда в диапазоне есть только один элемент.VBA Excel Добавление диапазона с динамическим размером в список Combobox

Когда есть один элемент, вместо того, чтобы возвратить массив элементов, он возвращает только один String элемент и ListBox дает мне ошибку: `Ошибка выполнения«381»: Не удалось установить свойство List. Недопустимый индекс массива свойств. Есть ли способ справиться с этим, кроме создания исключения для случая, когда есть только один элемент?

Введите код: Редактировать: Исправлена ​​ошибка, заключающаяся в том, чтобы точно представлять проблему.

Private Sub UserForm_Activate() 
    Dim formList As Variant 
    Dim lastRow As Long 
    lastRow = getLastRowInCol(Sheets("HiddenVariables"), "B") 
    If lastRow = 0 Or lastRow = 1 Then Exit Sub 
    formList = Sheets("HiddenVariables").Range("B2:B" & lastRow).value 'If lastRow =2 then run-time error 381 is thrown 
    Me.ComboBox.list = formList 
End Sub 

Same issue with solution

+0

Операторы сравнения один ' = 'в VBA, а не двойной' == '. False также считается нулевым, поэтому 'If Not CBool ​​(lastRow) Then Exit Sub' также подходит. – Jeeped

+0

Справа, исправлено это. Спасибо – RWA4ARC

+1

Вы можете попробовать вставить 'If Not IsArray (formList) Then formList = Array (formList)' перед 'Me.ComboBox.list = formList'. – Jeeped

ответ

1

Один подход заключается в использовании именованного диапазона и RowSource свойства ComboBox.

Определить именованный диапазон:

enter image description here

Тогда просто установите RowSource

Option Explicit 

Private Sub UserForm_Activate() 
    Me.ComboBox1.RowSource = "Sheet1!Combo_Source" 
End Sub 

Going вашим подходом, используйте:

If IsArray(formList) Then 
     Me.ComboBox1.List = formList 
    Else 
     Me.ComboBox1.List = Split(formList, "") '/Converts str to arr on the fly. 
    End If 
+1

Если я ошибаюсь, я думаю, вы также можете просто использовать «Me.ComboBox1.RowSource =» Sheet1! B2: B »и lastRow'. Который фактически полностью решает мою проблему. Спасибо, я слишком долго боролся с этим. – RWA4ARC

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