Access VBA リストボックスを複数選択して別のリストへ移動する

スポンサーリンク

Access VBAでリストボックスを複数選択し、選択した項目を別のリストボックスへ移動する方法と
「複数選択」に対応したリストボックスの設定方法と、選択項目を追加・削除するVBAコードを解説します。

※5/13 subSetMoveSkill関数に誤りがありましたので修正しました

前回:【Access】(VBA)リストボックスで選択した値を他のリストボックスに移動するの続きです。

リストボックスを複数選択すると、前回ご紹介した追加ボタンの方法だと上手く動作しなくなるので
追加ボタンのVBAも修正して複数選択対応版にしてみたいと思います。

スポンサーリンク

Accessのリストボックスを複数選択にする方法

リストボックスのプロパティから、

その他 → 複数選択

を設定します。

しない:1項目のみ選択
標準:Ctrlキーなどを使って複数選択
拡張:範囲選択などが可能

このようにすると、**「Access リストボックス 複数選択 設定」**系の検索にも拾われやすくなります。

プロパティの変更

リストボックスコントロールを右クリックして、プロパティを表示します。
プロパティのその他タブにある複数選択の値は、
初期値が「しない」になっているのでそれを標準か拡張に変更します。

リストボックス
名前:lstSkill_1

プロパティ>その他>複数選択
・しない
・標準
・拡張

標準は、1つ1つ選択(クリックして複数選択)に対し
拡張の方は、マウスドラッグで複数選択ができます。

複数選択した項目を別のリストボックスへ移動する

VBA関数の修正

前回ご紹介した「subSetMoveSkill()」関数を修正しました。

Rem ----------------------------------------------------------------------------------
Rem     関数名   : subSetMoveSkill
Rem     処理内容 : リストで選択された項目をもう1つのリストへコピーし削除する。
Rem     引  数  : pMotoControlNm;移動元コントロール名、pSakiControlNm:移動先コントロール名
Rem     戻り値  : なし
Rem ----------------------------------------------------------------------------------
Private Sub subSetMoveSkill(pMotoControlNm As String, pSakiControlNm As String)
Dim varData     As Variant
Dim lngDelIdx() As Long    ' 削除インデックス
Dim j As Integer

On Error GoTo Error

    ' 選択された項目を右にコピー
    For Each varData In Controls(pMotoControlNm).ItemsSelected
        Controls(pSakiControlNm).AddItem Controls(pMotoControlNm).ItemData(varData)
    Next
    
'    ' 選択された項目を削除→全部削除されてしまうので×
'    For i = Controls(pMotoControlNm).ListCount To 1 Step -1
'        Controls(pMotoControlNm).RemoveItem i - 1
'    Next
    
    ' 選択されている項目Noを取得
    j = 0
    For i = 0 To Controls(pMotoControlNm).ListCount
        If Controls(pMotoControlNm).Selected(i) Then
            ReDim Preserve lngDelIdx(j)
            lngDelIdx(j) = i
            j = j + 1
        End If
    Next
    
    ' 選択された項目を削除
    For i = j - 1 To 0 Step -1
        Controls(pMotoControlNm).RemoveItem lngDelIdx(i)
    Next

    ' スキル要約に反映
    Call subSetSkillYoyak
    
Exit Sub
Error:
    MsgBox "エラーが発生しました。エラー内容:" & Err.Description & Chr$(10), vbCritical, frmNm & "関数:subSetMoveSkill"
End Sub

ItemsSelectedで選択された項目を取得する

Accessのリストボックスで複数選択された項目を取得するには、ItemsSelectedを使用できます。

コード例

    ' 選択された項目を右にコピー
    For Each varData In Controls(pMotoControlNm).ItemsSelected
        Controls(pSakiControlNm).AddItem Controls(pMotoControlNm).ItemData(varData)
    Next

選択した項目を削除するときの注意点

修正ポイント1

選択された項目を右に移動するのと、選択された項目を削除する処理を別々にしました。

こちらは選択された項目を右のリストボックスにコピーしています

    
    ' 選択された項目を右にコピー
    For Each varData In Controls(pMotoControlNm).ItemsSelected
        Controls(pSakiControlNm).AddItem Controls(pMotoControlNm).ItemData(varData)
    Next

修正ポイント2

↓↓↓↓↓このやりかただと全部削除されてしまいます
    
    ' 選択された項目を削除
'    For i = Controls(pMotoControlNm).ListCount To 1 Step -1
'        Controls(pMotoControlNm).RemoveItem i - 1
'    Next
↓↓↓↓↓正しくは下記の方法になります
    
    ' 選択されている項目Noを取得
    j = 0
    For i = 0 To Controls(pMotoControlNm).ListCount
        If Controls(pMotoControlNm).Selected(i) Then
            ReDim Preserve lngDelIdx(j)
            lngDelIdx(j) = i
            j = j + 1
        End If
    Next
    
    ' 選択された項目を削除
    For i = j - 1 To 0 Step -1
        Controls(pMotoControlNm).RemoveItem lngDelIdx(i)
    Next

最初に選択されている項目Noを取得し変数に格納しておきます。
その後、後ろのコントロールから削除していきます。

コメント

タイトルとURLをコピーしました