Excel VBA 逆引き集 | 多段Combo

Excel VBA
スポンサーリンク

多段Combo(連動コンボボックス)の基本

Excel VBAで「コンボボックスを選ぶと次のコンボボックスの候補が変わる」ような 多段Combo(連動コンボボックス) を作ると、ユーザーが階層的に選択できる便利なフォームになります。
初心者向けに、コード例やテンプレートをかみ砕いて説明します。


基本の考え方

  • 多段Comboとは?
    1つ目のコンボボックスで選んだ内容に応じて、2つ目のコンボボックスの候補が変わる仕組み。
  • 用途:
    • 「都道府県 → 市区町村」
    • 「カテゴリ → 商品」
    • 「部署 → 担当者」
  • 流れ:
    1. UserFormに ComboBox1(親)ComboBox2(子) を配置。
    2. フォーム初期化時に親コンボの候補を設定。
    3. 親コンボの選択イベントで子コンボの候補を切り替える。

テンプレ1:固定データで多段Combo

UserFormに ComboBox1(地域)ComboBox2(都市) を配置。

Private Sub UserForm_Initialize()
    ' 親コンボに地域を設定
    ComboBox1.AddItem "関東"
    ComboBox1.AddItem "関西"
End Sub

Private Sub ComboBox1_Change()
    ComboBox2.Clear
    
    Select Case ComboBox1.Value
        Case "関東"
            ComboBox2.AddItem "東京"
            ComboBox2.AddItem "横浜"
            ComboBox2.AddItem "千葉"
        Case "関西"
            ComboBox2.AddItem "大阪"
            ComboBox2.AddItem "京都"
            ComboBox2.AddItem "神戸"
    End Select
End Sub
VB
  • ポイント:
    • 親コンボの選択に応じて子コンボの候補を切り替える。
    • Clear で前の候補を消してから新しい候補を追加。

テンプレ2:シートのマスタから多段Combo

シート「Master」に以下のようなデータがあると仮定:

地域都市
関東東京
関東横浜
関西大阪
関西京都

UserFormに ComboBox1(地域)ComboBox2(都市) を配置。

Private Sub UserForm_Initialize()
    Dim ws As Worksheet: Set ws = Worksheets("Master")
    Dim lastRow As Long: lastRow = ws.Cells(ws.Rows.Count, "A").End(xlUp).Row
    
    Dim dict As Object: Set dict = CreateObject("Scripting.Dictionary")
    Dim i As Long
    
    ' 地域をDictionaryに登録(重複排除)
    For i = 2 To lastRow
        If Not dict.exists(ws.Cells(i, 1).Value) Then
            dict.Add ws.Cells(i, 1).Value, 1
        End If
    Next i
    
    ComboBox1.Clear
    ComboBox1.List = dict.Keys
End Sub

Private Sub ComboBox1_Change()
    Dim ws As Worksheet: Set ws = Worksheets("Master")
    Dim lastRow As Long: lastRow = ws.Cells(ws.Rows.Count, "A").End(xlUp).Row
    
    ComboBox2.Clear
    
    Dim i As Long
    For i = 2 To lastRow
        If ws.Cells(i, 1).Value = ComboBox1.Value Then
            ComboBox2.AddItem ws.Cells(i, 2).Value
        End If
    Next i
End Sub
VB
  • ポイント:
    • マスタシートから候補を生成。
    • Dictionaryで親候補を重複なく抽出。
    • 親選択に応じて子候補を絞り込み。

テンプレ3:多段Comboをさらに拡張(3段階)

UserFormに ComboBox1(地域)ComboBox2(都市)ComboBox3(駅) を配置。
親 → 子 → 孫 のように連動させる。

Private Sub ComboBox2_Change()
    ComboBox3.Clear
    
    Select Case ComboBox2.Value
        Case "東京"
            ComboBox3.AddItem "新宿駅"
            ComboBox3.AddItem "渋谷駅"
        Case "大阪"
            ComboBox3.AddItem "梅田駅"
            ComboBox3.AddItem "難波駅"
    End Select
End Sub
VB
  • ポイント:
    • 2段目の選択に応じて3段目を切り替える。
    • 多段階も同じ仕組みで拡張可能。

例題で練習

'例1:固定データで地域→都市の多段Combo
' → UserForm_Initialize と ComboBox1_Change にコードを記述

'例2:シートのマスタから地域→都市の多段Combo
' → UserForm_Initialize と ComboBox1_Change にコードを記述

'例3:地域→都市→駅の3段階Combo
' → ComboBox2_Change にコードを記述
VB

初心者向けポイント

  • Clearで候補をリセット → 前の選択肢を消してから新しい候補を追加。
  • Select Caseで分岐 → 親の選択に応じて子候補を切り替える。
  • Dictionaryで重複排除 → マスタから候補を生成するときに便利。
  • 段階を増やすのも同じ仕組み → 2段でも3段でも応用可能。

👉 この「多段Comboテンプレ」を覚えておけば、Excel VBAで 階層的な選択フォーム(地域→都市→駅など) を簡単に作成できます。

タイトルとURLをコピーしました