VBA - ユーザーフォームでカスケードコンボボックスを作成する方法
VBA - ユーザーフォームでカスケードコンボボックスを作成する方法
![](http://img.brin-designs.com/img/games/671/vba-how-create-cascading-combo-box-userform.png)
前書き
この記事では、間接メソッドを使用してカスケードコンボボックスを埋める方法を学びます。前提条件
- 1ワークブック
- 1ユーザーフォーム
- 3コンボボックス。
サンプルのワークブックをここからダウンロードすることもできます。//cjoint.com/14au/DHhootCLYVh.htm
Excelで名前を管理する
Excelワークブックで名前を定義するには、次のいずれかを行います。- Excel 2007以前のバージョン: 挿入>名前>定義
- Excel 2010以降: リボンの式>名前を定義します。
コンボボックスのコード
私たちは以下のことが起こりたいのです。- ユーザーフォームを読み込むと、ComboBox1が入力されます。
- 他のコンボボックスは最初のものの値に基づいて埋められます。
最初のリストを埋める
ブックの名前付き範囲の内容でコンボボックスを埋めるための構文は次のとおりです。- ComboBox1.List = Application.Transpose(Range( "monNom"))
ComboBoxを消去するには
- Combobox1.Clear
UserFormのロード時に最初のドロップダウンリストを埋めるためのコードは、次のようになります。
プライベートSub UserForm_Initialize()ComboBox1.Clear ComboBox1.List = Application.Transpose(Range( "Dep"))ComboBox2.Clear ComboBox3.Clear End Sub
2番目のリストを埋める
最初のドロップダウンリストで値を選択すると、その値(ComboBoxに表示されるテキスト)がワークブック名に対応します。名前付き範囲のセルの内容を表示するには、Changeイベントを使用します。
Private Sub ComboBox1_Change() 'ComboboxdépartementユーザーがComboBox 1の内容を削除したときに発生するバグを回避しますCom ComBox 1。Value = ""の場合終了Sub ComboBox 2。Clear ComboBox 3。Clear ComboBox 2。List = Application.Transpose(Range(NomRange))サブ
3番目のコンボボックスの場合:
Private Sub ComboBox2_Change() 'ComboBox2.Value = ""の場合ComboBox3.Clear ComboBox3.List = Application.Transpose(Range(NomRange))End Subの場合
よくあるバグ
無名の範囲
コンボボックスに入力された名前は、どのワークブック名とも一致しません。 これは名前が定義されていないときに起こります。 この問題を回避するために、ブックのすべての名前をループ処理するための小さな関数を作成します。関数NomDefini(文字列としてのNom)ブール値としてのNimとしての名前NomDefini = ThisWorkbook.Namesの各Nomsに対してFalse Noms.Name = Nomの場合NomDefini = True:Exit関数次のNoms End関数
入力エラー
サンプルファイルでわかるように、名前の定義は特殊文字やスペースを考慮に入れません。 状況によっては、変数を編集する必要があるかもしれません。これが例です:
CaracSpec =置換(Nom、 ""、 "_")CaracSpec =置換(CaracSpec、 " - "、 "_")終了関数
完成したコード
Option Explicit Private Sub UserForm_Initialize()ComboBox1.Clear ComboBox1.List = Application.Transpose(Range( "Dep"))ComboBox2.Clear ComboBox3.Clear End Sub Private Sub ComboBox1_Change() 'コンボボックスの分割= ""終了Sub ComboBox2.Clear ComboBox3.Clear暗黙のNomRange NomRange = CaracSpec(ComboBox1.Value)NomDefini(NomRange)の場合ComboBox2.List = Application.Transpose(Range(NomRange))その他ComboBox2.AddItem "" "Aucune commune" " ComboBox2.CValnge = ""の場合は終了ComboBox3.Clear Dim NomRangeを文字列としてNomRange = CaracSpec(ComboBox2.Value)の場合NomDefini(NomRange)の場合ComboBox3.List = Application.Transpose (Range(NomRange))その他ComboBox3.AddItem "" "Aucune rue" ""終了サブ関数NomDefini(Nom As String)名前NomDefini = NomDefini = ThisWorkbook.Names If Noms.Name = Nom Then NomDefini = True:Exit関数Next Noms終了関数関数カラク CaracSpec =置換(Nom、 ""、 "_")CaracSpec =置換(CaracSpec、 " - "、 "_")終了関数
ダウンロードリンク
このリンクのサンプルシートをダウンロードしてください://cjoint.com/?DHhootCLYVhVBA - ユーザーフォームでカスケードコンボボックスを作成する方法
前書き
この記事では、間接メソッドを使用してカスケードコンボボックスを埋める方法を学びます。前提条件
- 1ワークブック
- 1ユーザーフォーム
- 3コンボボックス。
サンプルのワークブックをここからダウンロードすることもできます。//cjoint.com/14au/DHhootCLYVh.htm
Excelで名前を管理する
Excelワークブックで名前を定義するには、次のいずれかを行います。- Excel 2007以前のバージョン:挿入>名前>定義
- Excel 2010以降:リボンの式>名前を定義します。
コンボボックスのコード
私たちは以下のことが起こりたいのです。- ユーザーフォームを読み込むと、ComboBox1が入力されます。
- 他のコンボボックスは最初のものの値に基づいて埋められます。
最初のリストを埋める
ブックの名前付き範囲の内容でコンボボックスを埋めるための構文は次のとおりです。- ComboBox1.List = Application.Transpose(Range( "monNom"))
ComboBoxを消去するには
- Combobox1.Clear
UserFormのロード時に最初のドロップダウンリストを埋めるためのコードは、次のようになります。
プライベートSub UserForm_Initialize()ComboBox1.Clear ComboBox1.List = Application.Transpose(Range( "Dep"))ComboBox2.Clear ComboBox3.Clear End Sub
2番目のリストを埋める
最初のドロップダウンリストで値を選択すると、その値(ComboBoxに表示されるテキスト)がワークブック名に対応します。名前付き範囲のセルの内容を表示するには、Changeイベントを使用します。
Private Sub ComboBox1_Change() 'ComboboxdépartementユーザーがComboBox 1の内容を削除したときに発生するバグを回避しますCom ComBox 1。Value = ""の場合終了Sub ComboBox 2。Clear ComboBox 3。Clear ComboBox 2。List = Application.Transpose(Range(NomRange))サブ
3番目のコンボボックスの場合:
Private Sub ComboBox2_Change() 'ComboBox2.Value = ""の場合ComboBox3.Clear ComboBox3.List = Application.Transpose(Range(NomRange))End Subの場合
よくあるバグ
無名の範囲
ComboBoxに入力された名前は、まだ定義されていないため、どのワークブック名とも一致しません。 この問題を回避するために、小さな関数を作成します。 その役割は、ワークブックのすべての名前をループ処理することです。
関数NomDefini(文字列としてのNom)ブール値としてのNimとしての名前NomDefini = ThisWorkbook.Namesの各Nomsに対してFalse Noms.Name = Nomの場合NomDefini = True:Exit関数次のNoms End関数
入力エラー
サンプルファイルでわかるように、名前の定義は特殊文字やスペースを考慮に入れません。 状況によっては、変数を編集する必要があるかもしれません。これが例です:
CaracSpec =置換(Nom、 ""、 "_")CaracSpec =置換(CaracSpec、 " - "、 "_")終了関数
完成したコード
Option Explicit Private Sub UserForm_Initialize()ComboBox1.Clear ComboBox1.List = Application.Transpose(Range( "Dep"))ComboBox2.Clear ComboBox3.Clear End Sub Private Sub ComboBox1_Change() 'コンボボックスの分割= ""終了Sub ComboBox2.Clear ComboBox3.Clear暗黙のNomRange NomRange = CaracSpec(ComboBox1.Value)NomDefini(NomRange)の場合ComboBox2.List = Application.Transpose(Range(NomRange))その他ComboBox2.AddItem "" "Aucune commune" " ComboBox2.CValnge = ""の場合は終了ComboBox3.Clear Dim NomRangeを文字列としてNomRange = CaracSpec(ComboBox2.Value)の場合NomDefini(NomRange)の場合ComboBox3.List = Application.Transpose (Range(NomRange))その他ComboBox3.AddItem "" "Aucune rue" ""終了サブ関数NomDefini(Nom As String)名前NomDefini = NomDefini = ThisWorkbook.Names If Noms.Name = Nom Then NomDefini = True:Exit関数Next Noms終了関数関数カラク CaracSpec =置換(Nom、 ""、 "_")CaracSpec =置換(CaracSpec、 " - "、 "_")終了関数