業務効率化に役立つVBA/マクロのさまざまなTipsをコード例を交えて紹介していきます。今回は、選択されている値を取得するListプロパティやデータの個数を取得するListCountプロパティの使い方に加え、複数選択データを取得する方法を解説する。
今回もリストボックスコントロールの使い方として3つのTipsを解説する。「リストボックスで選択されている値を取得する」方法と「リストボックス内のデータの個数を取得する」方法を基本的なものとして紹介し、この2つを組み合わせたテクニックとして「リストボックスで複数選択データを取得する」方法を紹介する。
まずは、リストボックスで選択されている値を取得するTipsを紹介しよう。VBAでは頻繁に必要となる処理なので覚えておいてもらいたい。特に難しいコードではなく、「リストボックスに表示されている値は、Listプロパティ内に配列形式で格納されている」ということを頭に入れておけば、値を取り出すことは簡単だ。
{オブジェクト}.Text
{オブジェクト}.List({インデックス})
リストボックスから選択した値を表示する方法は上記の通り2通りある。{オブジェクト}にはリストボックスオブジェクトを指定する。
一つはTextプロパティで、リストボックスより選択されている値を取得できる。
もう一つはListプロパティだ。リストボックスに表示されているデータは、Listプロパティに配列形式で格納されているため、リストボックスの選択した項目の{インデックス}を指定して取得できる。
Textプロパティは使い方が一目瞭然なので、今回は、Listプロパティを使った方法で解説する。
実行するデータとフォームを用意しよう。まず、Excelシートに前回と同じ、図1のようなデータと「フォームを表示」ボタンを作成しておく。
次に、ユーザーフォームを作成する。UserForm1のCaptionプロパティに、「リストボックスのデータ選択フォーム」と指定しておく。
ユーザーフォーム上には、ラベルを1個と、リストボックスを1個配置しておく。プロパティから、ラベルの「オブジェクト名」には、「氏名ラベル」、リストボックスの「オブジェクト名」には、「一覧リストボックス」としておく。
ラベルのプロパティから、「BorderStyle」に「fmBorderStyleSingle」を選択して、枠線を表示しておく。「Caption」プロパティ内は空にしておく。
これらを図2のように配置する。ラベルやリストボックスの「書体」や「文字サイズ」は、「Font」プロパティから指定している。読者の皆さんの好きな指定にしてもらって構わない。
プロジェクト内のUserForm1を選択して、マウスの右クリックで表示される、「コードの表示」を選択してコードを記述する。
なお、ユーザーフォームがアクティブになったときの処理を記述するコードは、「リストボックスにデータを追加する」Tipsのリスト1と同じなので省略する。
まずは、「一覧リストボックス」から氏名が選択されたときの処理を解説しよう(リスト1)。一覧リストボックス_Changeイベント内に記述する。
Private Sub 一覧リストボックス_Change() Dim 氏名インデックス As Integer 氏名インデックス = 一覧リストボックス.ListIndex 氏名ラベル.Caption = 一覧リストボックス.List(氏名インデックス) Cells(氏名インデックス + 3, 2).Select End Sub
2行目でInteger型の「氏名インデックス」変数を宣言する。
3行目では、変数「氏名インデックス」に、「一覧リストボックス」から選択されたインデックスの値(ListIndexプロパティ)を格納しておく。
4行目では、「氏名ラベル」に、「一覧リストボックス」の値を、配列として持っている「List」プロパティに、「氏名インデックス」の格納している値を指定し、内容を取得して表示する。
5行目では、Excelシート上の同じ値も、選択状態にしている。
次にVBE(Visual Basic Editor)のメニューから、[挿入]→[標準モジュール]を選択する。プロジェクト内にModule1が追加されるので、この中に「フォームの表示」のコードを記述する(リスト2)。
Option Explicit Sub フォームの表示() UserForm1.Show vbModeless End Sub
ShowメソッドでUserForm1をモードレスで表示する簡単なものだ。
このリスト2のコードを図1の「フォームを表示」ボタンに関連付け実行した結果が図3だ。「一覧リストボックス」から選択された値が、「氏名ラベル」に表示され、Excelシート上の同じ「氏名」も選択状態になった。
リストボックス内のデータの個数を取得する方法は、これもVBAではよく必要とされる処理なので覚えておいてもらいたい。特に難しいコードではなく、ListCountプロパティで取得できるので簡単だ。
{オブジェクト}.ListCount
{オブジェクト}には、リストボックスオブジェクトを指定する。
Excelシートを追加して、図1と図2同様のデータとフォームを作成しておく。図1と異なる点は、「データの個数」を表示するセルを設置しておく点だ(図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
4〜6行目では、「B3」のセルから「B10」のセルまでのデータを、AddItemメソッドで「一覧リストボックス」に追加している。
7行目のListCountプロパティで、「一覧リストボックス」内のデータの個数を取得して、「個数ラベル」に表示する。同時に8行目では、Excelシート上の、「E4」のセルに個数を表示する。
図4の「フォームを表示」ボタンに関連付けるコードはリスト2と同様だ。
実行した結果は図5のようになる。「一覧リストボックス」に追加されてデータの個数が、「個数ラベル」に表示され、Excelシートにも表示された。
Copyright © ITmedia, Inc. All Rights Reserved.