2017-02-20 5 views
2

Мне нужно загрузить ComboBox3 с элементами из ListView3, которые динамически изменяются по значению в ComboBox1.VBA - Добавить элемент в combobox из динамически созданного списка view

Можно ли сделать что-то подобное?

Private Sub ComboBox1_Change() 
Call filterlist 

'This line is what I need to change. Not working in this way 
UserForm1.ComboBox3.AddItem = ListView3.ListItems 
End Sub 

Sub для фильтрации значений:

Private Sub filterlist() 
Dim item As ListItem 
Dim i As Long 
Dim ws As Worksheet 
Dim sonsat As Long 

Set ws = Sheets("data") 

ListView3.ListItems.Clear 

sonsat = ws.Cells(Rows.Count, 3).End(xlUp).Row + 1 

For i = 2 To sonsat 
    If ws.Cells(i, 3).Value = ComboBox1.Text Then 
     Set item = ListView3.ListItems.Add(, , ws.Cells(i, 1)) 
    item.ListSubItems.Add Text:=ws.Cells(i, 2) 
    item.ListSubItems.Add Text:=ws.Cells(i, 3) 


    End If 
Next i 
End Sub 
+0

Насколько я знаю, когда-то комбо-бокс оказывается единственным способом добавления к списку уничтожить комбо-бокс и воссоздать его - с обновленным списком значений. – Amorpheuses

ответ

1

Я не понимаю, что вы подразумеваете под «динамическим изменением». Я просто догадываюсь, но смотрю следующий пример. Если ваша структура данных является изображением, и вы хотите загрузить A, B и C в свой ComboBox1, и после выбора A в combo1 вы хотите, чтобы combo2 заполнил 101, 1010, 102 и так, попробуйте код ниже.

enter image description here

Private Sub UserForm_Initialize() 
    Dim dU1 As Object, cU1 As Variant, iU1 As Long, lrU As Long 
    Dim i As Integer 

    Set dU1 = CreateObject("Scripting.Dictionary") 
    lrU = Worksheets("Data").Cells(Rows.Count, 1).End(xlUp).Row 
    cU1 = Worksheets("Data").Range("A2:A" & lrU) 'Starts in second row. First row left for titles 
    For iU1 = 1 To UBound(cU1, 1) 
     dU1(cU1(iU1, 1)) = 1 
    Next iU1 

    'now dU1 has unique values from column A 

    For i = 0 To dU1.Count - 1 
     ComboBox1.AddItem dU1.Keys()(i) 'Load Combobox1 with unique values from Column A 
    Next 

End Sub 

Private Sub ComboBox1_Change() 
    Dim lLastRow As Long 
    Dim i As Integer 

    ComboBox2.Clear 
    lLastRow = Cells(Rows.Count, 1).End(xlUp).Row 

    For i = 1 To lLastRow 
     If Worksheets("Data").Cells(i, 1) = ComboBox1.Text Then 
      ComboBox2.AddItem (Worksheets("Data").Cells(i, 2)) 
     End If 
    Next 
End Sub 
+0

Это неплохая идея, но я был немного непонят. Если вы используете скрипты. словарь без include listview, тогда мне нужно загрузить только один столбец. Проверьте мой пример img. [ссылка] (http://imgur.com/a/fiNd5) – Nataniell

+0

Я отредактировал ваш код для точной подгонки к моему вопросу. Это по-другому, как решить это, но полезно. спасибо – Nataniell

1

Метод AddItem() позволяет только один объект, который будет добавлен в то время, это выглядит, как вы передаете полноту элементов ListView сразу. Вместо этого вы должны перебирать элементы ListView:

For Each item in ListView3.ListSubItems 
    ComboBox.AddItem(item.Text) 
Next item 
+0

Или транспонируйте без цикла (см. @Shai Rado answer [здесь] (http://stackoverflow.com/a/42326890/1726522)). – CMArg

+0

Очень умный, не думал об этом! – aitchpat

+0

@aitchpat Hm, это способ заполнения ComboBox, но без удаления старых элементов не то, что мне нужно. (ComboBox.clear невозможно использовать здесь) В любом случае спасибо за это. Это ответ на мой вопрос. Мне нужно изменить способ работы фильтра списка и комбинированного блока прямо сейчас. – Nataniell

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