VBA7行でリストボックスで複数行選択して別々のセルに表示させる

複数行選択セル記載3

ユーザーフォームのリストボックスの設定を変更して複数行を選択できるようにしたら、選択状態のリスト(項目)をセルに表示(記載)したいと思いませんか?

それも1つのセルにまとめて改行して表示したり、別々のセルに表示させたり。

繰り返し処理と入力済み最終行(列)のVBAコードを使って、たった7行のVBAコードで完成できます。

目次

複数行選択状態と選択された行の項目を取得する

最初に、まだリストボックス複数行選択できるように設定をしていない場合は、この方法が使えないので設定変更を先に行ってください。

設定方法については下記をご覧くださいませ。

あわせて読みたい
リストボックスの項目を複数行選択できるようにする設定 リストボックスはリスト(項目)が複数表示された中から1つ選択できるのですが、2つ以上選びたい時に同じ作業を2回以上繰り返すのは面倒だと思いませんか? 1つのリス...

複数行選択状態を取得するSelectedプロパティ

まず最初にリストボックスの選択されたリスト(項目)が、選択状態になっているかどうかを判別しなくてはいけません。

調べる方法としてSelectedプロパティを使用し、調べたいリスト(項目)を行番号で指定して、選択状態ならば「True」、選択されていない状態ならば「False」を返してくれます。

リストボックス複数選択状態
3つ選択状態

リストボックスでは先頭行番号は「0」から始まりますので見た目からは「-1」です。

行番号Selected(選択状態)
Selected(0)False
Selected(1)True
Selected(2)False
Selected(3)False
Selected(4)False
Selected(5)False
Selected(6)True
Selected(7)False
Selected(8)False
Selected(9)True

複数行選択された行を項目に置き換える

上の図・表のようにSelectedプロパティで選択状態になっている「1・6・9」の行番号が取得できたら、番号ではなくリスト(項目)の名称でなければ意味がありません。

そこでSelectedプロパティで取得した行番号をListプロパティを使用して、項目名に置き換えましょう。

リストボックス複数選択状態
行番号項目
List(1)北斗展望台
List(6)塘路サルルン展望台
List(9)細岡展望台

これで基本的な選択状態を判別する事と、リスト番号からリスト(項目)名に置き換える方法で、リスト2番目を1つ選択している状態をセルA1に記載するには下記のようになります。

選択状態をセルに記載

Private Sub CommandButton1_Click()
If ListBox1.Selected(1) = True Then
Range(“A1”).Value = ListBox1.List(1)
Else
Range(“A1”).Value = “未選択”
End If
End Sub

VBA解説
  1. コマンドボタン1がクリックされたら
  2. もしリストボックス1の行番号1(2行目)が選択状態だったら
  3. セルA1にリストボックス1の行番号1(2行目)の項目名を記載する
  4. そうでなかったら(選択状態でなかったら)
  5. セルA1に「未選択」を記載する
  6. Ifステートメント終了
  7. マクロ記録終了

これが基本形で、これをベースに下記を追加してリストボックスで複数行選択して別々のセルに表示させるようにします。

  1. リスト(項目)の最初から最後までを繰り返し選択状態を調べる
  2. 選択状態の項目を入力済み最終列のセルに別々に表示・記載する

複数選択した項目を入力済み最終列に別々に表示・記載する

たった7行で完成しますので、基本的なVBAコードでできるようになります。

ここでは、リストボックスに表示された複数行を選択したリスト(項目)を、1行目の入力済み最終列の右側のセルに別々に表示・記載するようにします。

例:セルB1が入力済み最終列ならば、最初に選択した項目がセルC1に、2つ目に選択した項目がセルD1、3つ目に選択した項目がセルE1に記載されるという事です。

複数選択した項目を入力済み最終列に別々に表示・記載

Private Sub CommandButton1_Click()
With ListBox1
For i = 0 To .ListCount – 1
If .Selected(i) = True Then
Cells(1, Columns.Count).End(xlToLeft).Offset(, 1) = .List(i)
End If
Next i
End With
End Sub

VBA解説
  1. コマンドボタン1がクリックされたら
  2. リストボックス1に関する下記処理をする(Withステートメント実行)
  3. Forステートメント実行し、変数「i」を宣言し「i」は0~リストボックスの総行数-1まで処理を繰り返す
  4. もしリスト「i」行目が選択状態だったら
  5. セル1行目の左側のセルが最終入力セルになる列の1つ右側に選択状態のリスト項目を記載する
  6. Ifステートメント終了
  7. 変数「i」を繰り返す
  8. Withステートメント終了
  9. マクロ記録終了

これで、3つ選択した項目がそれぞれ別々のセルに左から順番に記載できます。

複数行選択セル記載

選択して複数行転記ボタン押すと・・・

複数行選択セル記載2

このように同じ行に記載できるようになると、顧客管理や商品管理などで1つの行に複数の項目を記載する時に便利になりますね。

リストボックス関連
目次