コンボボックスの複数列表示
動画でExcel コンボボックスの複数列表示とInitializeでの設定
【VBAユーザーフォーム】コンボボックスで2列表示する使いかた、選択アイテムを取得する、リスト項目を追加する方法。基礎編第9回
動画版「ユーザーフォーム講座」です。
今回はユーザーフォームの中でも人気のあるコンボボックスの使い方で、
列を複数列表示する方法をご紹介します。
また、複数列表示した中の、選択した値を取得してシートに表示したり、
あるいはフォーム上に表示したり、というようなことで選択した値を取得する方法もご紹介します。
マクロ動画 コンボボックスの複数列表示とInitializeでの設定
コンボボックスのリストに複数列を表示する方法
コンボボックスのリストに表示させるデータはSheet1に表示されています。
1列目から5列目までありますが、今回使うのはこのA、B列です。
これを取得してという形でやっていきます。
そして実際にフォームを起動させるのは、起動ボタンがSheet2にありますから、 データのあるシートの方は見ないでユーザーフォームだけ使ってもらうつもりの設定になってます。
VBEを表示させると、前回作成したユーザーフォームがあります。
ラベルがつけてあり、コンボボックス複数列表示と書いてあります。
コンボボックス複数列表示するために、最初どうするかというと、まずプロパティにですね書いてしまうという方法がありますね
コンポボックスのプロパティウィンドウにある、RowSourceに直接範囲を書いてやります。
Sheet1!A2:B21
そして、 これだとまだ見出しが表示されないので、 カラムヘッズというのがあるんですねこれが見出しのことです。 トゥルーにしてやると見出しが表示されてフォルスにしてやると表示されないということになります。
2列表示にするために、プロパティウィンドウにあるColumnCountを2にしてやります。
またBoundColumnも2にしてやります。これはlistのバリューになります。
そして当然ですが、TextColumnは1にしておきます。プロパティウィンドウの下の方にあります。
UserForm_Initializeでリストを複数列に
設定ができたので、フォームを起動させてみましょう。三角ボタンをクリックすると、2列でリストが表示されました。 見出しもきちんと表示されています。
取得ボタンをクリックして、アイテムを表示しましょう。選択したアイテムが何かを表示しました。
コードに戻りました。プロパティウィンドウのRowSourceに直接リスト範囲を入力した訳ですが、 今後変更がない場合はいいのですが、これですと、変更する場合が面倒です。そこで、なるべくコードで書きましょう。
今度は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というコードで設定する方法もありますよという例です。
UserForm_Initializeの2番目の方法
2番目の方法では、リストにしたいセルの範囲が変わる可能性あるというケースです。
データが増えるかもしれないとか、減るかもしれない というような場合に備えるコードにしたいと思います。
取得範囲を可変にしてやりたいということです。
Set ws = Worksheets("Sheet1")
ここで、Dim ws As Worksheetがないと思うかもしれませんが、 すでに変数の宣言を宣言セクションで行っているので、このSubプロシージャの中に書く必要はないのです。
そしてまた、DRngをWith wsの中で、データ範囲の最終行を取得してデータの範囲を限定しています。
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 ならば相対参照ということです。
コードが入力できましたので起動させましょう。範囲を取得して2列表示になっています。
もちろん背選択したアイテムを表示することもできました。
UserForm_Initializeの3番目の方法
3番目の方法はリストの範囲を配列で取得するという方法です。
配列で取得する場合には、Addressプロパティを使う必要はなく、そのまま指定できます。
設定が一番簡単で、しかも可変です。素晴らしいですね。
しかし一つ欠点があります。配列で取得したリストの場合には、見出しが入りません。
.ColumnHeads = True
と書いても無駄です。
ユーザーフォームを起動させると、見出しの枠はありますが、中身がないですね。
配列でListを指定した場合は、このようになってしまうので、
.ColumnHeads = True のコードは消しておきましょう。
どうしても見出しが必要なら、ラベルを作成して見出しの代わりにしましょう。