リストボックスで選択した複数のデータを取得する方法(ItemsSelected、Column)
リストボックスで選択した複数のデータを取得してなにかしらの処理を行う際の方法です。コントロールはどの言語も似たり寄ったりな印象がありますが、Accessのリストボックスはちょっと毛色が違います。
目次
- サンプルイメージ
- 商品選択時のコード(VBA)
- 商品選択ダイアログを開いた時のコード(VBA)
サンプルイメージ
商品選択時のコード(VBA)
まず、商品選択ダイアログで「選択完了」を押した時のVBAの処理は以下の通りです。
Private Sub btn選択完了_Click()
Dim values As String
values = ""
For Each i In [lst商品選択].ItemsSelected
If Len(values) > 0 Then
values = values & ";"
End If
values = values & [lst商品選択].Column(0, i) & ";"
values = values & """" & [lst商品選択].Column(2, i) & """"
Next
[Forms]![注文詳細画面]![lst注文商品].RowSource = values
DoCmd.Close
End Sub
選択されたデータの行数をリストボックスの「ItemsSelected」で取得して、選択した数分ループし、リストボックスのColumn(col, row)でリストの内容を読み取っています。Column()は1つ目の引数が列位置で、2つ目の引数が行位置。数値はどちらもゼロ(0)スタートですが、リストボックスのプロパティ「列見出し」を「はい」に設定している場合は、見出し行が1行目になります。
呼び出し元のフォームでは「ID」と「商品名」だけ表示するようにしているので、上記のコードでは、1番目の「ID」列と、3番目の「商品名」列のみ取得して、値リストのデータを生成しています。
商品選択ダイアログを開いた時のコード(VBA)
続いて、呼び出し元のフォーム(注文詳細画面)の商品リストから選択済みの商品を、商品選択ダイアログのリストに反映する処理は以下の通りです。
Private Sub Form_Load()
For i = 0 To [Forms]![注文詳細画面]![lst注文商品].ListCount - 1
For j = 0 To [lst商品選択].ListCount - 1
If ([Forms]![注文詳細画面]![lst注文商品].ItemData(i) = [lst商品選択].ItemData(j)) Then
[lst商品選択].Selected(j) = True
End If
Next
Next
End Sub
どちらのリストも商品を一意に特定することのできる「ID」列を連結列に指定しているので、IDが一致したデータの「Selected」をTrueに設定しています。
こういったリストの選択方法は画面の構成や選択方法によって違ってくるので、参考程度でお願いします。