TextプロパティとValueプロパティの違い


リストボックスで選択されているデータは、ListBoxのTextプロパティで取得できます。

Private Sub CommandButton1_Click()
    MsgBox ListBox1.Text
End Sub

実はもうひとつ、リストボックスには選択されている項目を返すプロパティがあります。それは、Valueプロパティです。

Private Sub CommandButton1_Click()
    MsgBox ListBox1.Value
End Sub

TextプロパティとValueプロパティは、どちらもリストボックスで選択されている項目名(文字列)を返しますが、両者は「リストボックスで何も選択されていない」ときに、結果が異なります。まず、Textプロパティから。

Textプロパティは、リストボックスで何も選択されていないとき、空欄("")を返します。では、Valueプロパティはどうでしょう。

リストボックスで何も選択されていないときにValueプロパティを表示しようとするとエラーになります。エラーメッセージから推測するに、何も選択されていないときのValueプロパティは、Nullの状態みたいです。

一般的には、リストボックスで選択されている項目は、Textプロパティで調べればいいのですが、何らかの事情があって、リストボックスで選択されている項目を、どうしてもValueプロパティで取得しなければならないのなら「何も選択されていない」状態かどうかを次のように判定してください。

Private Sub CommandButton1_Click()
    If ListBox1.ListIndex = -1 Then
        MsgBox "何も選択指されていません"
    Else
        MsgBox ListBox1.Value
    End If
End Sub

ListIndexプロパティは、単一選択のリストボックスで、現在選択されている項目の位置(インデックス値)を返します。リストボックスの先頭(一番上)が「0」です。何も選択されていないときのListIndexプロパティは「-1」になりますので、これを調べます。次のように、ValueプロパティがNullかどうかを判定することもできますが、

Private Sub CommandButton1_Click()
    If IsNull(ListBox1.Value) Then
        MsgBox "何も選択指されていません"
    Else
        MsgBox ListBox1.Value
    End If
End Sub

ValueプロパティがNullになる根本の原因は「何も選択されていない」ことです。であるなら、ListIndexプロパティで、選択されている項目の位置を調べるのが筋でしょう。

なお、ListIndexプロパティは、値を設定することも可能です。ListIndexプロパティに任意の値を設定すると、リストボックスで選択されている項目の位置を自由に変更できます。リストボックスは選択してなんぼですから、最初にデータを登録する時点で、次のように最初の選択位置を明示的に指定するといいでしょう。

Private Sub UserForm_Initialize()
    Dim i As Long
    For i = 1 To 18
        ListBox1.AddItem Cells(i, 1)
    Next i
    If ListBox1.ListCount > 0 Then
        ListBox1.ListIndex = 0
    End If
End Sub

ListIndexプロパティを設定する前に、ListCountプロパティでリストボックスに登録されたデータ個数を判定しているのは"念のため"です。上記のコードではあり得ませんが、もし1つもデータが登録されていないリストボックスに対して「ListIndex = 0」を実行するとエラーになります。