リストボックスから複数のアイテムを選択するには



フォーム上にリストボックスを2個左右に配置して、左側のリストボックスから選択したアイテムを右側のリストボックスに移動させるためのテクニックを解説します。ここで紹介するテクニックを利用すると、選択可能アイテム(Available Items)と選択されたアイテム(Selected Items)を一目で区別することができます。

  1. Access 97を起動して新規データベースを作成します。
  2. データベースウインドウが表示されたら、モジュールのタブをクリックして新規作成ボタンをクリックします。
  3. メニューのツールから参照設定をクリックして、データベースライブラリー(MyLib.mda)を登録します。
  4. データベースウインドウからフォームのタブをクリックして、新規作成ボタンをクリックします。
  5. フォームが表示されたら、フォーム上の左右に2個のリストボックス、アイテム移動用のコマンドボタン4個、そしてアイテムを表示するためのコマンドボタン2個作成します。
    Forms_Intermediate_009_fig1
    図1-フォーム上に2個のリストボックスとアイテム移動用のコマンドボタンを作成

    各オブジェクトのプロパティは以下のように設定します。

    Object Property Setting
    ListBox1 Name lstAvailableItems
    Multi Select Extended
    Column Count 1
    ListBox2 Name lstSelectedItems
    Multi Select Extended
    Column Count 1
    CommandButton1 Name cmdAddOne
    Caption >
    CommandButton2 Name cmdAddAll
    Caption >>
    CommandButton3 Name cmdRemoveOne
    Caption <
    CommandButton4 Name cmdRemoveAll
    Caption <<
    CommandButton5 Name cmdShowAvailabeItems
    Caption Show Available Items
    CommandButton6 Name cmdShowSelectedItems
    Caption Show Selected Items


    フォームのOn Open, On Closeイベント、それから各コマンドボタンののOn Clickイベントに以下のVBAコードを追加します。また、リストボックスからアイテムをダブルクリックしたときにアイテムが移動するように、リストボックスのOn Dbl ClickイベントにcmdAddOne_Click, cmdRemoveOne_Clickを呼び出すコードを追加します。

    各種イベントで使用している、AddItem, RemoveSelected(RemoveItem), Clear, ListCount, ItemData, Control などは、MyLib.mdaに登録されているクラスライブラリー(clsMyBox)のメソッドです。

    リスト1-各種イベント処理用コード
    Dim mobjAvailableItems As Object
    Dim mobjSelectedItems As Object
    
    Private Sub cmdAddAll_Click()
      Dim intItem As Integer
      
      With Me!lstAvailableItems
          For intItem = 0 To .ListCount - 1
              mobjSelectedItems.AddItem .ItemData(intItem)
          Next intItem
      End With
      mobjAvailableItems.Clear
    
    End Sub
    
    Private Sub cmdAddOne_Click()
      Dim varItem As Variant
        
      With Me!lstAvailableItems
          For Each varItem In .ItemsSelected
              mobjSelectedItems.AddItem .ItemData(varItem)
          Next varItem
      End With
      mobjAvailableItems.RemoveSelected
    
    End Sub
    
    Private Sub cmdRemoveAll_Click()
      Dim intItem As Integer
      
      With Me!lstSelectedItems
          For intItem = 0 To .ListCount - 1
              mobjAvailableItems.AddItem .ItemData(intItem)
          Next intItem
      End With
      mobjSelectedItems.Clear
    
    End Sub
    
    Private Sub cmdRemoveOne_Click()
      Dim varItem As Variant
        
      With Me!lstSelectedItems
          For Each varItem In .ItemsSelected
              mobjAvailableItems.AddItem .ItemData(varItem)
          Next varItem
      End With
      mobjSelectedItems.RemoveSelected
    
    End Sub
    
    Private Sub cmdShowAvailableItems_Click()
      Dim varItems As Variant
      Dim intItem As Integer
      
      With mobjAvailableItems
          For intItem = 1 To .ListCount
              varItems = varItems & .ItemData(intItem) & vbCrLf ' 1-based index
          Next intItem
      End With
      
    ' With Me!lstAvailableItems
    '     For intItem = 0 To .ListCount - 1
    '         varItems = varItems & .ItemData(intItem) & vbCrLf ' 0-based index
    '     Next intItem
    ' End With
      
      MsgBox varItems, vbInformation, "Available Items"
    
    End Sub
    
    Private Sub cmdShowSelectedItems_Click()
      Dim varItems As Variant
      Dim intItem As Integer
      
      With mobjSelectedItems
          For intItem = 1 To .ListCount
              varItems = varItems & .ItemData(intItem) & vbCrLf  ' 1-based index
          Next intItem
      End With
      
    ' With Me!lstSelectedItems
    '     For intItem = 0 To .ListCount - 1
    '         varItems = varItems & .ItemData(intItem) & vbCrLf ' 0-based index
    '     Next intItem
    ' End With
      
      MsgBox varItems, vbInformation, "Selected Items"
    
    End Sub
    
    Private Sub Form_Close()
      Dim varRet As Variant
      varRet = CloseMyBox_FS("A", mobjAvailableItems)
      varRet = CloseMyBox_FS("S", mobjSelectedItems)
    End Sub
    
    Private Sub Form_Open(Cancel As Integer)
    
      Set mobjAvailableItems = GetMyBox_FS("A")
      Set mobjAvailableItems.Control = Me!lstAvailableItems
      
      Set mobjSelectedItems = GetMyBox_FS("S")
      Set mobjSelectedItems.Control = Me!lstSelectedItems
      
      With mobjAvailableItems
          .AddItem "青森県"
          .AddItem "秋田県"
          .AddItem "岩手県"
          .AddItem "山形県"
          .AddItem "茨城県"
          .AddItem "福島県"
      End With
      
    End Sub
    
    Private Sub lstAvailableItems_DblClick(Cancel As Integer)
      cmdAddOne_Click
    End Sub
    
    Private Sub lstSelectedItems_DblClick(Cancel As Integer)
      cmdRemoveOne_Click
    End Sub
    

    フォームのOn Openイベントでは、clsMyBoxのインスタンスを生成してモジュールレベルのメモリ変数(mobjAvailableItems, mobjSelectedItems)に格納します。また、左側のリストボックスにはアイテムとして都道府県名を表示させます。 On Closeイベントでは、インスタンスをクローズします。

    Add One(>)のボタンをクリックしたときは、選択したアイテムを左側のAvailable Itemsから右側のSelected Itemsに移動します。Add All(>>)のボタンをクリックしたときは、左側の全アイテムを右側に移動します。

    Remove One(<), Remove All(<<)のボタンをクリックしたときは、逆に右側のSelected Itemsから左側のAvailable Itemsに移動させます。

  6. フォームをfrmMultiSelectListBoxDemoの名称で保存します。
  7. ビューモードに切り替えたら、左側のリストボックスから任意のアイテムを選択してのボタンをクリックします。(アイテムをダブルクリックしてもよい)複数のアイテムを選択したら、Show Itemのボタンをクリックして確認します。

    Forms_Intermediate_009_fig2
    図2-左側のリストボックスから複数のアイテムを選択した例
  8. 最後に、フォームを閉じてAccessを終了します。