ユーザーフォーム入門
コンボボックス(ComboBox)の追加

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

第11回.コンボボックス(ComboBox)の追加


ユーザーフォーム入門として基礎から解説します。


ユーザーフォームで良く使われるコントロールは、
ラベル、テキストボックス
これは当然ですが、その次に良く使われるものは、
コンボボックス、リストボックス、チェックボックス、オプションボタンになるでしょう。

今回から、この4つのコントロールの使い方を順に解説をします。
今回はコンボボックスです。

コンボボックスの追加

まずは以下のように、ラベルとコンボボックスを追加して下さい。

VBA マクロ ユーザーフォーム

オブジェクト名は、
ラベル:lbl区分
コンボ:cmb区分

としておきます。

さて、この区分は、顧客のランクにしてみましょう。
Aランク、Bランク、Cランク
これらを選択できるようにします。

コンボボックスのプロパティ・メソッド

では、「コード表示」して、Initializeイベントプロシージャーを表示してください。

Private Sub UserForm_Initialize()

End Sub

Initializeイベントをまだ作成していない場合は作成してください。

Initializeイベントは、オブジェクトが読み込まれたあとで、そのオブジェクトが表示される前に発生します。
簡単に言えば、最初に1回だけ実行されるということです。
従って、最初に1度だけ実行すれば良い処理はここに書く事になります。

Aランク、Bランク、Cランク、これらの文字列をコンボボックスに追加するには、何通りかの方法があります。

AddItemメソッド

Private Sub UserForm_Initialize()
  Me.cmb区分.AddItem "Aランク"
  Me.cmb区分.AddItem "Bランク"
  Me.cmb区分.AddItem "Cランク"
End Sub

このように、AddItemメソッドを使用します。
このサンプルでは、次々に末尾に項目が追加されます。
追加する位置を指定する場合は、
.AdItem 項目, 順序

と指定します。

Private Sub UserForm_Initialize()
  Me.cmb区分.AddItem "Aランク", 0
  Me.cmb区分.AddItem "Bランク", 0
  Me.cmb区分.AddItem "Cランク", 0
End Sub

このようにすると、逆順に項目が並ぶことになります。

Listプロパティ

Private Sub UserForm_Initialize()
  Dim ary区分(2) As String
  ary区分(0) = "Aランク"
  ary区分(1) = "Bランク"
  ary区分(2) = "Cランク"
  Me.cmb区分.List = ary区分
End Sub

このように配列をコンボボックスの項目に一括で追加することが出来ます。

RowSourceプロパティ

Worksheets("Sheet1").Range("A1:A3")、ここにデータがあるとして、

Private Sub UserForm_Initialize()
  Me.cmb区分.RowSource = Worksheets("Sheet1").Range("A1:A3").Address(External:=True)
End Sub

このように、シートのセルとリンクさせることが出来ます。
注意点は、
セル範囲のオブジェクトを指定するのではなく、シート名も含んだセル範囲を表すアドレス文字列を指定します。

上記の、
Worksheets("Sheet1").Range("A1:A3").Address(External:=True)
これは、
[ブック名]Sheet1!$A$1:$A$3
となります。
Externalを指定しないと単に$A$1:$A$3となってしまう為、シートがアクィブシートになってしまいます。

Styleプロパティについて

定数 内容
fmStyleDropDownCombo 0 コンボ ボックス (ComboBox) コントロールは、選択項目のリストを持つコンボ ボックスとして機能します。
編集領域に値を入力したり、選択項目のリストから値を選択することができます。
fmStyleDropDownList 2 コンボ ボックス (ComboBox) コントロールは、リスト ボックスとして機能します。
リストから値を選択しなければなりません。

初期値では、fmStyleDropDownComboとなっていますので、リストに無い項目も手入力が可能となっています。
つまり、手入力を許可するかどうかで、どちらにするか適宜選択してください。

コンボボックスで選択した値を取得

セルor変数 = Me.cmb区分.Text
セルor変数 = Me.cmb区分.Value
セルor変数 = Me.cmb区分.List(Me.cmb区分.ListIndex)

上記3通りは、通常は同じ結果となります。

ただし、
Style=fmStyleDropDownCombo
この場合は、最期のMe.cmb区分.List(Me.cmb区分.ListIndex)、これでは都合が悪いです。

Me.cmb区分.ListIndex
これは、コンボボックスの選択されたリスト位置ですので、
Style=fmStyleDropDownComboの場合に、リストに無い項目を入力した場合は、
この値は-1となっていますので、これでは取得できません。

従って、Style=fmStyleDropDownComboの場合には、
Me.cmb区分.Text
これで取得してください。

コンボボックスの指定リストを選択状態にする

For i = 0 To Me.cmb区分.ListCount - 1
  If Me.cmb区分.List(i) = 指定文字列 Then
    Me.cmb区分.ListIndex = i
    Exit For
  End If
Next

上記VBAでは、リスト内を検索して、一致した文字列のリストを選択状態にしています。

これは、TextプロパティやValueプロパティに値を設定する事でも可能です。
しかし、この場合は、コンボボックスに設定されているリスト内の文字列かどうかが問題となります。
Style=fmStyleDropDownComboの場合は、リスト内に無くてもエラーとなりませんが、
Style=fmStyleDropDownListの場合はエラーとなってしまいますので、
シートのセル値を設定する場合等は、上記サンプルのようにするか、
On Error Resume Nextの指定が必要になります。
このような場合の細かいテクニックは、後々にあらためて解説します。

複数列のコンボボックス

複数列のコンボボックスを作成する場合は、

.ColumnCount
.ColumnWidths

これらのプロパティを設定します。
複数列はコンボボックスでは使用頻度が低いので、次回のリストボックスで詳しく説明します。
指定方法はリストボックスとほぼ同様となります。



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

第8回.セルの値をテキストボックスへ
第9回.標準モジュールとフォーム間のデータ受け渡しⅠ
第10回.標準モジュールとフォーム間のデータ受け渡しⅡ
第11回.コンボボックス(ComboBox)の追加
第12回.リストボックス(ListBox)の追加
第13回.チェックボックス(CheckBox)の追加
第14回.オプションボタン(OptionButton)の追加
第15回.ここまでの整理と全VBA
第16回.アクティブコントロールに色を付ける
第17回.Enterキーで次のコントロールに移動する
第18回.2段階のコンボボックス


新着記事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」をお願いいたします。
本文下部へ