コンボボックスの複数列表示

ユーザーフォーム講座 動画編 09回
コンボボックスの複数列表示

動画でExcel コンボボックスの複数列表示とInitializeでの設定

【VBAユーザーフォーム】コンボボックスで2列表示する使いかた、選択アイテムを取得する、リスト項目を追加する方法。基礎編第9回

動画版「ユーザーフォーム講座」です。
今回はユーザーフォームの中でも人気のあるコンボボックスの使い方で、 列を複数列表示する方法をご紹介します。
また、複数列表示した中の、選択した値を取得してシートに表示したり、 あるいはフォーム上に表示したり、というようなことで選択した値を取得する方法もご紹介します。

マクロ動画 コンボボックスの複数列表示とInitializeでの設定

https://youtu.be/05_TZXYABgU

コンボボックスのリストに複数列を表示する方法

コンボボックスのリストに表示させるデータはSheet1に表示されています。
1列目から5列目までありますが、今回使うのはこのA、B列です。 これを取得してという形でやっていきます。

コンボボックスのリストに複数列を表示1

そして実際にフォームを起動させるのは、起動ボタンがSheet2にありますから、 データのあるシートの方は見ないでユーザーフォームだけ使ってもらうつもりの設定になってます。

コンボボックスのリストに複数列を表示2

VBEを表示させると、前回作成したユーザーフォームがあります。
ラベルがつけてあり、コンボボックス複数列表示と書いてあります。
コンボボックス複数列表示するために、最初どうするかというと、まずプロパティにですね書いてしまうという方法がありますね

コンボボックスのリストに複数列を表示3

コンポボックスのプロパティウィンドウにある、RowSourceに直接範囲を書いてやります。
Sheet1!A2:B21

コンボボックスのリストに複数列を表示4

そして、 これだとまだ見出しが表示されないので、 カラムヘッズというのがあるんですねこれが見出しのことです。 トゥルーにしてやると見出しが表示されてフォルスにしてやると表示されないということになります。

コンボボックスのリストに複数列を表示5

2列表示にするために、プロパティウィンドウにあるColumnCountを2にしてやります。
またBoundColumnも2にしてやります。これはlistのバリューになります。
そして当然ですが、TextColumnは1にしておきます。プロパティウィンドウの下の方にあります。

コンボボックスのリストに複数列を表示9

UserForm_Initializeでリストを複数列に

設定ができたので、フォームを起動させてみましょう。三角ボタンをクリックすると、2列でリストが表示されました。 見出しもきちんと表示されています。

コンボボックスのリストに複数列を表示6

取得ボタンをクリックして、アイテムを表示しましょう。選択したアイテムが何かを表示しました。

コンボボックスのリストに複数列を表示7

コードに戻りました。プロパティウィンドウのRowSourceに直接リスト範囲を入力した訳ですが、 今後変更がない場合はいいのですが、これですと、変更する場合が面倒です。そこで、なるべくコードで書きましょう。

コンボボックスのリストに複数列を表示8

今度はUserForm_Initializeを使ってコードで初期設定するというケースです。 Private Sub UserForm_Initialize()
With ComboBox1
.RowSource = "Sheet1!A2:B21"
先ほどプロパティに書いたものを、 コードで書いてあげます。
.TextColumn = 1
.BoundColumn = 2
.ColumnHeads = True
そしてテキストカラムは1ですよ
バウンドカラムは2ですよ
カラムヘッドはtrueですよ、という具合に書きます。
end withをつけます。 これは、プロパティウィンドウ―と同じことを設定していますが、 UserForm_Initializeというコードで設定する方法もありますよという例です。

コンボボックスのリストに複数列を表示10

UserForm_Initializeの2番目の方法

2番目の方法では、リストにしたいセルの範囲が変わる可能性あるというケースです。
データが増えるかもしれないとか、減るかもしれない というような場合に備えるコードにしたいと思います。
取得範囲を可変にしてやりたいということです。
Set ws = Worksheets("Sheet1")

コンボボックスのリストに複数列を表示11

ここで、Dim ws As Worksheetがないと思うかもしれませんが、 すでに変数の宣言を宣言セクションで行っているので、このSubプロシージャの中に書く必要はないのです。

コンボボックスのリストに複数列を表示11

そしてまた、DRngをWith wsの中で、データ範囲の最終行を取得してデータの範囲を限定しています。

コンボボックスのリストに複数列を表示12
With ws
Set DRng = .Range(.Cells(2, 1), .Cells(.Rows.Count, 2).End(xlUp))
End With 

次に、With ComboBox1
ComboBox1についての設定です。
.RowSource = "Sheet1!" & DRng.Address(False, False)
範囲を.RowSourceに入れています。
他の設定はInitializeで設定1回目と同じです。

     With ComboBox1
        .RowSource = "Sheet1!" & DRng.Address(False, False)
        .TextColumn = 1
        .BoundColumn = 2
        .ColumnHeads = True '見出し表示
    End With

VBAのRange.Addressプロパティはセルやセル範囲のアドレスを文字列で取得します。
指定した引数によって、絶対参照にするか、相対参照にするかを指定できます。既定値は True です。
.Address(False, False)ならば絶対参照
.Address(True, True), .Address ならば相対参照ということです。

コンボボックスのリストに複数列を表示14

コードが入力できましたので起動させましょう。範囲を取得して2列表示になっています。

コンボボックスのリストに複数列を表示15

もちろん背選択したアイテムを表示することもできました。

コンボボックスのリストに複数列を表示15

UserForm_Initializeの3番目の方法

3番目の方法はリストの範囲を配列で取得するという方法です。
配列で取得する場合には、Addressプロパティを使う必要はなく、そのまま指定できます。
設定が一番簡単で、しかも可変です。素晴らしいですね。
しかし一つ欠点があります。配列で取得したリストの場合には、見出しが入りません。
.ColumnHeads = True
と書いても無駄です。

コンボボックスのリストに複数列を表示16

ユーザーフォームを起動させると、見出しの枠はありますが、中身がないですね。
配列でListを指定した場合は、このようになってしまうので、
.ColumnHeads = True のコードは消しておきましょう。
どうしても見出しが必要なら、ラベルを作成して見出しの代わりにしましょう。

コンボボックスのリストに複数列を表示17