【VBA入門】リストボックスの使い方(リストの初期化、値の取得)

こんにちは!フリーランスの長野です。

リストボックスって使っていますか?リストボックスとは、VBAのユーザーフォームで使えるパーツの一つで、いくつか登録したテキストの中から選択する場合に使用します。この記事では、リストボックスについて

  • リストボックスとは
  • リストボックスの呼び出し方
  • リストボックスの初期化
  • リストボックスから値を取得する方法

など基本的な内容から複数選択する方法やコリストボックスのメソッドとプロパティなど応用的な内容についても解説していきます。今回はコンボボックスについて、わかりやすく解説します!

目次

リストボックスとは?

リストボックスとは、VBAのユーザーフォームで使えるパーツの一つで、いくつか登録したテキストの中から選択する場合に使用します。リストボックスの項目の中から、ひとつもしくは複数の項目を選択します。

listbox03

画像:リストボックス

リストボックスの呼び出し方

リストボックスはツールボックスから選択して、フォームにドラッグ&ドロップします。

listbox01

画像:リストボックス作成

listbox02

画像:リストボックス追加

なお、ユーザーフォームの呼び出し方、使い方などは、こちらで詳しく解説していますので、ぜひ参考にしてください。

リストボックスの初期化

リストボックスに項目を登録する方法についてみていきましょう。

AddItemで追加する方法

リストボックスにテキストを追加するには、AddItemメソッドを使います。AddItemメソッドは以下のように記述します。

AddItem(Item, [Index])

「[ ]」内は省略することができます。引数Itemは、追加するテキストを指定します。引数Indexは、追加する項目の位置を指定します。省略された場合は、リストの末尾に追加されます。

起動時に初期化する方法

あらかじめフォームが起動する際に、テキストを登録しておくことができます。以下のように記述します。

Private Sub UserForm_Initialize()
    With ListBox1
        .AddItem "北海道"
        .AddItem "青森"
        .AddItem "岩手"
    End With
End Sub

SubプロシージャUserForm_Initialize()でフォーム起動時の処理を定義します。

listbox03

画像:フォームにテキストの登録

リストボックスから値を取得する方法

リストボックスの中から何が選ばれたか取得するにはValueプロパティを使用します。例として、リストボックスから選択した値をコマンドボタンを押すとExcelのシート上に表示されるようにしてみましょう。

Private Sub CommandButton1_Click()
    Range("A1").Value = ListBox1.Value
End Sub

SubプロシージャCommandButton1_Click()は、コマンドボタンをダブルクリックすると自動で生成されます。選択したテキストを取得するために、Valueプロパティを使用しています。

listbox04

画像:実行

複数選択する方法

これまではリストボックスの項目の中から1つの項目を選択し、その値を取得する方法についてみてきました。

でも、選択する項目は1つとは限らないですよね。複数の項目を選択して、その値を取得する方法についてみていきましょう。

MultiSelectプロパティで設定

複数の項目を選択できるようにするには、MultiSelectプロパティで指定します。MultiSelectプロパティは以下の定数を指定することができます。

定数説明
fmMultiSelectSingle01つだけ選択(既定値)
fmMultiSelectMult1複数選択が可能
選択/選択解除は[Space]キーを押すか、またはクリック
fmMultiSelectExtended2複数選択が可能
[Shift]キーを押しながらクリックするか、または[Shift]キーを押しながら方向キーを押すと、連続的に選択
項目の選択/選択解除を個別に行うには、[Ctrl]キーを押しながらクリック

それでは、サンプルコードで確認しましょう。

Private Sub UserForm_Initialize()
    With ListBox1
        .AddItem "北海道"
        .AddItem "青森"
        .AddItem "岩手"
        
        .MultiSelect = fmMultiSelectMulti
    End With
End Sub

Subプロシージャ「UserForm_Initialize()」でフォーム起動時の処理を定義するときに、MultiSelectプロパティをfmMultiSelectMultiで指定します。

listbox05

画像:複数選択

複数の値を取得する方法

それでは複数選択した場合の値を取得する方法についてみていきましょう。複数選択した場合の値を取得するメソッドやプロパティは用意されていませんので、工夫して作る必要があります。Selectedプロパティで1項目ずつ順に選択されているか確認することになります。

Selectedプロパティは以下のように記述します。

Selected(Index)

Selectedプロパティは引数にリストのインデックス番号を指定し、ブール型の値を返します。サンプルコードで確認しましょう。

Private Sub CommandButton1_Click()
    Dim i As Integer, j As Integer
    j = 1
    
    With ListBox1
        For i = 0 To ListBox1.ListCount - 1
            If ListBox1.Selected(i) Then
                Cells(j, 1).Value = ListBox1.List(i)
                j = j + 1
                ListBox1.Selected(i) = False
            End If
        Next i
    End With
End Sub

このサンプルコードでは、Selectedプロパティを使って1つずつ選択されているか確認をしています。Selectedプロパティの値がTrueの場合、Listメソッドを使ってインデックス番号に該当する項目をExcelシート上に表示するようにしています。

これをListCountプロパティを使ってリストの項目数全てで同じ処理を繰り返し行っています。

listbox06

画像:複数選択の実行

リストボックスのメソッド、プロパティ

コンボボックスのメソッドとプロパティについてみていきましょう。

メソッド一覧

メソッドについては以下のとおりです。

メソッド説明
AddItem [Item][, Index]リストに項目を追加します。
引数Itemで追加する文字列を指定します。省略すると空白行が追加されます。
引数Indexで追加する位置を指定します。省略すると末尾に追加されます。
Clearリストに追加された全ての項目を削除します。
RemoveItem Indexリストの項目を1つ削除します。
引数Indexで項目の位置を指定します。

プロパティ一覧

主なプロパティについては以下のとおりです。

プロパティ定数(値)説明
RowSourceExcelシートのセルに入力された項目をリストに追加
ListCountリストの項目数
ListIndex選択されている項目のインデックス番号を取得
Selected複数選択される可能性がある場合に、選択されている場合はTrue、選択されていない場合はFalse
MultiSelect(上記参照)複数選択かどうかの指定
ListStylesfmListStylePlain(0)標準のリストボックスを表示(既定値)
fmListStyleOption(1)各項目の先頭にオプションボタンまたはチェックボックスを表示

Clearメソッドで削除

それではClearメソッドを使って、リストを全て削除する方法についてみていきましょう。

Private Sub CommandButton1_Click()
    With ListBox1
        .Clear
    End With
End Sub

コマンドボタンを押すとリストボックスのリストが全て削除されるように記述しています。

listbox07

画像:リストの削除

まとめ

ここでは、リストボックスの使い方について説明しました。Excelのシート入力だけでは入力フォームとして不足と感じる場合は、ユーザーフォームで使いやすい入力フォームを作れるようになると作業時間や入力ミスの削減になります。

リストボックスも使いこなすことができるように、この記事を何度も参考にして下さいね!

この記事を書いた人

熊本在住のフリープログラマ兼ライターです。C/C++/C#、Java、Python、HTML/CSS、PHPを使ってプログラミングをしています。専門は画像処理で最近は機械学習、ディープラーニングにはまっています。幅広くやってきた経験を活かしてポイントをわかりやすくお伝えしようと思います。
お問合せはこちらでも受け付けています。
info@sss-lab.com

目次