2020.2.3

リストボックスで選択した複数のデータを取得する方法(ItemsSelected、Column)

リストボックスで選択した複数のデータを取得してなにかしらの処理を行う際の方法です。コントロールはどの言語も似たり寄ったりな印象がありますが、Accessのリストボックスはちょっと毛色が違います。

目次

  • サンプルイメージ
  • 商品選択時のコード(VBA)
  • 商品選択ダイアログを開いた時のコード(VBA)

サンプルイメージ

簡単なサンプルとしてベースとなるフォーム(注文詳細画面)を用意して、

「商品選択」ボタンを押すと商品選択ダイアログを開き、

リストの項目を複数選択した状態で「選択完了」を押すと、呼び出し元のリストボックス(商品)に選択したデータをセットします。

呼び出し元の商品リストは「値リスト」、商品選択ダイアログのリストは「テーブル/クエリ」から取得したデータになります。

どちらのリストも1番最初の列は「ID」で商品を一意に特定するための列(非表示)になっています。

商品選択時のコード(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に設定しています。

こういったリストの選択方法は画面の構成や選択方法によって違ってくるので、参考程度でお願いします。

Access】関連記事