Excelリストボックスで複数選択データと個数を取得:VBA/マクロ便利Tips(2/2 ページ)
業務効率化に役立つVBA/マクロのさまざまなTipsをコード例を交えて紹介していきます。今回は、選択されている値を取得するListプロパティやデータの個数を取得するListCountプロパティの使い方に加え、複数選択データを取得する方法を解説する。
リストボックスで複数選択データを取得する
最後に、リストボックスで複数選択データを取得する方法を紹介する。これまで登場したListプロパティとListCountプロパティを組み合わせて使うことになる。書式は下記の通りだ。
リストボックスで複数選択データを取得する書式
With {オブジェクト}
For {反復変数}=0 to .ListCount-1
If .Selected({反復変数})=True Then
{格納変数}={格納変数} & .List({反復変数}) & vbCrLf
End If
Next
End With
{オブジェクト}には、リストボックスブジェクトを指定する。リストボックス内の{格納変数}が選択されていた場合は、{格納変数}に改行を含めて、リストボックスより選択された値を格納していく。
コードを実行するフォームを整えよう。今度は図1に「複数データ選択フォーム表示」というボタンを追加しておく(図6)。
次に、ユーザーフォーム「UserForm2」を作成し、Captionプロパティに、「複数データ選択フォーム」と指定しておく。
ユーザーフォーム上にはラベルを1個と、リストボックスを1個配置しておく。ラベルの「オブジェクト名」には「氏名ラベル」、リストボックスの「オブジェクト名」には、「一覧リストボックス」としておく。ラベルのプロパティから、「BorderStyle」に「fmBorderStyleSingle」を選択して、枠線を表示しておく。「Caption」プロパティ内は空にしておく。
リストボックスのプロパティから、「MultiSelect」に「fmMultiSelectMulti」を選択しておく。これで「一覧リストボックス」での複数選択が可能になる。
コントロールを配置すると、図7のようになる。
続いて、コードを書いていこう。なお、ユーザーフォームがアクティブになったときの処理を記述するコードは前述の通り省略する。
VBEのメニューから、[挿入]→[標準モジュール]を選択する。プロジェクト内にModule1が追加されるので、この中にリスト4のコードを記述する。ShowメソッドでUserForm2をモードレスで表示するだけだ。
Sub 複数選択フォームの表示() UserForm2.Show vbModeless End Sub
リスト4のコードは図6の「複数データ選択フォームを表示」ボタンと関連付けておく。
次に、リストボックスの値が選択されたときの処理を記述する(リスト5)。一覧リストボックス_Changeイベント内に記述することになる。
Private Sub 一覧リストボックス_Change() Dim 氏名 As String 氏名 = "" Dim i As Long With 一覧リストボックス For i = 0 To .ListCount - 1 If .Selected(i) = True Then 氏名 = 氏名 & .List(i) & vbCrLf Cells(i + 3, 2).Interior.ColorIndex = 3 Else Cells(i + 3, 2).Interior.ColorIndex = 2 End If Next End With 氏名ラベル.Caption = 氏名 End Sub
2行目で文字列型の変数「氏名」を宣言し、3行目で初期化しておく。4行目でLong型の変数「i」を宣言する。
6〜13行目で、変数「i」を、「0」から「一覧リストボックス」内の個数から「-1」した分だけ反復処理を行う。「-1」しているのは、ListCountで取得される値は、「1」から始まるためだ。
7〜10行目で、「一覧リストボックス」の値が選択されていた場合は、変数「氏名」に、順次選択されていく値を、改行を含めて格納していく。
9行目の「Cells(i+3,2)」で、「i+3」行目の「2列目(B列)」の背景色を「3(赤)」に変化させる。
「一覧リストボックス」の氏名の選択が解除された場合は、11行目のように氏名の背景色を「2(白)」に戻している。
15行目では「氏名ラベル」に、「一覧リストボックス」から選択された「氏名」を表示している。
図8は実行結果だ。「一覧リストボックス」から複数の氏名を選択した。Excelシートのデータの背景色も「赤」に変化する。再度クリックして、選択を解除すると背景色は「白」に戻る。
「.Selected(i)」という書き方が肝
今回は、3つのTipsを紹介したが、いかがだっただろうか。
リストボックスで複数選択データ取得する方法では、「一覧リストボックス」の値が選択されているとき、つまり「.Selected(i)」という書き方が肝となる。ここさえ分かれば、後は選択された氏名を、変数に順次追加していけばよい。
選択した氏名のExcelシートのデータの背景色を変更させるのも、「Cells(行番号,列番号)」の書式を理解していれば簡単だ。
次回も引き続きリストボックスコントロールのTipsについて解説する予定だ。お楽しみに。
著者プロフィール
薬師寺 国安(やくしじ くにやす) / 薬師寺国安事務所
薬師寺国安事務所代表。Visual Basicプログラミングと、マイクロソフト系の技術をテーマとした、書籍や記事の執筆を行う。
1950年生まれ。事務系のサラリーマンだった40歳から趣味でプログラミングを始め、1996年より独学でActiveXに取り組む。
1997年に薬師寺聖とコラボレーション・ユニット「PROJECT KySS」を結成。
2003年よりフリーになり、PROJECT KySSの活動に本格的に参加。.NETやRIAに関する書籍や記事を多数執筆する傍ら、受託案件のプログラミングも手掛ける。
Windows Phoneアプリ開発を経て、現在はWindowsストアアプリを多数公開中。
Microsoft MVP for Development Platforms - Client App Dev (Oct 2003-Sep 2012)。
Microsoft MVP for Development Platforms - Windows Phone Development(Oct 2012-Sep 2013)。
Microsoft MVP for Development Platforms - Client Development(Oct 2013-Sep 2014)。
Microsoft MVP for Development Platforms-Windows Platform Development (Oct 2014-Sep 2015)。
Copyright © ITmedia, Inc. All Rights Reserved.
関連記事
- スクショをExcelに張り付けるのに役立つ4つのテクニック
システム開発におけるソフトウェアテスト(結合テスト〜システムテスト)において重要視されるエビデンス(作業記録)。前後編の2回にわたって、エビデンスとしてスクリーンショットをキャプチャし、テスト仕様書や納品書に張り付けていく作業を自動化するためのVBA/マクロのテクニックを紹介する。後編は、画像ファイルをシートに張り付け、Excel 2013のメニューからスクショを直に張り付け、画像を縮小し、指定した時間にマクロを実行する方法を解説。 - [Esc]キーによるExcel VBAの実行中断を防止する
ExcelではVBA(Visual Basic for Applications)によってさまざまな処理を自動的に実行できる。しかし、VBAの実行中にユーザーが[Esc]キーあるいは[Ctrl]+[Break]キーを押すと、自動処理が止まってしまう。止めたくない場合は、Application.EnableCancelKeyプロパティの設定を変更する。 - Windows TIPSディレクトリ > プラットフォーム別 > Office > Excel