複数選択が可能なリストボックス等から値を取得する

 フォーム上のリストボックス及びコンボボックスでは「複数選択」オプションの設定などにより複数の値を選択することができます(コンボボックスの場合は連結コンボボックスのみ)。
 ここではそれらのコントロールについて、選択された複数の値を取得(参照)する例を示します。

非連結リストボックスの場合

f:id:accs2014:20190418152355p:plain:right:w400

 非連結の(コントロールソースがない、つまりテーブルやクエリのフィールドに結び付いていない)リストボックスの場合です。
 リストボックスを置き、名前を「lst_担当科目」として2列の値集合リストを設定します(設定値の詳細は省略しますが下記のテーブルの例と同様です)。
 次にコマンドボタンを置き、名前を「cmd_表示」とします。
 なお、ここでは各コントロールをフォームヘッダに置いています。

f:id:accs2014:20190418152352p:plain:right:w550

 フォームモジュールに次のようなコードを記します。

Option Compare Database

Private Sub cmd_表示_Click()

    Dim i As Variant
    Dim x As String

    For Each i In Me.lst_担当科目.ItemsSelected
        x = x & Me.lst_担当科目.Column(0, i) & "," & Me.lst_担当科目.Column(1, i) & vbNewLine
    Next

    MsgBox x

End Sub

 補足ですが、選択されている行番号はItemsSelectedコレクションで取得できますので(行番号の値は「1行目なら0、2行目なら1……」となります)、あとはColumnプロパティにより値を取得しています。

f:id:accs2014:20190418152349p:plain:right:w400

 ボタンを押した様子です。
 選択された各行の、2つの列の値が表示されています。

 なお、連結列の値を取得したいという場合はColumnプロパティ内の列番号として「0」の代わりに「Me.lst_担当科目.BoundColumn - 1」を指定します。BoundColumnすなわち連結列プロパティの値は1から始まる(1列目が1となる)ため、1を差し引く必要があります。

連結リストボックスの場合

ItemsSelectedコレクションを用いる例

f:id:accs2014:20190418152346p:plain:right:w500

 連結(コントロールソースとなるフィールドがある)リストボックス等の場合です。
 まずテーブルの設定です。テキスト型フィールド「担当科目」を設け、表示コントロールはリストボックス歳、列数を2としたうえで値集合ソースを設定します。

f:id:accs2014:20190418152343p:plain:right:w550

 そしてこのフィールドをフォームの詳細セクション上に置きます。
 同じ複数選択可のリストボックスでも非連結のものとは外見が異なるものとなります。
 リストボックスの名前を「lst_担当科目」とし、さらにコマンドボタンを置き名前を「cmd_表示」とします。
 ちなみにリストボックスの「複数選択」プロパティは「しない」であり、変更する必要はありません。

f:id:accs2014:20190418152503p:plain:right:w550

 フォームモジュールに次のようなコードを記します。
 やっていることは非連結の例と同様です。選択されている行番号をItemsSelectedコレクションで取得し、あとはColumnプロパティで値を取得しています。
 ただし、Columnプロパティで用いる列番号(カッコの中の最初の数字)が異なります。チェックボックスが表示されている関係で、実はこのリストボックスは(Columnプロパティ的には)3列になっていますので、2番目の列(番号1)と3番目の列(番号2)から値を取得しなければなりません。

Option Compare Database

Private Sub cmd_表示_Click()
    
    Dim i As Variant
    Dim x As String

    For Each i In Me.lst_担当科目.ItemsSelected
        x = x & Me.lst_担当科目.Column(1, i) & "," & Me.lst_担当科目.Column(2, i) & vbNewLine
    Next

    MsgBox x

End Sub

f:id:accs2014:20190418152459p:plain:right:w500

 最初のレコードのボタンをクリックした結果です。
 上記の例と同様に2つの列の値が表示されています。

 なお、連結列の値を取得したいという場合はColumnプロパティ内の列番号として「0」の代わりに「Me.lst_担当科目.BoundColumn」を指定します。上記のようにチェックボックスが最初の列として配置されているため、非連結リストボックスの例のように1を引いてはなりません。

Valueプロパティ等を用いる例

f:id:accs2014:20190418152456p:plain:right:w500

 ここから別の方法として、リストボックスのValueプロパティと、テーブルのフィールドからそれぞれ値を取得する例を試します。
 連結リストボックスとボタン2つを置き、名前をそれぞれ「lst_担当科目」「cmd_参照2」「cmd_参照3」とします。

f:id:accs2014:20190418155846p:plain:right:w350

 フォームビューに次のコードを記します。
 「表示2」をクリックしたときはリストボックスのValueプロパティ(これは配列として取得されます)により連結列(1,2,3という数字の方)の値を取得します。
 「表示3」をクリックしたときはリストボックスに連結しているテーブルの担当科目フィールド(これはカンマ区切りの1つの文字列として取得されます)により連結列の値を取得します。こちらの「.Value」は省略しても同じ結果になります。

Option Compare Database

Private Sub cmd_表示2_Click()

    Dim i As Variant
    Dim x As String

    'リストボックスのValueプロパティ(配列)から取得

    If Not IsNull(Me.担当科目.Value) Then
        For Each i In Me.lst_担当科目.Value
            x = x & i & vbNewLine
        Next
    End If

    MsgBox x

End Sub

Private Sub cmd_表示3_Click()

    Dim x As String

    'テーブルのフィールド(文字列)から取得

    If Not IsNull(Me.担当科目.Value) Then
        x = Me.担当科目.Value
    End If
    
    MsgBox x

End Sub

f:id:accs2014:20190418152449p:plain:right:w500

 「表示2」をクリックした結果です。

f:id:accs2014:20190418152539p:plain:right:w500

 「表示3」をクリックした結果です。
 これらの場合、連結列以外の列の値を取得するのが面倒なので注意が必要です。

連結コンボボックスの場合

 実例は省略しますが、コンボボックスにはItemsSelectedコレクションがないので上記リストボックスのValueプロパティの例に準ずることとなります。どうしてもItemsSelectedを使いたい場合はもう1つコンボボックスを置いてリストボックスに変換する手もありますが、これを不可視ないし極度に小さくすると値が取得できないという謎仕様があります。