Excelリストボックスで複数列を表示して値を選択するVBA/マクロ便利Tips

業務効率化に役立つVBA/マクロのさまざまなTipsをコード例を交えて紹介していきます。今回は、複数列のリストボックスを表示するColumnCount/ColumnWidthsプロパティの使い方に加え、Listプロパティでデータを取得する方法を解説。

» 2015年01月13日 18時00分 公開
[薬師寺国安PROJECT KySS]
「VBA/マクロ便利Tips」のインデックス

連載目次

※本Tipsの環境:Windows 8.1 Enterprise(64ビット)+Excel 2013


 今回も「リストボックス」コントロールの使い方について解説する。複数列のリストボックスを表示するTipsを紹介する。

複数列のリストボックスを表示するColumnCount/ColumnWidthsプロパティの書式

 複数列のリストボックスを表示する書式は下記のようになる。

複数列のリストボックスを表示するColumnCount/ColumnWidthsプロパティの書式

 {オブジェクト}.ColumnCount={列数}

 {オブジェクト}.ColumnWidths={列幅}


 「ColumnCount」プロパティで{列数}を指定する。「ColumnWidths」プロパティで{列幅}を指定する。

 今回は、この書式を基にコードを書いていくことになる。

複数列のリストボックスを表示するデータとフォームの作成

 新しい、「複数列のリストボックス」という名前のシートを追加し、その中に図1のようなデータを作成し、「フォームを表示」ボタンを配置しておく。

図1 データと「フォームを表示」というボタンを追加

 次に、これまでのTipsで解説した手順でユーザーフォームを作成する。

 UserForm1のCaptionプロパティに、「複数列のデータ表示フォーム」と指定しておく。ユーザーフォーム上には、「ラベル」を1個と、「リストボックス」を1個配置しておく。

 「ラベル」の「オブジェクト名」には「表示ラベル」、「リストボックス」の「オブジェクト名」には「一覧リストボックス」としておく。「ラベル」のプロパティから、「BorderStyle」に「fmBorderStyleSingle」を選択して、枠線を表示しておく。「Caption」プロパティ内は空にしておく。

 コントロールを配置すると図2のようになる。

図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
リスト1 「一覧リストボックス」内に、複数列のデータを表示するコード

 まず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 「氏名と年齢」が選択されたときのコード

 2行目では、「表示ラベル」に、「一覧リストボックス」のListプロパティから選択した、ListIndexに対応する値の「0列目」、つまりは1列目の値(氏名)と、「1列目」の値、つまりは2列目の値(年齢)を空白で区切って表示する。

 3行目では、Excelシート上のデータも、フォーム上の「一覧リストボックス」内の値を選択すると、「年齢」に該当する部分が選択されるようにしている。

フォームを表示して実行

 最後に、VBE(Visual Basic Editor)のメニューから[挿入]→[標準モジュール]を選択する。プロジェクト内に、Module1が追加されるので、この中に「複数列表示フォーム」のコードを記述する(リスト3)。

Sub 複数列表示フォーム()
  UserForm2.Show vbModeless
End Sub
リスト3 「複数列表示フォーム」を表示するコード

 ShowメソッドでUserForm2をモードレスで表示する簡単な処理だ。

 リスト3のコードを「フォームを表示」ボタンと関連付け、実行した結果が図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.

スポンサーからのお知らせPR

注目のテーマ

AI for エンジニアリング
「サプライチェーン攻撃」対策
1P情シスのための脆弱性管理/対策の現実解
OSSのサプライチェーン管理、取るべきアクションとは
Microsoft & Windows最前線2024
システム開発ノウハウ 【発注ナビ】PR
あなたにおすすめの記事PR

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。