Excelリストボックスで複数列を表示して値を選択する:VBA/マクロ便利Tips
業務効率化に役立つVBA/マクロのさまざまなTipsをコード例を交えて紹介していきます。今回は、複数列のリストボックスを表示するColumnCount/ColumnWidthsプロパティの使い方に加え、Listプロパティでデータを取得する方法を解説。
今回も「リストボックス」コントロールの使い方について解説する。複数列のリストボックスを表示するTipsを紹介する。
複数列のリストボックスを表示するColumnCount/ColumnWidthsプロパティの書式
複数列のリストボックスを表示する書式は下記のようになる。
複数列のリストボックスを表示するColumnCount/ColumnWidthsプロパティの書式
{オブジェクト}.ColumnCount={列数}
{オブジェクト}.ColumnWidths={列幅}
「ColumnCount」プロパティで{列数}を指定する。「ColumnWidths」プロパティで{列幅}を指定する。
今回は、この書式を基にコードを書いていくことになる。
複数列のリストボックスを表示するデータとフォームの作成
新しい、「複数列のリストボックス」という名前のシートを追加し、その中に図1のようなデータを作成し、「フォームを表示」ボタンを配置しておく。
次に、これまでのTipsで解説した手順でユーザーフォームを作成する。
UserForm1のCaptionプロパティに、「複数列のデータ表示フォーム」と指定しておく。ユーザーフォーム上には、「ラベル」を1個と、「リストボックス」を1個配置しておく。
「ラベル」の「オブジェクト名」には「表示ラベル」、「リストボックス」の「オブジェクト名」には「一覧リストボックス」としておく。「ラベル」のプロパティから、「BorderStyle」に「fmBorderStyleSingle」を選択して、枠線を表示しておく。「Caption」プロパティ内は空にしておく。
コントロールを配置すると図2のようになる。
このフォームと先ほどの書式を基にコードを書いていこう。
二次元配列を利用してリストボックスに複数列のデータを追加する
まず、ユーザーフォームがアクティブになったときに、「一覧リストボックス」に、複数列のデータを追加する処理だ。UserForm_Activateイベント内に記述する。
Option Explicit Private Sub UserForm_Activate() Dim i As Integer With 一覧リストボックス .ColumnCount = 2 .ColumnWidths = "120;50" For i = 3 To 10 .AddItem Cells(i, 2) .List(i - 3, 1) = Cells(i, 3) Next End With End Sub
まず3行目では、Integer型の変数「i」を宣言する。
次に5行目で「一覧リストボックス」の、ColumnCountプロパティで列数を2列に指定する。
続いて6行目で、その列数の列幅を指定する。2列を指定しているので、「120;50」というようにセミコロンで区切って指定する。1列目が「120」、2列目が「50」の幅になる。
7〜10行目では変数「i」を「3」から「10」まで繰り返す。この数値はデータの表示されている「行番号」に対応している。
8行目ではAddItemメソッドで、「i」行目の2列目(B列)の値(氏名)を追加する。
9行目では、「一覧リストボックス」の値を配列として格納しているListプロパティに、変数「i」から-3をして、0行目つまり先頭行から「年齢」の値を表示していく。
.List(i - 3, 1)
これはList({リストボックス内の行番号},{リストボックス内の列番号})を表している。「リストボックス内の列番号」の「1」も、Listプロパティの配列のインデックスが「0」から始まるため、「1」ということは「0」から数えて二つ目の値となり、実際には「2」を指すと考えておくといい。ここでは、「一覧リストボックス」内の「2列目」という意味になる。
よって「一覧リストボックス」の、「1列目」にExcelシート上の、「氏名」が追加され、次に、2列目に、「Cells(i,3)」の3列目(B列)の「年齢」が追加されることになる。
Listプロパティが二次元配列として扱われることになるのだ。
複数列リストボックスからデータ(配列)を取得する
次に、リストボックスから「氏名と年齢」が選択されたときのコードはリスト2になる。一覧リストボックス_Changeイベント内に記述する。
Private Sub 一覧リストボックス_Change() 表示ラベル.Caption = 一覧リストボックス.List(一覧リストボックス.ListIndex, 0) & " " & 一覧リストボックス.List(一覧リストボックス.ListIndex, 1) Cells(一覧リストボックス.ListIndex + 3, 3).Select End Sub
2行目では、「表示ラベル」に、「一覧リストボックス」のListプロパティから選択した、ListIndexに対応する値の「0列目」、つまりは1列目の値(氏名)と、「1列目」の値、つまりは2列目の値(年齢)を空白で区切って表示する。
3行目では、Excelシート上のデータも、フォーム上の「一覧リストボックス」内の値を選択すると、「年齢」に該当する部分が選択されるようにしている。
フォームを表示して実行
最後に、VBE(Visual Basic Editor)のメニューから[挿入]→[標準モジュール]を選択する。プロジェクト内に、Module1が追加されるので、この中に「複数列表示フォーム」のコードを記述する(リスト3)。
Sub 複数列表示フォーム() UserForm2.Show vbModeless End Sub
ShowメソッドでUserForm2をモードレスで表示する簡単な処理だ。
リスト3のコードを「フォームを表示」ボタンと関連付け、実行した結果が図3だ。「一覧リストボックス」に複数列のデータが表示され、選択したデータが、「表示ラベル」内に表示されている。
Listプロパティの配列のインデックスは「0」から始まるように
今回は、複数列のリストボックスを表示するTipsを紹介した。
リストボックスのListプロパティの使い方が肝心だ。ここでは、Listプロパティは二次元配列として使用している。「何行目」と「何列目」の、2つの値を格納している。このことさえ理解できれば、使い方は簡単なので、読者の皆さんが日常の業務処理にうまく利用し、ぜひ使ってみてほしい。Listプロパティの配列のインデックスは「0」から始まることを頭に入れておく必要がある。
次回も引き続きリストボックスコントロールの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