リストボックスを2列・複数列表示やセルに記載する方法

リストボックス2列

あらかじめ指定した複数の値の中から選択することができるリストボックス。

初期設定(デフォルト)では1列(1項目)だけの表示・選択なのですが、実は2列・3列と複数列にカスタマイズできるんです。

例えば、商品リストを選ぶ時に初期設定のままの場合は「商品名」だけですが、2列ならば「商品番号」と「商品名」をリスト化でき、それぞれ別々のセルに値を入力・取得もできるので活用してみませんか?

目次

1つのリストボックスで2列や複数列表示

リストボックスプロパティで設定

列数の設定

ごく一般的なリストボックスの使い方としては1項目1列表示が基本で、リストボックスの初期設定になっています。

ひとつのリストボックスを2列以上の複数列で表示・使用するならば、まず最初にリストボックスのプロパティの中にあるColumnCountを変更するだけです。

リストボックス2行方法

セルの値を取得表示させる

次にどこのセルの値を2行のリストボックスに表示させるかですが、下記のようにRowSourceにセルの範囲を入力します。

リストボックス2列セル番地

そうすると、このように1つのリストボックスに2行表示できるようになります。

リストボックス2列ユーザーフォーム

このままでもいいのですが、2列とも同じ幅ではなく左の番号の幅は少し狭くして、右側の文字の幅は広くしたい場合は列の幅を調整することができます。

列の幅を調整する

リストボックス内に2列表示している上記の図のような場合の、それぞれの列の幅はちょうど半分ずつに分かれています。

任意に列の幅を変更するには、下図のようにColumnWidthsを指定します。

LISTBOXプロパティ列の幅

いかがですか?

これでリストボックスに2列や複数列表示ができるようになりましたが、せっかくなのでプロパティでの設定ではなく、ユーザーフォーム自体にVBAコードを使って設定する方法も覚えておきましょう。

ユーザーフォームにVBAコードで設定

ここでは、ユーザーフォーム1が表示されると自動的にリストボックスに列数・列の幅・リストが設定されてから表示するようにVBAコードで書いています。

その為に、ユーザーフォームのInitializeイベントを使用していますので、Initializeの詳細については下記と重複するのでここでは省略します。

あわせて読みたい
UserForm_Initializeでセル値を取得してから表示する方法 オリジナル入力フォームとして使えるエクセルVBAのユーザーフォーム。 ラベルやコマンドボタンを複数配置するのは当たりまえですが、顧客リストなどで名前や性別などを...
列数・列幅・リストをVBAで設定

Private Sub UserForm_Initialize()
With UserForm1.Controls(“ListBox1”)
.ColumnCount = 2
.ColumnWidths = “30;70”
.AddItem
.List(0, 0) = 1
.List(0, 1) = “エクセル”
.AddItem
.List(1, 0) = 2
.List(1, 1) = “Excel”
End With
End Sub

VBA解説
  1. ユーザーフォームイニシャライズイベントを実行する
  2. Withステートメント開始しユーザーフォーム1のリストボックス1を設定
  3. 列数は2行にする
  4. 列の幅は30;70にする
  5. リスト登録
  6. 最初の行の最初の列の値は「1」にする
  7. 最初の行の最初の列の1つ隣(2列目)は「エクセル」にする
  8. リスト登録
  9. 最初の行の1つ下(2行目)の最初の列の値は「2」とする
  10. 最初の行の1つ下(2行目)の最初の列の1つ隣(2列目)の値は「Excel」とする
  11. Withステートメント終了
  12. マクロ記録終了

最初の行とか最初の列とかちょっとややこしいですが、このように3列の場合を例に表にするとわかりやすいです。

リストボックス最初の列2列目3列目
最初の行0,00,10,2
2行目1,01,11,2
3行目2,02,12,2
4行目3,03,13,2

これで、ユーザーフォームが開くと同時にリストボックスに登録したリストが3列で列幅も指定された幅でそれぞれ表示されるようになりました。

ただ表示されただけでは実用的ではないので、コマンドボタンにリストボックスで選択されたリストを指定されたセルに記載するようにVBAコードを書きましょう。

2行や複数行のリストをセルに記載する

では、実際にコマンドボタンを押したら指定したセルに指定したリストを記載できるようにしましょう。

リストが1列

初期設定のリストが1列の場合は指定したセル番号に選択されたリストが記載されます。

リストが1列のVBAコード

Private Sub CommandButton1_Click()
Sheets(“HOME”).Range(“A1”).Value = ListBox1.Value
End Sub

VBA解説
  1. コマンドボタン1がクリックされたら
  2. シート名HOMEのセルA1にリストボックス1の選択されたリストを記載する
  3. マクロ記録終了

とてもシンプルですね。

ただこのままだと、リストを選択しないでコマンドボタンをクリックされてしまうとエラーになりますので、リストボックスのリスト未選択時のエラー回避VBAコードも追記しておくことをおススメします。

あわせて読みたい
エクセルVBAを使ってリストボックスのリスト未選択時のエラー対処方法 指定したリストの中から選択できるようにリストボックスを使用しますが、リストを選択しないでコマンドボタンをおされてしまい、空欄が入力されてエラーになってしまっ...

リストが2列

ではリストが2列あった場合には1列目と2列目どちらが記載されるのでしょう?

堪えは簡単で1列の時と同じようにVBAコードを書くと、リストボックスに2列だろうが、3列だろうが、自動的に1列目のリストがセルに記載されます。

そこで、VBAコードを書く時はリストボックスの何列目のリストをセルに記載するか指定する必要がありますので、下記のようにVBAコードを書けば解決です。

1列目のリストを指定

リストボックスにリストを登録した時と同様に、最初の列は「0」なのでリストも番号は0を指定することにより最初の列、つまり1列目が割り当てられます。

1列目のリスト

Private Sub CommandButton1_Click()
Sheets(“HOME”).Range(“A1”).Value = ListBox1.List(ListBox1.ListIndex, 0)
End Sub

2列目のリストを指定

今度は2列目のリストを選択させるので、最初の列の1つ隣のリストとなるのでリスト番号は1を指定することにより2列目が割り当てられます。

2列目のリスト

Private Sub CommandButton1_Click()
Sheets(“HOME”).Range(“A1”).Value = ListBox1.List(ListBox1.ListIndex, 1)
End Sub

3列目のリストを指定

次に3列目のリストを選択させるので、最初の列の2つ隣のリストとなるのでリスト番号は2を指定することにより3列目が割り当てられます。

3列目のリスト

Private Sub CommandButton1_Click()
Sheets(“HOME”).Range(“A1”).Value = ListBox1.List(ListBox1.ListIndex, 2)
End Sub

このように、List(ListBox1.ListIndex, ※※)、※※の部分に最初の列から何列隣のリストかを数えて数字を記載すれば、リストボックスの任意の列をセルに記載させるか簡単にできるようになります。

また、このようにすれば1列目をA1に2列目をB1にそれぞれ同時に記載できます。

2列同時記載

Private Sub CommandButton1_Click()
Sheets(“HOME”).Range(“A1”).Value = ListBox1.List(ListBox1.ListIndex, 0)
Sheets(“HOME”).Range(“B1”).Value = ListBox1.List(ListBox1.ListIndex, 1)
End Sub

リストの中から選んでもらうリストボックスを使って、もっと作業効率を上げて仕事を速く終わらせませんか?

リストボックス関連


目次