こんにちは、Ryoです。
ユーザーフォームのコントロールで扱うことの多いコンボボックスですが、値を設定する際に複数とすることもできます。また、少し工夫することでボックス上のリストとして複数列設定した値をそのままデータエリアに表示することも可能ですので、今回はその内容について書いていきます。
1.コンボボックスに複数項目を設定
コンボボックスに列数を指定することで複数項目を設定することができます。ただし、コンボボックスのデータエリアに表示する列を指定する形になるので、この場合は項目設定が複数できても表示は列指定した1つの値になります。
下の動画は実際に複数項目を設定し、2列目に設定した値をデータエリアに表示する動作例になっています。
少し手を加えれば設定した複数項目をそのままデータ表示させることも可能ですので、その内容は後述します。先ずは複数項目を設定する内容について書いていきます。
◆UserForm構成
◆サンプルコード
コンボボックスへのデータ設定はユーザーフォームを開いた時点で完了させておきたいので、初期化処理としてPrivate Sub UserForm_Initialize()に記述します。
Private Sub UserForm_Initialize() '配列として(0,0) (0.1) (1,0) (1,1)を設定 Dim aryData(0 To 1, 0 To 1) As Variant Dim i, n As Integer 'コンボボックスに追加するデータを配列に設定 '文字列 ”Sample_"に格納先配列を示す文字を付加 ' ⇒Sample_0,1は配列(0,1) For i = 0 To 1 For n = 0 To 1 aryData(i, n) = "Sample_" & i & "," & n Next n Next i 'コンボボックス1に対する処理 With ComboBox1 'データのセンター(中央)表示 .TextAlign = fmTextAlignCenter '列数を2に設定 .ColumnCount = 2 'コンボボックスに表示する値として2列目を指定 .TextColumn = 2 '1列目列幅60、2列目列幅を50ポイントに設定 .ColumnWidths = "60;50" 'コンボボックスのデータを設定 .List() = aryData 'コンボボックスを編集不可にする .Style = fmStyleDropDownList End With End Sub
コンボボックスに複数項目を設定するにはColumnCountプロパティを使用します。
構文:オブジェクト.ColumnCount =num
ColumnCountプロパティは、コンボボックスの列数を指定するプロパティになりますので、構文のnumには列数を指定します。サンプルコードでは2列なので.ColumnCount = 2としています。
コンボボックスで選択された項目のどの列を表示するかは、TextColumnプロパティを使用して指定します。
構文:オブジェクト.TextColumn =column number
サンプルコードでは2列目の表示を指定していますので.TextColumn = 2になります。
その他に.ColumnWidthsプロパティで列幅を指定し、.List() = aryDataでコンボボックスへデータを反映、.Style = fmStyleDropDownListでコンボボックスに直接値が入力できないよう設定しています。
コンボボックス上に反映するデータは適宜設定すれば良いのですが、配列を使用して設定するのでサンプルとしてはわかりやすくする上で格納先の配列情報をSampleの文字列に連結させている処理がFor ~ Nextの処理部分です。
後はデータエリアの表示値をセルに書込みますので、コマンドボタン1をクリックした際の処理を以下のようにしています。
Private Sub CommandButton1_Click() 'セルA1にコンボボックスの表示値を書込む Cells(1, 1) = ComboBox1.Text End Sub
使用例としては「製品コードと製品名」、「社員番号と氏名」などの併記することで選択する際に判別しやすい状態とし、データエリアの表示は一方だけで事足りるようなケースかと思います。
2.コンボボックスに複数項目の設定、及び表示
1項で複数項目の設定を行っておりますが、この項では更に設定した複数列の項目をデータエリアに表示させる一例について書いていきます。
下の動画の通り、選択した複数列の値をデータエリアに表示させています。
◆サンプルコード
使用するUserForm構成は1項と同様です。
Private Sub UserForm_Initialize() '**コンボボックスに設定した複数項目を ' データとしてそのまま表示する例** '配列として(0,0) (0.1) (0,2) ' (1,0) (1,1) (1,2)を設定 Dim aryData(0 To 1, 0 To 2) As Variant Dim i, n As Integer 'コンボボックスに追加するデータを配列に設定 '文字列 ”Sample_"に格納先配列を示す文字を付加 ' ⇒Sample_0,1は配列(0,1) For i = 0 To 1 For n = 0 To 1 aryData(i, n) = "Sample_" & i & "," & n Next n '配列(0,2)と(1,2)は3列目の値になるので、 '表示用の連結文字列(複数項目)を格納する aryData(i, 2) = aryData(i, 0) _ & " ; " & aryData(i, 1) Next i 'コンボボックス1に対する設定 With ComboBox1 'データセンター(中央)表示 .TextAlign = fmTextAlignCenter '列数を3に設定 .ColumnCount = 3 '3列目の値をコンボボックスに表示 .TextColumn = 3 '列幅の設定を1列目60、2列目50、3列目を0とする ' ⇒3列目は表示用の値なのでリスト上では非表示にする .ColumnWidths = "60;50;0" 'コンボボックスのデータを設定 .List() = aryData 'コンボボックスを編集不可にする .Style = fmStyleDropDownList End With End Sub
複数項目として設定した内容を表示させる為に少し変更しています。変更内容としてはコメント内にも記述していますが「配列を追加(0,2)(1,2)」し、その配列に「設定した項目を連結させた状態で格納」します。これが3列目のデータとなるので「列数を3」として「3列目の値をコンボボックスのデータエリアに表示」することで、設定した複数項目と同様の値をデータエリアに表示させることができます。
その際に3列目のデータがコンボボックスの設定項目として表示されてしまうと判り難い状態になりますので、.ColumnWidths = “60;50;0″のように3列目の列幅を0とすることで非表示にしています。
セルへの書込みは1項と同様になります。
Private Sub CommandButton1_Click() 'セルA1にコンボボックスの表示値を書込む Cells(1, 1) = ComboBox1.Text End Sub
3.まとめ
UserFormを使って運用する際にコンボボックスは何かと有用ですから、そこでの表現をより良くする一つの手段として複数項目を設定するのも悪くないと思います。
また、複数列とした設定値をそのまま利用したい時に通常のプロパティの運用では難しいようなので対処の一例も書いてみましたが、使用フォントや文字列数により列幅(ColumnWidths)などは微妙に調整する必要がありますのでご留意ください。
以上、コンボボックスに複数の項目を設定/表示する方法についてでした!今回の記事が何かの参考になれば幸いです。
Ryo