- 締切済み
ACCESS リストボックスにレコードを表示した時に名前順にしたい
ACCESSでVBAを使い個人のデータ・取引先のデータの登録をしたり、個人の売上を計算したりするものを作成しています。 いろいろと問題はあるのですが、とりあえず今困っているところは個人のデータなどを登録する前に使用する個人の名前を選択するフォームの所です。 取引先と業務名の2つのコンボボックスで選択した条件に合うものをリストボックスに表示するというところで、表示したものを[ order by フリガナ ]みたいな名前順にしたいのですがどのようにしたらよろしいでしょうか? テーブルは下記の通りです。 T_個人データ(テーブル名) 個人コード、氏名、フリガナ、所属課 T_取引先マスタ(テーブル名) 取引先コード、取引先名 T_業務マスタ(テーブル名) 業務コード、業務名、取引先コード、個人コード 他にもテーブルの種類と項目などはありますが今回必要なのはこのようになっています。 コードは下記の通りです。 lst○○・・・リストボックス、cmb○○・・・コンボボックス、 Private Sub cmb業務名_AfterUpdate() Dim adoCON As ADODB.Connection Dim adoRs As ADODB.Recordset Dim adoRRs As ADODB.Recordset Dim toricode, gyomucode, kojincode As Integer Dim tori, gyomu As String Dim RRs As String Dim db As Database Dim rs As Recordset Dim mySQL As String Dim i As Long tori = cmb取引先名.Text gyomu = cmb業務名.Text if文で If gyomu = "全て" And tori = "全て" Then(省略) ElseIf gyomu = "全て" Then(省略) そして下記のそれ例外の時(cmb取引先とcmb業務名が " 全て " 以外の時)というように分けています。 Else Me.lst表示.RowSourceType = "Value List" Me.lst表示.ColumnHeads = True Me.lst表示.RowSource = "" 'コンボボックスの取引先名から取引先コードを抽出 Set adoCON = Application.CurrentProject.Connection Set adoRs = adoCON.Execute("select 取引先コード from T_取引先マスタ where 取引先名 = ('" & tori & "')") toricode = adoRs.Fields("取引先コード").Value ' 抽出した取引先コード(cmb取引先名)とcmb業務名で選択している業務名の一致する個人コードをT業務マスタから抽出する Set adoRs = adoCON.Execute("select DISTINCT 個人コード from T_業務マスタ where ((取引先コード = " & toricode & ") and (業務名 = '" & gyomu & "'))") Do Until adoRs.EOF kojincode = adoRs.Fields("個人コード").Value Set adoRRs = adoCON.Execute("select 氏名,個人コード from T_個人データ where 個人コード = " & kojincode) Me.lst表示.RowSourceType = "Value List" If i = 0 Then Me.lst表示.AddItem (adoRRs.Fields("氏名").Name & ";" & adoRRs.Fields("個人コード").Name) End If Me.lst表示.AddItem (adoRRs.Fields("氏名").Value & " ; " & adoRRs.Fields("個人コード").Value) i = i + 1 adoRs.MoveNext Loop lbl件数.Caption = "全 " & i & " 件" adoCON.Close Set adoRs = Nothing Set adoCON = Nothing Set adoRRs = Nothing DoCmd.Requery "lst表示" DoCmd.Requery "cmb業務名" End If コンボボックスに"全て"を表示したりなどで殆どをコードで行っています。 その為、リストボックスの値集合タイプは"値リスト"と"テーブル/クエリ"をBVAで使い分けています; Me.lst表示.RowSource = ~~ なども試してみたのですがなかなか上手くいかず、additemの形式で行いました。 わかりずらい説明だとは思いますが、説明のアドバイスも含め解決方法がありましたらよろしくおねがいします。
- みんなの回答 (1)
- 専門家の回答
みんなの回答
- redfox63
- ベストアンサー率71% (1325/1856)
RowSourceでやったほうが簡単なのでは ・・・ SELECT DISTINCTROW T_個人データ.氏名, T_個人データ.個人コード FROM T_個人データ (INNER JOIN T_業務マスタ ON T_個人データ.個人コード = T_業務マスタ.個人コード) INNER JOIN T_取引先マスタ ON T_業務マスタ.取引先コード = T_取引先マスタ.取引先コード WHERE (((T_取引先マスタ.取引先名) Like Nz([Forms]![MyFrom1]![取引先名],"*")) AND ((T_業務マスタ.業務名) Like Nz([Forms]![MyFrom1]![業務名],"*"))) ORDER BY Person.フリガナ; といった具合にのRowSourceを設定しておきます 表示は 個人データの『氏名』『コード』 ソートをフリガナ 絞込みを 取引先マスタの『取引先名』と業務マスタの『業務名』 テーブル間のリレーションを 業務マスタ『個人コード』= 個人データ『個人コード』と業務マスタ『取引先コード』=取引先マスタ『取引先コード』 Like演算子と Nz関数で 絞込みを制御しましょう テキストボックスのAferUpdateで DoCmd.Requery "lst表示" といった具合で表示しますよ
お礼
RowSourceを使った方が簡単なのですが、書いてはいないことですがテーブルの設定(?)が問題なのか、コンボボックスの値集合プロパティが少し特殊なのが問題なのか、上手く機能しなかったのでこのような複雑なやり方になってしまいました。 redfox63さんの内部結合の式を参考に、取引先コードが出た段階で、 Set adoRs = adoCON.Execute("select DISTINCT T_個人データ.氏名,T_個人データ.個人コード,T_個人データ.ふりがな from T_業務マスタ INNER JOIN T_個人データ ON T_業務マスタ.個人コード = T_個人データ.個人コード where ((取引先コード = " & toricode & ") and (業務名 = '" & gyomu & "')) order by T_個人データ.ふりがな") のような感じで一気に氏名とコードを抽出し、あとは変数などの微調整をしたら何とか機能するようになりました。 分かりずらい説明にも親切に付き合っていただき、本当にありがとうございました。