連載
» 2014年12月12日 18時00分 UPDATE

VBA/マクロ便利Tips:Excelリストボックスで複数選択データと個数を取得 (1/2)

業務効率化に役立つVBA/マクロのさまざまなTipsをコード例を交えて紹介していきます。今回は、選択されている値を取得するListプロパティやデータの個数を取得するListCountプロパティの使い方に加え、複数選択データを取得する方法を解説する。

[薬師寺国安,PROJECT KySS]
「VBA/マクロ便利Tips」のインデックス

連載目次

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


 今回もリストボックスコントロールの使い方として3つのTipsを解説する。「リストボックスで選択されている値を取得する」方法と「リストボックス内のデータの個数を取得する」方法を基本的なものとして紹介し、この2つを組み合わせたテクニックとして「リストボックスで複数選択データを取得する」方法を紹介する。

リストボックスで選択されている値を取得するListプロパティ

 まずは、リストボックスで選択されている値を取得するTipsを紹介しよう。VBAでは頻繁に必要となる処理なので覚えておいてもらいたい。特に難しいコードではなく、「リストボックスに表示されている値は、Listプロパティ内に配列形式で格納されている」ということを頭に入れておけば、値を取り出すことは簡単だ。

リストボックスで選択されている値を取得する書式

{オブジェクト}.Text

{オブジェクト}.List({インデックス})


 リストボックスから選択した値を表示する方法は上記の通り2通りある。{オブジェクト}にはリストボックスオブジェクトを指定する。

 一つはTextプロパティで、リストボックスより選択されている値を取得できる。

 もう一つはListプロパティだ。リストボックスに表示されているデータは、Listプロパティに配列形式で格納されているため、リストボックスの選択した項目の{インデックス}を指定して取得できる。

 Textプロパティは使い方が一目瞭然なので、今回は、Listプロパティを使った方法で解説する。

 実行するデータとフォームを用意しよう。まず、Excelシートに前回と同じ、図1のようなデータと「フォームを表示」ボタンを作成しておく。

ExcelVBA6TipsForm_01.png 図1 データと「フォームを表示」ボタンを配置

 次に、ユーザーフォームを作成する。UserForm1のCaptionプロパティに、「リストボックスのデータ選択フォーム」と指定しておく。

 ユーザーフォーム上には、ラベルを1個と、リストボックスを1個配置しておく。プロパティから、ラベルの「オブジェクト名」には、「氏名ラベル」、リストボックスの「オブジェクト名」には、「一覧リストボックス」としておく。

 ラベルのプロパティから、「BorderStyle」に「fmBorderStyleSingle」を選択して、枠線を表示しておく。「Caption」プロパティ内は空にしておく。

 これらを図2のように配置する。ラベルやリストボックスの「書体」や「文字サイズ」は、「Font」プロパティから指定している。読者の皆さんの好きな指定にしてもらって構わない。

ExcelVBA6TipsForm_02.png 図2 ユーザーフォームにラベルとリストボックスを配置

 プロジェクト内のUserForm1を選択して、マウスの右クリックで表示される、「コードの表示」を選択してコードを記述する。

 なお、ユーザーフォームがアクティブになったときの処理を記述するコードは、「リストボックスにデータを追加する」Tipsのリスト1と同じなので省略する。

 まずは、「一覧リストボックス」から氏名が選択されたときの処理を解説しよう(リスト1)。一覧リストボックス_Changeイベント内に記述する。

Private Sub 一覧リストボックス_Change()
  Dim 氏名インデックス As Integer
  氏名インデックス = 一覧リストボックス.ListIndex
  氏名ラベル.Caption = 一覧リストボックス.List(氏名インデックス)
  Cells(氏名インデックス + 3, 2).Select
End Sub
リスト1 「一覧リストボックス」から「氏名」を選択して「氏名ラベル」に表示するコード

 2行目でInteger型の「氏名インデックス」変数を宣言する。

 3行目では、変数「氏名インデックス」に、「一覧リストボックス」から選択されたインデックスの値(ListIndexプロパティ)を格納しておく。

 4行目では、「氏名ラベル」に、「一覧リストボックス」の値を、配列として持っている「List」プロパティに、「氏名インデックス」の格納している値を指定し、内容を取得して表示する。

 5行目では、Excelシート上の同じ値も、選択状態にしている。

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

Option Explicit
Sub フォームの表示()
  UserForm1.Show vbModeless
End Sub
リスト2 「フォーム」を表示するコード

 ShowメソッドでUserForm1をモードレスで表示する簡単なものだ。

 このリスト2のコードを図1の「フォームを表示」ボタンに関連付け実行した結果が図3だ。「一覧リストボックス」から選択された値が、「氏名ラベル」に表示され、Excelシート上の同じ「氏名」も選択状態になった。

ExcelVBA6TipsForm_03.png 図3

リストボックス内のデータの個数を取得するListCountプロパティ

 リストボックス内のデータの個数を取得する方法は、これもVBAではよく必要とされる処理なので覚えておいてもらいたい。特に難しいコードではなく、ListCountプロパティで取得できるので簡単だ。

リストボックス内のデータの個数を取得するListCountプロパティの書式

{オブジェクト}.ListCount


 {オブジェクト}には、リストボックスオブジェクトを指定する。

 Excelシートを追加して、図1と図2同様のデータとフォームを作成しておく。図1と異なる点は、「データの個数」を表示するセルを設置しておく点だ(図4)。

ExcelVBA7TipsForm_01.png 図4 データと、「データの個数」を表示するセルと、「フォームを表示」ボタンを配置

 プロジェクト内のUserForm1を選択して、マウスの右クリックで表示される、「コードの表示」を選択してコードを記述する。

 ユーザーフォームがアクティブになったときに、リストボックスにデータを追加して、同時に追加されたデータの個数も取得するコードはリスト3だ。UserForm_Activateイベント内に記述する。

Option Explicit
Private Sub UserForm_Activate()
  Dim i As Integer
  For i = 3 To 10
   一覧リストボックス.AddItem (Cells(i, 2))
  Next
  個数ラベル.Caption = "合計【" & 一覧リストボックス.ListCount & "】件のデータがあります。"
  Range("E4").Value = 一覧リストボックス.ListCount & "件"
End Sub
リスト3 「一覧リストボックス」から、データの個数を取得して「個数ラベル」に表示するコード

 4〜6行目では、「B3」のセルから「B10」のセルまでのデータを、AddItemメソッドで「一覧リストボックス」に追加している。

 7行目のListCountプロパティで、「一覧リストボックス」内のデータの個数を取得して、「個数ラベル」に表示する。同時に8行目では、Excelシート上の、「E4」のセルに個数を表示する。

 図4の「フォームを表示」ボタンに関連付けるコードはリスト2と同様だ。

 実行した結果は図5のようになる。「一覧リストボックス」に追加されてデータの個数が、「個数ラベル」に表示され、Excelシートにも表示された。

ExcelVBA7TipsForm_03.png 図5
       1|2 次のページへ

Copyright© 2017 ITmedia, Inc. All Rights Reserved.

@IT Special

- PR -

TechTargetジャパン

この記事に関連するホワイトペーパー

RSSについて

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

メールマガジン登録

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