SSブログ

リストボックス 複数選択リストボックスを2つ使った選択画面 [リストボックス]

 複数リストボックスを使って、必要な項目を複数選択してもらう画面の応用です。
 選択する項目の数が多い場合、表示される項目がグループ単位で絞り込ができて、必要な項目だけが表示されるようになっていると、作業がしやすいと思います。

 例えば、こんなふうに都道府県を選択する画面を考えてみます。

右側の「都道府県」リストボックスに都道府県が表示されていて、こちらで都道府県を選択します。
 全部の都道府県が表示されていると、目的の項目が探しにくくなります。

 そこで、ある程度のグループに分けて、そのグループ単位で、「都道府県」リストボックスに表示される項目を絞り込めるようにします。この例では、「地方」リストボックスで、地方ごとに都道府県が表示されるようにします。

 図のように、「地方」リストボックスで、「中国地方」「九州地方」が選択された場合、「都道府県」リストボックスには、その地方にある都道府県が表示されるようにします。

 都道府県の表示内容を変える方法は、値集合ソース(RowSource)のSQLを書き換えます。
 ここで、ひとつ問題がでます。
 都道府県の値集合ソース(RowSource)を書き換えた時、その時までに選択していた都道府県の内容が、すべて解除された状態になってしまいます。
 地方を追加で選択する場合は、できればそれまでに選択した都道府県の内容が残った方がいいと思います。地方の選択を解除した場合は、仕方ないと思いますが。
 今回の例では、その辺を考慮した内容にしています。
 プログラムの作り方は、いろいろな方法があると思いますが、今回は配列に選択内容を一時的に待避して、都道府県が更新された後に選択内容を復元するようにしました。
 場合によっては、ワークテーブルを使った方が作りやすい場合もあるかと思います。

 使用するデータは下図のとおり。

 地方リストボックスは「lstCHIHO」。
 設定しているSQLは、
SELECT TMCHIHO.CHIHOCD, TMCHIHO.CHIHOMEI
FROM TMCHIHO
ORDER BY TMCHIHO.CHIHOCD;
 で、1列目は非表示にしています。 

 都道府県リストボックスは「lstTDFK」。
 設定しているSQLは、プログラムのとおり。
 地方コード、都道府県コード、都道府県名の3列になっていますが、地方コードと度道府県コードは非表示にしています。
 連結列は「2」列目に設定しています。

 地方リストボックスの選択内容が変わった場合に、プログラムを実行するようにします。「更新後処理」にイベントプロシージャを設定します。

Private Sub lstCHIHO_AfterUpdate()
'地方リストボックス 変更後処理

    Dim lngTDFK() As Long
    Dim lngC      As Long
    Dim lngI      As Long
    Dim lngJ      As Long

    Dim strSQL   As String
    Dim strWHERE As String
    Dim strORDER As String
    Dim strLIST  As String


'現在の都道府県の選択状況を保存
    ReDim lngTDFK(Me.lstTDFK.ListCount)
    lngC = 0
    For lngI = 0 To Me.lstTDFK.ListCount - 1
        If Me.lstTDFK.Selected(lngI) = True Then
            lngTDFK(lngC) = Me.lstTDFK.Column(1, lngI)
            lngC = lngC + 1
        End If
    Next

'都道府県SQL作成

    '1)都道府県のSQL
    strSQL = _
        " SELECT  CHIHOCD , TDFKCD , TDFKMEI " & _
        "   FROM  TMTDFK  "
    strWHERE = ""
    strORDER = " ORDER  BY  CHIHOCD , TDFKCD "

    '2)リストの選択状態から条件作成
    strLIST = ""
    For lngI = 0 To Me.lstCHIHO.ListCount - 1
        If Me.lstCHIHO.Selected(lngI) = True Then
            strLIST = strLIST & Me.lstCHIHO.Column(0, lngI) & " ,"
        End If
    Next

    '3)WHERE条件
    If strLIST <> "" Then
        '一番後ろの","を取る
        strLIST = Left(strLIST, Len(strLIST) - 1)
        '条件作成
        strWHERE = " WHERE CHIHOCD IN ( " & strLIST & " ) "
      End If

    '4)レコードソース設定
    Me.lstTDFK.RowSource = strSQL & strWHERE & strORDER


'都道府県の選択状況を復元
    lngI = 0
    lngJ = 0
    Do While Me.lstTDFK.ListCount > lngJ And lngI < lngC
   
        If lngTDFK(lngI) = Me.lstTDFK.Column(1, lngJ) Then
            Me.lstTDFK.Selected(lngJ) = True
            lngI = lngI + 1
            lngJ = lngJ + 1
        ElseIf lngTDFK(lngI) > Me.lstTDFK.Column(1, lngJ) Then
            lngJ = lngJ + 1
        ElseIf lngTDFK(lngI) < Me.lstTDFK.Column(1, lngJ) Then
            lngI = lngI + 1
        End If
    Loop
   
End Sub


 ざっくり説明になりますが、最初にとりあえず、現在の状態で都道府県リストの項目数ほどの配列を定義します。
 都道府県リストの選択状況をチェックしながら、選択された都道府県コードを配列に詰めていきます。選択されていない場合、配列は余るんですが、気にしません。

 その後、地方リストボックスの選択内容から、都道府県リストボックスのSQLを作成します。

 都道府県リストボックスが更新された後に、配列に待避したコードが新しい都道府県リストボックスに無いかチェックして、一致した場合は選択状態にします。

 こういったユーザーインターフェースが作成できると、設計のバリエーションが増えると思います。


nice!(0)  コメント(0)  トラックバック(0) 

nice! 0

コメント 0

コメントを書く

お名前:
URL:
コメント:
画像認証:
下の画像に表示されている文字を入力してください。

※ブログオーナーが承認したコメントのみ表示されます。
※URL(リンク)は記述できません。

トラックバック 0

トラックバックの受付は締め切りました

この広告は前回の更新から一定期間経過したブログに表示されています。更新すると自動で解除されます。