リストボックスで選択されているデータは、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プロパティに任意の値を設定するとk、リストボックスで選択されている項目の位置を自由に変更できます。リストボックスは
選択してなんぼ ですから、最初にデータを登録する時点で、次のように最初の選択位置を明示的に指定するといいでしょう。
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」を実行するとエラーになります。