##ユーザーフォムのコンボボックス
前回、コンボボックスに値を追加する記事を書きましたが
今回は重複を省きながら値を追加します。
例えば同じ日付があるデータなどをコンボボックスのリストにしたいときなどに使います。
以下のコンボボックスに登録日のデータを重複を省いて追加します。
登録日のデータをコンボボックスのリストと照合して一致したら、そのリストを選択します。
重複がない場合は何も選択されません。
なにも選択されていなかったら
重複してないってことで追加するというコードです。
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 i、Next c
そもそも今回はカウント変数をi とか c とかにしてますがたくさんあるとわかりにくいので
__Dim DateCount As Long__とかにすることも多いです