Excelのドロップダウンリストに集計した値を設定するVBAコード

Excelのセルにドロップダウンリストを設定するVBAコードをアップします。
今回は前回のサンプルを利用して以下のように商品マスターシートのカテゴリーを表示します。
関連エントリーのコンボボックスの絞り込みと重複した値をまとめて表示する方法についてもご参考下さい。

利用する商品マスターは以下の通りで今回ドロップダウンリストとして表示するのは「カテゴリー」です。

さて、カテゴリー欄を見てわかるとは思いますが、ぶどう・りんご・なしの値が重複しています。このまま利用すると同じものがダラダラとリストに表示されてしまいますので今回はADOを使ってSQL文でカテゴリーの値を集計します。

VBAを作成する準備

ATLキー+F11キーでVisual Basic Editorを起動します。Editorが起動したら画面左上のプロジェクトからドロップダウンリストを設定するシートをダブルクリックします。

そして以下の図のように「Worksheet」と「SelectionChange」を選択します。これでプロシージャ「Private Sub Worksheet_SelectionChange(ByVal Target As Range)」が作成されます。

これはシートの範囲を変更した際にプログラムを実行してくれるようにするする為です。商品マスターのシートでデータを追加・削除しても指定されたシートのセルの選択を変えると最新の情報に書き換えてくれます。

VBAサンプルコード

Private Sub Worksheet_SelectionChange(ByVal Target As Range)

    Dim adoCON          As New ADODB.Connection
    Dim adoRS           As New ADODB.Recordset
    Dim strSQL          As String
    Dim odbdDB          As Variant
    Dim strCat          As String
 
    'データベースのパスを取得(ExcelブックをDBとする)
    odbdDB = ActiveWorkbook.Path & "\sample_20171220.xlsm"
     
    '接続する
    Set adoCON = New ADODB.Connection
  
    With adoCON
        .Provider = "Microsoft.ACE.OLEDB.12.0"
        .Properties("Extended Properties") = "Excel 12.0"
        .Open odbdDB
    End With

    'カーソルをクライアント側に設定
    adoRS.CursorLocation = adUseClient
         
    'シート「商品マスター」をテーブルとしてSQLを発行
    strSQL = "SELECT カテゴリー FROM [商品マスター$] "
    strSQL = strSQL & " GROUP BY カテゴリー "
    'レコードセットを開く
    adoRS.Open strSQL, adoCON, adOpenDynamic
    
    'リスト用のカテゴリーを取得
    strCat = ""
    Do Until adoRS.EOF
        If strCat = "" Then
            strCat = adoRS!カテゴリー
        Else
            strCat = strCat & ", " & adoRS!カテゴリー
        End If
        adoRS.MoveNext
    Loop
    'レコードセットを閉じる
    adoRS.Close
    
    'リストをセットする
    With Range("B1").Validation
        .Delete
        .Add _
            Type:=xlValidateList, _
            Formula1:=strCat
    End With

    Set adoCON = Nothing
    Set adoRS = Nothing

End Sub

VBAコードの補足

ADOを使用してExcelに接続する

10~19行目でExcelのワークブックをMicrosoft Jet OLE DB Providerを使用して接続します。

'データベースのパスを取得(ExcelブックをDBとする)
odbdDB = ActiveWorkbook.Path & "\sample_20171220.xlsm"
 
'接続する
Set adoCON = New ADODB.Connection

With adoCON
    .Provider = "Microsoft.ACE.OLEDB.12.0"
    .Properties("Extended Properties") = "Excel 12.0"
    .Open odbdDB
End With

シート「商品マスター」をレコードセットとして開きます

SGROUP BYを使って「カテゴリー」を集計するSQLを発行してOpenメソッドでレコードセットとして開きます。(25~28行目)

'シート「商品マスター」をテーブルとしてSQLを発行
strSQL = "SELECT カテゴリー FROM [商品マスター$] "
strSQL = strSQL & " GROUP BY カテゴリー "
'レコードセットを開く
adoRS.Open strSQL, adoCON, adOpenDynamic

集計したレコードセットからドロップダウンリスト用のデータを取得

31~39行目でDo…Loopステートメントでカテゴリーを繰り返し読み込んでドロップダウン用リストを作成します。

'リスト用のカテゴリーを取得
strCat = ""
Do Until adoRS.EOF
    If strCat = "" Then
        strCat = adoRS!カテゴリー
    Else
        strCat = strCat & ", " & adoRS!カテゴリー
    End If
    adoRS.MoveNext
Loop

セルにドロップダウンリストをセットする

44~49行目でセルにドロップダウンリストを設定します。Excelのメニューでは「データ」→「データの入力規制」で設定しますがVBAではValidationオブジェクトを使って設定します。
一旦、セルの入力規制をDeleteメソッドで削除した後、Addメソッドでリストを設定します。

'リストをセットする
With Range("B1").Validation
    .Delete
    .Add _
        Type:=xlValidateList, _
        Formula1:=strCat
End With

以上、今回はセルのドロップダウンリストに重複した値を集計してセットするVBAコードでした。

今回のサンプルファイルは以下のリンクからダウンロード可能です。