目次
はじめに
ユーザーフォームのリストボックスでユーザーに項目を選択してもらった後、その「選択された行のデータを取得する」のは、VBAツールの開発において最も基本的な操作の一つです。特に、複数列のリストボックスの場合、選択された行の特定の列(例: 2列目の商品名)のデータを正確に取得する必要があります。
この記事では、リストボックスでユーザーが選択した行のインデックス番号を取得し、その行の各列のデータを個別に取得するための、確実で分かりやすい方法を解説します。
選択項目を取得するVBAサンプルコード
このマクロは、「取得」ボタンがクリックされたときに、リストボックスで選択されている項目をチェックし、その内容をメッセージボックスに表示します。
複数列のリストボックスが、フォームの初期化(Initialize
)イベントで、シートの表などから既に設定されていることを前提とします。
ユーザーフォームのコード
' 「取得」ボタン(GetDataButton)がクリックされたときの処理
Private Sub GetDataButton_Click()
'== 変数を定義します ==
Dim selectedRowIndex As Long
Dim messageText As String
' Withブロックで対象のリストボックス(ProductListBox)を明示
With Me.ProductListBox
' .ListIndexプロパティで選択されている行のインデックスを取得
selectedRowIndex = .ListIndex
'== 何も選択されていないかチェック ==
' ListIndexは何も選択されていない場合 -1 を返す
If selectedRowIndex = -1 Then
MsgBox "項目が選択されていません。", vbExclamation
Exit Sub
End If
'== 選択された行の各列のデータを取得 ==
messageText = "【選択された商品情報】" & vbCrLf & vbCrLf & _
"商品ID: " & .List(selectedRowIndex, 0) & vbCrLf & _
"商品名: " & .List(selectedRowIndex, 1) & vbCrLf & _
"価 格: " & .List(selectedRowIndex, 2) & " 円"
End With
'== 結果をメッセージボックスに表示 ==
MsgBox messageText, vbInformation, "選択内容の確認"
End Sub
コードの解説
selectedRowIndex = .ListIndex
この一行が、ユーザーの選択を取得するための第一歩です。
.ListIndex
: リストボックスで現在選択されている項目のインデックス番号を返すプロパティです。- このインデックスは 0から始まることに注意してください。リストの1行目が選択されていれば
0
、2行目なら1
が返されます。 - ユーザーが何も選択していない場合、
.ListIndex
は-1
を返します。そのため、次のIf selectedRowIndex = -1 Then
で、項目が選択されているかどうかを確実にチェックできます。
.List(selectedRowIndex, 0)
選択された行の具体的なデータを取得するための核心部分です。
.List
: このプロパティは、引数を指定することで、リスト内の特定の位置のデータに直接アクセスできます。.List(行インデックス, 列インデックス)
: 2つの引数を指定します。- 第1引数: 行のインデックス番号(先ほど取得した
selectedRowIndex
)。 - 第2引数: 列のインデックス番号(こちらも0から始まります。1列目なら
0
、2列目なら1
…)。
- 第1引数: 行のインデックス番号(先ほど取得した
.List(selectedRowIndex, 0)
は、「ユーザーが選択した行の、1列目のデータ」を意味します。
まとめ
今回は、ユーザーフォームのリストボックスで、ユーザーが選択した項目のデータを取得する方法を解説しました。
.ListIndex
プロパティで、選択されている行のインデックス番号(0始まり)を取得する。.ListIndex
が -1 でないことを確認し、項目が選択されていることをチェックする。.List(行インデックス, 列インデックス)
を使って、目的のセルのデータをピンポイントで取得する。
この手順をマスターすれば、ユーザーの選択に基づいて、詳細情報を表示したり、計算を行ったりと、様々なインタラクティブな処理を実装することができます。