#300 リストボックスの列見出しのクリックで並べ替えを行なう方法 フォーム、VBA

エクスプローラのファイルの詳細表示などでは、リスト上の見出し部分をクリックすることによって、その列を基準とした並べ替えを実行することができます。
エクスプローラの詳細表示

ここでは、このような機能をAccessのリストボックスに付加する方法を紹介します。


リストボックスコントロールでは、イベントによってリストのどの項目がクリックされたかは検出することができますが、「列見出し部分がクリックされたということ」あるいは「どの列がクリックされたか」をイベントとして検出することはできません。そこでまず、その方策を工夫する必要があります。ここでは、"MouseDown/マウスボタンクリック時"イベントを使ってそれを判別します。

このイベントでは、リストボックスコントロール上のどの位置がクリックされたかが、左上端からの座標値(XとY)として与えられます。この2つの値を調べることによって上記の判別を行ないます。とはいっても、列見出しの高さやそれぞれの列項目の幅はデザインによって変わりますので、デザインが確定した段階で、それぞれの値を事前に調べておかなければなりません。そこで、フォーム上に2つのテキストボックスを配置して、次のようなMouseMoveイベントプロシージャを作成、これによって列見出しの高さ(Y値)や各列の幅(X値)を確認しておきます。なお、このコードはあくまで開発用のものですので、MouseDownイベントプロシージャが完成したら、テキストボックスといっしょに削除してしまってかまいません。
Private Sub リスト受注_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single)
'クリック座標確認用コード

  Me!txtX = X
  Me!txtY = Y

End Sub

各座標値が確認できたら、次のようにしてMouseDownイベントプロシージャを作成し、上記で調べた値をそれぞれ適用します。Case節の数やそれぞれの値、SQL文の内容などは作成するフォーム内容によって変わりますので、適宜書き換えて応用してください。
Private Sub リスト受注_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single)
'リストボックスでのマウスボタンクリック時

  Dim strOrderBy As String
  Const cstrSQLHeader As String = "SELECT 受注コード, 得意先コード, 社員コード, " & _
                                  "出荷先名, 出荷先都道府県 FROM 受注 ORDER BY "

  'Y座標をチェックして列見出し上でのクリックかどうか確認
  If Y <= 180 Then
    '列見出し上でのクリックの場合はどの列でのクリックかを確認し、
    'その列をORDER BY句に指定したSQL文を組み立て
    Select Case X
      Case Is <= 915      '1列目
        strOrderBy = "受注コード"
      Case Is <= 1995     '2列目
        strOrderBy = "得意先コード"
      Case Is <= 2910     '3列目
        strOrderBy = "社員コード"
      Case Is <= 4890     '4列目
        strOrderBy = "出荷先名"
      Case Else           '5列目
        strOrderBy = "出荷先都道府県"
    End Select
    'リストボックスの値集合ソースを更新
    Me!リスト受注.RowSource = cstrSQLHeader & strOrderBy
  End If

End Sub

2列目の見出しをクリックしたとき
2列目をクリックしたとき

3列目の見出しをクリックしたとき
3列目をクリックしたとき
| Index | Prev | Next |

この情報は参考になりましたか?、問題は解決しましたか?、もしまだなら......
T'sWareのワンポイトテクニカルアドバイスをご利用ください。3000円/件〜でご支援します。
スタンドアロンからSQL Server対応まで、オーダーメイドのシステムを短納期・安価でお届けします
 

Copyright © T'sWare All rights reserved