【Excel VBA】UserFormのComboBoxを連動させる方法|1つ目の選択内容で2つ目の候補を絞り込む

みなさんこんにちは。

Excel VBAでUserFormを作成していると、1つ目のComboBoxで選択した内容によって、2つ目のComboBoxに表示する候補を変更したい場面があるかと思います。

例えば、1つ目のComboBoxで「果物」を選択した場合は、2つ目のComboBoxに「りんご」「みかん」「バナナ」を表示し、1つ目のComboBoxで「飲み物」を選択した場合は、「コーヒー」「紅茶」「水」を表示するといった使い方です。

今回は、UserFormに配置した2つのComboBoxを連動させ、1つ目の選択内容に応じて2つ目の候補を絞り込む方法についてご紹介したいと思います。


この記事はこんな人におすすめ

この記事はこんな人におすすめです!

  • Excel VBAでUserFormを作成している人
  • ComboBoxの基本的な使い方を知りたい人
  • 2つのComboBoxを連動させたい人
  • 1つ目の選択内容によって2つ目の候補を絞り込みたい人

といったところでしょうか。


UserFormに関する過去の記事

UserFormの表示方法については、過去の記事でもご紹介しておりますのでそちらもどうぞ。


今回やりたいこと

今回は、UserFormに2つのComboBoxを配置します。

  • ComboBox1:分類を選択
  • ComboBox2:ComboBox1で選択した分類に該当する候補を表示

例えばComboBox1で「果物」を選択した場合は、ComboBox2に「りんご」「みかん」「バナナ」だけを表示するようにします。

Excel VBAのUserFormに2つのComboBoxを配置した画面

マスタデータを作成する

まずは、ComboBoxに表示する候補をExcelシートに作成します。

今回は「マスタ」というシートを作成して、A列に分類、B列に候補を入力します。

分類候補
果物りんご
果物みかん
果物バナナ
飲み物コーヒー
飲み物紅茶
飲み物
ExcelのマスタシートにComboBoxの分類と候補を登録した画面

UserForm起動時にComboBox1へ分類を読み込む

まずはUserFormを開いた際に、ComboBox1へ「果物」「飲み物」を表示します。

Private Sub UserForm_Initialize()

    Dim ws As Worksheet
    Dim lastRow As Long
    Dim i As Long
    Dim dict As Object
    Dim categoryName As String

    Set ws = ThisWorkbook.Worksheets("マスタ")
    Set dict = CreateObject("Scripting.Dictionary")

    lastRow = ws.Cells(ws.Rows.Count, "A").End(xlUp).Row

    For i = 2 To lastRow

        categoryName = CStr(ws.Cells(i, "A").Value)

        If categoryName <> "" Then

            If Not dict.Exists(categoryName) Then
                dict.Add categoryName, True
                Me.ComboBox1.AddItem categoryName
            End If

        End If

    Next i

End Sub

マスタシートのA列を上から確認して、まだComboBox1へ追加されていない分類だけを追加しています。

Scripting.Dictionaryを使用することで、「果物」が3行登録されていてもComboBox1には1回だけ表示されるようにしています。

ComboBox1の選択内容でComboBox2を絞り込む

次に、ComboBox1の選択内容が変更された時にComboBox2へ候補を追加します。

Private Sub ComboBox1_Change()

    Dim ws As Worksheet
    Dim lastRow As Long
    Dim i As Long

    Set ws = ThisWorkbook.Worksheets("マスタ")

    lastRow = ws.Cells(ws.Rows.Count, "A").End(xlUp).Row

    Me.ComboBox2.Clear

    For i = 2 To lastRow

        If CStr(ws.Cells(i, "A").Value) = CStr(Me.ComboBox1.Value) Then

            If ws.Cells(i, "B").Value <> "" Then
                Me.ComboBox2.AddItem ws.Cells(i, "B").Value
            End If

        End If

    Next i

End Sub

ComboBox1の内容が変更されるたびに、最初にComboBox2の内容をクリアします。

Me.ComboBox2.Clear

その後、マスタシートのA列とComboBox1で選択した内容を比較して、一致した行のB列だけをComboBox2へ追加しています。

実行結果

それではUserFormを表示して確認します。

ComboBox1で「果物」を選択すると、ComboBox2には「りんご」「みかん」「バナナ」が表示されます。

Excel VBAのUserFormで果物を選択しComboBoxの候補を絞り込んだ画面

ComboBox1を「飲み物」に変更すると、ComboBox2の内容も「コーヒー」「紅茶」「水」へ自動で切り替わります。

Excel VBAのUserFormで飲み物を選択しComboBoxの候補が切り替わった画面

マスタデータを増やしても対応可能

今回のコードでは、マスタシートの最終行を自動で取得しています。

そのため、「食べ物」「都道府県」「部署」など新しい分類や候補をマスタシートへ追加しても、基本的にはVBAコードを修正する必要はありません。

ComboBoxの候補をVBAコードへ直接記述するよりも、Excelシート側でマスタ管理したほうが後から変更しやすいかと思います。

最後に

いかがでしたでしょうか。

今回は、Excel VBAのUserFormで2つのComboBoxを連動させ、1つ目の選択内容に応じて2つ目の候補を絞り込む方法についてご紹介しました。

UserFormで入力項目が増えてくると、すべての候補を1つのComboBoxに表示するよりも、今回のように選択内容に応じて候補を絞り込んだほうが使いやすくなる場合があります。

マスタデータをExcelシート側で管理しておけば、候補を追加する際にも修正しやすくなりますので、同じようなUserFormを作成する際に少しでも参考になればと思います。


開発依頼について

ココナラでWebスクレイピング開発サービスを出品しております。

自分で開発をしようと思ったけど、VBAでのネット記事が少なく困っている方も多いかと思います。

そんな方はいつでもお気軽にご相談ください。

また、本ブログからご依頼いただいた方については割引特典がございますので、

ご不明点と合わせてメッセージをいただけると幸いです。

Excelにてブラウザ操作自動化ツールを作成します その作業、webスクレイピングを使って自動化しましょう!

Webスクレイピング以外にもWebアプリの開発サービスも出品しております。

こちらについても、本ブログからご依頼いただいた方については割引特典がございますので、

お気軽にご相談ください。

スモールスケールのWebアプリ開発します 先ずはスモールスケールのWebアプリから始めませんか?

ご興味がある方はこちら!!

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

CAPTCHA