【Excel VBA】UserFormのListBoxを複数選択して選択したデータをシートへ転記する方法
みなさんこんにちは。
Excel VBAでUserFormを作成していると、ListBoxに表示した一覧から複数の項目を選択し、選択したデータだけをシートへ転記したい場面も多いかと思います。
ListBoxは初期状態では1件だけを選択する設定となっていますが、MultiSelectプロパティを変更することで複数選択できるようになります。
さらに、Selectedプロパティを使用すると、どの項目が選択されているのかを1件ずつ判定できます。
今回は、UserFormのListBoxを複数選択できるように設定し、選択された項目だけをExcelシートへ転記する方法についてご紹介したいと思います。
この記事はこんな人におすすめ
- UserFormのListBoxで複数項目を選択したい人
- ListBoxで選択された行だけを取得したい人
- 選択したデータをExcelシートへまとめて転記したい人
- ListBoxが未選択だった場合の処理も実装したい人
今回作成するもの
今回は、UserFormにListBoxと転記ボタンを配置します。
ListBoxには複数の支店名を表示し、利用者が選択した支店名だけをSheet1へ転記するようにします。
- ListBox1:支店名を一覧表示し、複数選択できるようにする
- CommandButton1:選択した支店名をSheet1へ転記する

ListBoxを複数選択できるように設定する
MultiSelectプロパティを変更する
まずは、UserFormに配置したListBoxを複数選択できるように設定します。
VBEでUserFormを開き、ListBox1を選択してプロパティウィンドウのMultiSelectを変更してください。
0 - fmMultiSelectSingle:1件だけ選択する1 - fmMultiSelectMulti:クリックした項目を複数選択する2 - fmMultiSelectExtended:CtrlキーやShiftキーを使用して複数選択する
今回はクリックだけで複数の項目を選択できるようにするため、1 – fmMultiSelectMultiを使用します。

ListBoxへデータを登録する
次に、UserFormが表示されたタイミングでListBoxへ支店名を登録します。
UserFormのコード画面へ、次の処理を追加してください。
Private Sub UserForm_Initialize()
'========================================
' ListBoxに表示する初期データを登録する
'========================================
'既存のデータが残っている場合に備えて初期化する
Me.ListBox1.Clear
'========================================
' 支店名を1件ずつListBoxへ追加する
'========================================
Me.ListBox1.AddItem "東京支店"
Me.ListBox1.AddItem "大阪支店"
Me.ListBox1.AddItem "名古屋支店"
Me.ListBox1.AddItem "福岡支店"
Me.ListBox1.AddItem "札幌支店"
End Sub
UserFormを表示すると、ListBoxに5件の支店名が表示されます。
実務ではシートの一覧から読み込む方法もありますが、今回は複数選択と転記処理を分かりやすくするため、AddItemで固定データを登録しています。
Selectedプロパティで選択状態を判定する
ListBoxで複数選択を使用する場合は、ListIndexだけではすべての選択項目を取得できません。
そこで、ListBoxの各行に対してSelectedプロパティを確認します。
If Me.ListBox1.Selected(i) = True Then
'この行が選択されている場合の処理を記述する
End If
Selected(i)がTrueであれば、その行が選択されていることを意味します。
ListBoxの行番号は0から始まるため、複数の項目を確認するときは0 To ListCount - 1でループします。
選択した項目だけをシートへ転記する
転記ボタンのコードを作成する
CommandButton1をダブルクリックし、クリックイベントへ次のコードを記述します。
Private Sub CommandButton1_Click()
Dim ws As Worksheet
Dim i As Long
Dim outputRow As Long
Dim selectedCount As Long
'========================================
' 転記先となるワークシートを取得する
'========================================
Set ws = ThisWorkbook.Worksheets("Sheet1")
'========================================
' 転記前の結果を初期化する
'========================================
ws.Range("A2:A100").ClearContents
'見出しを設定する
ws.Range("A1").Value = "選択した支店"
'転記開始行を2行目に設定する
outputRow = 2
'選択件数を初期化する
selectedCount = 0
'========================================
' ListBoxの全項目を順番に確認する
'========================================
For i = 0 To Me.ListBox1.ListCount - 1
'========================================
' 現在の項目が選択されているか確認する
'========================================
If Me.ListBox1.Selected(i) = True Then
'選択されている支店名をシートへ転記する
ws.Cells(outputRow, 1).Value = Me.ListBox1.List(i)
'次の転記先の行番号へ進める
outputRow = outputRow + 1
'選択件数を加算する
selectedCount = selectedCount + 1
End If
Next i
'========================================
' 1件も選択されていない場合の処理
'========================================
If selectedCount = 0 Then
MsgBox "転記する項目を選択してください。", _
vbExclamation
Exit Sub
End If
'========================================
' 転記完了を利用者へ通知する
'========================================
MsgBox selectedCount & "件のデータを転記しました。", _
vbInformation
End Sub
このコードでは、ListBoxの先頭から最後まで順番に確認し、Selected(i)がTrueになっている項目だけをSheet1へ転記しています。
例えば「東京支店」「名古屋支店」「福岡支店」の3件を選択して転記ボタンをクリックすると、選択した3件だけがA列へ出力されます。


1件も選択されていない場合の処理
複数選択できるListBoxでは、利用者が何も選択せずに転記ボタンを押す場合も考慮しておく必要があります。
今回のコードでは、選択された件数をselectedCountで数えています。
'1件も選択されていない場合
If selectedCount = 0 Then
MsgBox "転記する項目を選択してください。", _
vbExclamation
Exit Sub
End If
何も選択されていなければメッセージを表示して処理を終了するため、空のまま正常終了したように見えてしまうことを防げます。

複数選択ListBoxを使用するときのポイント
ListIndexだけで判定しない
通常の単一選択ListBoxではListIndexを使用することも多いですが、複数選択の場合は各行のSelectedを確認する必要があります。
複数選択したすべての項目を取得したい場合は、今回のようにFor文でListBox全体を確認する方法が分かりやすいかと思います。
ListCountを使って最終行を決める
ListBoxに登録される件数が毎回変わる場合でも、ListCountを使用すれば現在の項目数に合わせて処理できます。
固定値で「0 To 4」のように記述するよりも、0 To ListCount - 1としておく方がデータ件数の変更にも対応しやすくなります。
過去の記事のご紹介
UserFormでは、ListBox以外にもComboBoxやTextBoxなどを組み合わせることで、入力しやすい画面を作成できます。
UserForm関連の記事については、以下の記事も参考にしてください。
最後に
いかがでしたでしょうか。
今回は、Excel VBAのUserFormでListBoxを複数選択できるようにし、選択した項目だけをExcelシートへ転記する方法についてご紹介しました。
複数選択ではMultiSelectの設定だけでなく、各項目の選択状態をSelectedで確認することがポイントとなります。
また、何も選択されていない場合の処理も用意しておくことで、実際の業務でも使いやすいUserFormになるかと思います。
ListBoxを使用した入力画面を作成するときに、少しでも参考になれば幸いです。
開発依頼について
ココナラでWebスクレイピング開発サービスを出品しております。
自分で開発をしようと思ったけど、VBAでのネット記事が少なく困っている方も多いかと思います。
そんな方はいつでもお気軽にご相談ください。
また、本ブログからご依頼いただいた方については割引特典がございますので、
ご不明点と合わせてメッセージをいただけると幸いです。
Excelにてブラウザ操作自動化ツールを作成します その作業、webスクレイピングを使って自動化しましょう!Webスクレイピング以外にもWebアプリの開発サービスも出品しております。
こちらについても、本ブログからご依頼いただいた方については割引特典がございますので、
お気軽にご相談ください。
スモールスケールのWebアプリ開発します 先ずはスモールスケールのWebアプリから始めませんか?
