【VBA】ユーザーフォムのコンボボックスのリストに重複を省いて値を追加する


ユーザーフォムのコンボボックス

前回、コンボボックスに値を追加する記事を書きましたが
今回は重複を省きながら値を追加します。
例えば同じ日付があるデータなどをコンボボックスのリストにしたいときなどに使います。

以下のコンボボックスに登録日のデータを重複を省いて追加します。
    
登録日のデータをコンボボックスのリストと照合して一致したら、そのリストを選択します。
重複がない場合は何も選択されません。
なにも選択されていなかったら
重複してないってことで追加するというコードです。

Private Sub UserForm_Initialize()
    Dim DateCol As Long'IDの列番号を格納する変数
    DateCol = WorksheetFunction.Match("登録日", Master.Rows(1), 0)'Match関数で列数格納
    Dim LastRow As Long '最終行を格納する変数
    LastRow = Master.Cells(Rows.Count, DateCol).End(xlUp).Row'最終行格納
    Dim ChkDate As String'登録日を格納する変数
    Dim i As Long
    For i = 2 To LastRow
        ChkDate = Master.Cells(i, DateCol).Value
        cmbDate.ListIndex = -1'コンボボックスのリストインデックスを未選択にして初期化
    'コンボボックスのリスト項目を1つずつ確認して重複してたらその項目を選択して確認終了
        Dim c As Long
        For c = 0 To cmbDate.ListCount - 1'コンボボックスのリストをすべて繰り返し
            If cmbDate.List(c) = ChkDate Then'リストの項目が変数に入れた値と一緒だったら
                cmbDate.ListIndex = c'その項目を選択しておく
                Exit For'ループ終わり
            End If
        Next c
       'コンボボックスのリストで選択された項目が何もなかったら
        If cmbDate.ListIndex = -1 Then
            cmbDate.AddItem ChkDate'コンボボックスのリストに追加する
        End If
    Next i
    cmbDate.ListIndex = -1 'コンボボックスのリストインデックスを未選択にして初期化
End Sub

実行結果

重複を省いて配列に格納してからリストに格納するなど、やり方はもっとたくさんあるかと思いますがワタシはこうしてます。

ワタシ流こだわり

For文が重なる場合は必ずNextのあとにカウント変数つけます。
Next iNext c
そもそも今回はカウント変数をi とか c とかにしてますがたくさんあるとわかりにくいので
Dim DateCount As Longとかにすることも多いです