ユーザーフォーム上に設置されているコンボボックスの、テキスト部分に入力されているテキストの取得と、登録されているすべてのリストを取得する方法についてご説明します。
コンボボックスは登録されているリストから選択して、選択された文字列をテキストに表示させるコントロールです。
テキスト部分の取得方法はもちろんですが、処理の中には登録されているリストを取得したい場合はあります。
そんなテキストとリストの取得方法についてです。
その他のコンボボックスの操作方法ついては下記記事をご覧ください。
- コンボボックスの追加とリスト作成、詳細設定の方法
- コンボボックスのリストの追加と削除する方法
- 複数(2つ)のコンボボックスに連動するリストを登録する
- 複数(3つ以上)のコンボボックスに連動するリストを登録する
- コンボボックスのイベント一覧と使い方
- コンボボックスのChangeイベント リストを部分一致で絞り込み
- コンボボックスとリストボックスを連携させる
1.サンプルデータの説明
使用するフォームとコントロール
コンボボックスのテキスト部分に入力されているテキストを取得する方法です。
次のようにコンボボックスを追加したユーザーフォームを使用します。
取得するコードを実行するために「テキスト取得」と「リスト取得」のコマンドボタンを2つ用意しています。
コンボボックスには以下リストを登録します。
フォームの表示とリストの登録
今回は表示後の説明が本題ですが、表示するまでの過程も簡単にご説明します。
フォームの表示
上記ユーザーフォームを表示させます。
標準モジュールに以下コードを記述します。
Sub FormShow()
UserForm1.Show vbModeless
End Sub
リストの登録
ユーザーフォームを表示する際に、上記のリストをコンボボックスへ登録する必要があります。
表示する際に登録する場合はUserForm1のInitializeイベントで登録します。
ユーザーフォームのInitializeイベントについては「Initializeイベント 表示される時に実行」をご覧ください。
フォームモジュールに下記コードを記述します。
Private Sub UserForm_Initialize()
Dim i As Long
Dim MaxRow As Long
'リストの最終行を取得
MaxRow = Cells(Rows.Count, 1).End(xlUp).Row
With UserForm1
'一度リストを削除する
.Controls("ComboBox1").Clear
For i = 2 To MaxRow
'コンボボックスにリストを追加する
.Controls("ComboBox1").AddItem Cells(i, 1).Value
Next i
End With
End Sub
これで「Sub FormShow()」を実行してUserForm1を表示すると、A列のリストがコンボボックスに登録されます。
2.コンボボックスのテキスト部分を取得する
今回使用するフォームの準備が出来ましたので、本題のテキスト部分を取得する方法です。
テキストを取得するにはコンボボックスの「Value」プロパティを使用します。
次のように記述します。
Contents("コントロール名").Value
今回用意したコンボボックスのテキストを取得するには、次のように作成します。
標準モジュールに取得する部分を記述して、「テキスト取得」のコマンドボタンのClickイベントで呼び出します。
標準モジュール
Sub Text_Get()
With UserForm1
'コンボボックス1のテキストを取得
MsgBox .Controls("ComboBox1").Value
End With
End Sub
フォームモジュール
Private Sub CommandButton1_Click()
Call Text_Get
End Sub
各コンボボックスにリストからテキストを選択して、「テキスト取得」のボタンを押すとコンボボックスのテキスト部分が取得されます。
3.リストをすべて取得する
次は登録されているリストをすべて取得する方法です。
リストをすべて取得するにはループを使用して、リストに登録されているテキストを取得します。
ループさせるためにはリストの数を取得しなければいけません。
登録されているリストの数は「ListCount」プロパティで取得出来ます。
リストのインデックスは0から始まるため、-1する必要があります。
次のように記述します。
Contents("コントロール名").ListCount-1
リストのインデックスを指定するには「List」プロパティで指定します。
次のように記述します。
Contents("コントロール名").List(番号)
リストの数の取得と、リストのインデックスの指定がわかりましたので、取得するコードを作成したいと思います。
コンボボックスのリストを順番に変数に格納して、最後にメッセージボックスに表示させます。
Sub List_Get()
Dim MyStr As String
Dim i As Long
With UserForm1
'コンボボックスのリスト数分ループする
For i = 0 To .Controls("ComboBox1").ListCount - 1
'登録されているリストを順番に取得する
MyStr = MyStr & .Controls("ComboBox1").List(i) & vbCrLf
Next i
MsgBox MyStr
End With
End Sub
コードの説明
「.Controls(“ComboBox1”).ListCount – 1」でリストの数を取得しています。
リストのインデックスは0から始まるため、-1しています。
「.Controls(“ComboBox1”).List(i)」でループでリストのインデックスを順番に指定して、リストのテキストを取得します。