【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へ転記する
Excel VBAのUserFormにListBoxと転記ボタンを配置した設計画面

ListBoxを複数選択できるように設定する

MultiSelectプロパティを変更する

まずは、UserFormに配置したListBoxを複数選択できるように設定します。

VBEでUserFormを開き、ListBox1を選択してプロパティウィンドウのMultiSelectを変更してください。

  • 0 - fmMultiSelectSingle:1件だけ選択する
  • 1 - fmMultiSelectMulti:クリックした項目を複数選択する
  • 2 - fmMultiSelectExtended:CtrlキーやShiftキーを使用して複数選択する

今回はクリックだけで複数の項目を選択できるようにするため、1 – fmMultiSelectMultiを使用します。

Excel VBAのListBoxでMultiSelectを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列へ出力されます。

Excel VBAのListBoxで選択した複数の支店をSheet1へ転記した結果

1件も選択されていない場合の処理

複数選択できるListBoxでは、利用者が何も選択せずに転記ボタンを押す場合も考慮しておく必要があります。

今回のコードでは、選択された件数をselectedCountで数えています。

'1件も選択されていない場合
If selectedCount = 0 Then

    MsgBox "転記する項目を選択してください。", _
           vbExclamation

    Exit Sub

End If

何も選択されていなければメッセージを表示して処理を終了するため、空のまま正常終了したように見えてしまうことを防げます。

Excel VBAのListBoxで何も選択せず転記ボタンを押した場合のメッセージ

複数選択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アプリから始めませんか?

ご興味がある方はこちら!!

コメントを残す

メールアドレスが公開されることはありません。 ※ が付いている欄は必須項目です

CAPTCHA