ユーザーフォーム入門
コンボボックス(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回.セルの値をテキストボックスへ

・Initializeイベントプロシージャーの追加 ・InitializeイベントプロシージャーのVBAコード ・各モジュール間でのデータ受け渡し方法
第9回.標準モジュールとフォーム間のデータ受け渡しⅠ
・前回までに作成したVBA ・フォーム側でアクティブセルの行数を知る方法 ・標準モジュールのグローバル変数を使う ・標準モジュールからフォームのコントロールを操作する
第10回.標準モジュールとフォーム間のデータ受け渡しⅡ
・Subプロシージャーの引数を使う ・Functionプロシージャーの戻り値を使う ・標準モジュールとフォーム間のデータ受け渡しについて
第11回.コンボボックス(ComboBox)の追加
第12回.リストボックス(ListBox)の追加
・リストボックスの追加 ・リストボックスのプロパィ ・Listプロパティ ・Columnプロパティ ・RowSourceプロパティ ・選択されたリスト項目の取得 ・リストボックスの複数選択 ・IntegralHeightプロパティ
第13回.チェックボックス(CheckBox)の追加
・チェックボックスの追加 ・チェック状態の設定 ・チェック状態の取得
第14回.オプションボタン(OptionButton)の追加
・オプションボタンの追加 ・オプションボタンの状態設定 ・チェック状態の判定 ・オプションボタンのグループ化
第15回.ここまでの整理と全VBA
・ワークシート ・シートモジュール ・標準モジュール ・フォーム ・フォームモジュール
第16回.アクティブコントロールに色を付ける
・フォームモジュール ・EnterイベントとExitイベントをセットで使う方法 ・対応するラベルのフォントを太字にする
第17回.Enterキーで次のコントロールに移動する
・ユーザーフォームでのEnterキー動作について ・KeyDownイベント ・KeyPressイベント
第18回.2段階のコンボボックス
・ワークシートの用意 ・2段階コンボボックスの追加 ・2段階コンボボックスの処理概要 ・ユーザーフォームのInitializeイベント ・コンボボックスのChangeイベント


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

エクセルが起動しない、Excelが立ち上がらない|エクセル雑感(2024-04-11)
ブール型(Boolean)のis変数・フラグについて|VBA技術解説(2024-04-05)
テキストの内容によって図形を削除する|VBA技術解説(2024-04-02)
ExcelマクロVBA入門目次|エクセルの神髄(2024-03-20)
VBA10大躓きポイント(初心者が躓きやすいポイント)|VBA技術解説(2024-03-05)
テンキーのスクリーンキーボード作成|ユーザーフォーム入門(2024-02-26)
無効な前方参照か、コンパイルされていない種類への参照です。|エクセル雑感(2024-02-17)
初級脱出10問パック|VBA練習問題(2024-01-24)
累計を求める数式あれこれ|エクセル関数応用(2024-01-22)
複数の文字列を検索して置換するSUBSTITUTE|エクセル入門(2024-01-03)


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

1.最終行の取得(End,Rows.Count)|VBA入門
2.ひらがな⇔カタカナの変換|エクセル基本操作
3.セルのコピー&値の貼り付け(PasteSpecial)|VBA入門
4.変数宣言のDimとデータ型|VBA入門
5.繰り返し処理(For Next)|VBA入門
6.RangeとCellsの使い方|VBA入門
7.ブックを閉じる・保存(Close,Save,SaveAs)|VBA入門
8.セルのクリア(Clear,ClearContents)|VBA入門
9.並べ替え(Sort)|VBA入門
10.メッセージボックス(MsgBox関数)|VBA入門




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


記述には細心の注意をしたつもりですが、
間違いやご指摘がありましたら、「お問い合わせ」からお知らせいただけると幸いです。
掲載のVBAコードは動作を保証するものではなく、あくまでVBA学習のサンプルとして掲載しています。
掲載のVBAコードは自己責任でご使用ください。万一データ破損等の損害が発生しても責任は負いません。


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