ユーザーフォーム入門
2段階のコンボボックス

Excelマクロのユーザーフォームの基礎、エクセルVBAの入門解説
公開日:2013年5月以前 最終更新日:2019-12-17

第18回.2段階のコンボボックス


ユーザーフォーム入門として基礎から解説します。
2段階コンボボックスを作成します。


1つのコンボボックスの選択内容により、次のコンボボックスのリストを変更します。
ワークシートのセルの入力規則で実施する場合は、
入力規則のリストを、2段階の絞り込みで作成1
一覧リストを使用して、「入力規則」の「リスト」を作成し、「リスト」の選択結果により、となりの「リスト」の内容を自動で変化させます、さらに、一覧リストへの追加・削除に自動対応させるものです。入力規則のリストを、追加・削除に自動対応で作成 を理解した上でお読みください。
入力規則のリストを、2段階の絞り込みで作成2
一覧リストを使用して、「入力規則」の「リスト」を作成し、「リスト」の選択結果により、となりの「リスト」の内容を自動で変化させます、「入力規則のリストを、2段階の絞り込みで作成1」こちらのリストの縦横を入れ替えたパターンになります。入力規則のリストを、追加・削除に自動対応で作成一覧リストを使用して、「入力規則」の「リ…
こちらを参考にして下さい。

業種の2段階のコンボボックスを以下のように作成します。

ワークシートの用意

シート「業種マスタ」に以下のようなデータを用意します。

マクロ VBA サンプル画像

このデータをもとに、コンボボックスを作成します。

2段階コンボボックスの追加

VBA マクロ ユーザーフォーム 2段階コンボ

上段のコンボがcmb業種1
下段のコンボがcmb業種2とします。

2段階コンボボックスの処理概要

上段のコンボボックスに、ワークシートの1行目、
業者A、業者B、業者C、業者D、業者E
このリストを追加します。
上段のコンボボックスの選択内容により、下段のコンボボックスのリストを変更します。

上段のコンボボックスを変更するたびに、ワークシートへアクセスするのは避けたいところです。
そこで、シート「業種マスタ」の内容を配列として取り込んで置きます。
その為に、モジュールレベル変数を使用します。

ユーザーフォームのInitializeイベント

Private ary業種

Private Sub UserForm_Initialize()
  ・・・(省略)・・・
  
  ary業種 = Worksheets("業種マスタ").Cells(1, 1).CurrentRegion
  Dim i As Long
  With Me.cmb業種1
    .Clear
    For i = 1 To UBound(ary業種, 2)
      .AddItem ary業種(1, i)
    Next
  End With
End Sub

最初の
ary業種 = Worksheets("業種マスタ").Cells(1, 1).CurrentRegion
これで、配列として取り込んでおきます。

配列の1行目(配列としては1次元が1固定で)を上段のコンボボックスのリストに追加します。

コンボボックスのChangeイベント

Private Sub cmb業種1_Change()
  Dim i As Long
  Dim j As Long
  j = Me.cmb業種1.ListIndex + 1
  With Me.cmb業種2
    .Clear
    For i = 2 To UBound(ary業種, 1)
      If ary業種(i, j) <> "" Then
        .AddItem ary業種(i, j)
      End If
    Next
  End With
End Sub

最初のコンボの選択位置をもとに、配列の2次元位置(シートの横位置)を決定しています。
ここは、処理内容により、いろいろやり方はありますが、
連続していることが前提ですし、最初に配列にいれているので、
Me.cmb業種1.ListIndexを使用して配列の2次元位置を取得するのが、この場合は最も簡単だと思います。

Clearメソッドについて
これを忘れてしまう事が時にあります。
これを入れないと、リストがどんどん増えていってしまいます。

AddItemを使う場合は、Clearメソッドを無条件で最初に入れるようにしましょう。

UserForm_Initializeは、この場合は1回しか動作しないので、
cmb業種1.Clearメソッドは無くても問題ないのですが、
無条件に実行するようにしておい方が良いでしょう。

コピペで他で使用する場合等も気にしなくて済みますので、使いまわすときに助かります。



同じテーマ「ユーザーフォーム入門」の記事

第15回.ここまでの整理と全VBA
第16回.アクティブコントロールに色を付ける
第17回.Enterキーで次のコントロールに移動する
第18回.2段階のコンボボックス
第19回.数値専用のテキストボックス
第20回.テキストボックスの各種イベント
第21回.ユーザーフォームの各種イベント
第22回.コントロールの動的作成
第23回.イベントプロシージャーの共通化
第24回.イベントプロシージャーの共通化(Enter,Exit)
第25回.簡易音楽プレーヤーの作成


新着記事NEW ・・・新着記事一覧を見る

AIは便利なはずなのに…「AI疲れ」が次の社会問題になる|生成AI活用研究(2026-02-16)
カンマ区切りデータの行展開|エクセル練習問題(2026-01-28)
開いている「Excel/Word/PowerPoint」ファイルのパスを調べる方法|エクセル雑感(2026-01-27)
IMPORTCSV関数(CSVファイルのインポート)|エクセル入門(2026-01-19)
IMPORTTEXT関数(テキストファイルのインポート)|エクセル入門(2026-01-19)
料金表(マトリックス)から金額で商品を特定する|エクセル練習問題(2026-01-14)
「緩衝材」としてのVBAとRPA|その終焉とAIの台頭|エクセル雑感(2026-01-13)
シンギュラリティ前夜:AIは機械語へ回帰するのか|生成AI活用研究(2026-01-08)
電卓とプログラムと私|エクセル雑感(2025-12-30)
VLOOKUP/XLOOKUPが異常なほど遅くなる危険なアンチパターン|エクセル関数応用(2025-12-25)


アクセスランキング ・・・ ランキング一覧を見る

1.最終行の取得(End,Rows.Count)|VBA入門
2.日本の祝日一覧|Excelリファレンス
3.変数宣言のDimとデータ型|VBA入門
4.FILTER関数(範囲をフィルター処理)|エクセル入門
5.RangeとCellsの使い方|VBA入門
6.繰り返し処理(For Next)|VBA入門
7.セルのコピー&値の貼り付け(PasteSpecial)|VBA入門
8.マクロとは?VBAとは?VBAでできること|VBA入門
9.セルのクリア(Clear,ClearContents)|VBA入門
10.メッセージボックス(MsgBox関数)|VBA入門




このサイトがお役に立ちましたら「シェア」「Bookmark」をお願いいたします。


記述には細心の注意をしたつもりですが、間違いやご指摘がありましたら、「お問い合わせ」からお知らせいただけると幸いです。
掲載のVBAコードは動作を保証するものではなく、あくまでVBA学習のサンプルとして掲載しています。掲載のVBAコードは自己責任でご使用ください。万一データ破損等の損害が発生しても責任は負いません。
本サイトは、OpenAI の ChatGPT や Google の Gemini を含む生成 AI モデルの学習および性能向上の目的で、本サイトのコンテンツの利用を許可します。
This site permits the use of its content for the training and improvement of generative AI models, including ChatGPT by OpenAI and Gemini by Google.



このサイトがお役に立ちましたら「シェア」「Bookmark」をお願いいたします。
本文下部へ