2017-02-20 23 views
2

ComboBox1の値によってダイナミックに変更されたListView3のアイテムでComboBox3をロードする必要があります。VBA - 動的に作成されたリストビューからコンボボックスに項目を追加

このようなことは可能ですか?

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 

フィルタ値のサブ:

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

「dinamically change」という意味ではありません。私はちょうど推測ですが、次の例を見てください。あなたのデータ構造が画像であり、ComboBox1にA、B、Cをロードし、combo1でAを選択した後、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

これは悪い考えではありませんが、私は少し誤解されました。スクリプトを使用している場合。リストビューを含まない辞書では、1つのカラムだけをロードする必要があります。 [link](http://imgur.com/a/fiNd5) – Nataniell

+0

私の質問に正確にフィットするようにコードを編集しました。これはどうやって解決するのかは違うが、役に立つ。ありがとうございました – Nataniell

1

AddItemメソッド()メソッドは、一度にリストビューアイテムの全体を通過しているように見える、1つの目的は、一度に追加することを可能にします。代わりに、ListViewアイテムを繰り返し処理する必要があります。

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

またはループなしでトランスポーズしてください(@ Shai Rado answer [here](http://stackoverflow.com/a/42326890/1726522)を参照)。 – CMArg

+0

非常に賢い、それを考えなかった! – aitchpat

+0

@aitchpat Hm、これはComboBoxを塗りつぶす方法ですが、古いアイテムを削除することなく、私は必要なものではありません。 (ComboBox.clearはここでは使用できません)とにかくこれに感謝します。これは私の質問に対する答えです。リストフィルタとコンボボックスの動作方法を変更する必要があります。 – Nataniell

関連する問題