Page 326 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 通常モードに戻る ┃ INDEX ┃ ≪前へ │ 次へ≫ ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ ▼順位の付け方 miya 03/6/28(土) 12:24 ┣Re:順位の付け方 孫悟空 03/6/30(月) 13:28 ┃ ┣Re:順位の付け方 miya 03/6/30(月) 13:46 ┃ ┃ ┗Re:順位の付け方 孫悟空 03/6/30(月) 14:30 ┃ ┃ ┗Re:順位の付け方 miya 03/6/30(月) 16:32 ┃ ┃ ┗Re:順位の付け方 孫悟空 03/6/30(月) 17:19 ┃ ┗Re:順位の付け方 miya 03/6/30(月) 14:17 ┃ ┗Re:順位の付け方 孫悟空 03/6/30(月) 14:32 ┃ ┗Re:順位の付け方 miya 03/6/30(月) 18:13 ┃ ┗Re:順位の付け方 孫悟空 03/6/30(月) 20:44 ┃ ┗Re:順位の付け方 miya 03/7/1(火) 10:42 ┗Re:順位の付け方 miya 03/7/1(火) 15:54 ┗Re:順位の付け方 孫悟空 03/7/5(土) 10:23 ┣Re:順位の付け方 miya 03/7/5(土) 11:32 ┗動きました。 miya 03/7/5(土) 12:03 ┗Re:動きました。 孫悟空 03/7/5(土) 18:06 ┗Re:動きました。 miya 03/7/6(日) 9:58 ┗Re:動きました。 孫悟空 03/7/6(日) 18:15 ┗Re:動きました。 miya 03/7/7(月) 12:08 ┗Re:動きました。 孫悟空 03/7/7(月) 21:50 ┗ありがとうございました。 miya 03/7/8(火) 11:15 ─────────────────────────────────────── ■題名 : 順位の付け方 ■名前 : miya <taisei-office@play.pos.to> ■日付 : 03/6/28(土) 12:24 -------------------------------------------------------------------------
Access2000使用してます。 各個人の1.〜5.の合計を求め、さらに 県別で5名の内、上位4名の合計を求め (4名の時は4名の合計)県別で1位、2位といったように順位をつけていのですが。 ・並べ替えの条件としては、個人の成績の良い順に 5人中4人の合計が県別の合計に ・5人の中で複数の個人合計が同じ場合は、生年月日順(昇順)で4人の合計 ・県別の合計が同じ場合は、県別で個人成績4番目の人の成績の良い方を上位に さらに県別で個人成績4番目の人の成績も同じ場合は、3番目、2番目、1番目の 良い方を上位に ・それでも同じ場合は、4番目の人の生年月日が昇順の方が上位に のような結果を出せる方法はありますか? 説明が下手な上、複雑な質問ですみませんが回答お願い致します。 結果的には、下記のような形のレポートを作成したいのですが どのように構成していったらよい回答願います。 ・県別で5人いたら、5人の氏名も表示 ↓ 1位 北海道 合計 659 ↑ (5人いても上位4人のみの合計、でも5人の氏名と個人の成績は表示) 氏名 県名 生年月日 1. 2. 3. 4. 5. 合計 Bさん 北海道 57/11/23 15 24 50 10 31 130 Dさん 北海道 62/09/05 22 15 30 61 25 153 Aさん 北海道 66/01/24 45 12 66 32 23 178 Cさん 北海道 50/05/01 47 38 56 44 13 198 Eさん 北海道 54/04/14 43 30 31 26 68 198 2位 神奈川 合計 659 氏名 県名 生年月日 1. 2. 3. 4. 5. 合計 Gさん 神奈川 58/02/01 25 36 22 18 29 130 Fさん 神奈川 68/12/12 14 39 41 16 43 153 Hさん 神奈川 53/08/16 58 40 30 18 52 198 Iさん 神奈川 59/10/23 68 33 31 21 45 198 元になるテーブルは下のようにしました。 顧客NO 氏名 県名 生年月日 1. 2. 3. 4. 5. (オートナンバー) (テキスト) (テキスト) (日付) (数値)(数値)(数値)(数値)(数値) 1 Aさん 北海道 66/01/24 45 12 66 32 23 2 Bさん 北海道 57/11/23 15 24 50 10 31 3 Cさん 北海道 50/05/01 47 38 56 44 13 4 Dさん 北海道 62/09/05 22 15 30 61 25 5 Eさん 北海道 54/04/14 43 30 31 26 68 6 Fさん 神奈川 68/12/12 33 27 69 53 34 7 Gさん 神奈川 58/02/01 14 39 41 16 49 8 Hさん 神奈川 53/08/16 74 70 30 18 52 9 Iさん 神奈川 59/10/23 68 93 19 21 65 クエリーで個人の合計は出せるようにまで出来ました。 顧客NO 氏名 県名 生年月日 1. 2. 3. 4. 5. 合計 1 Aさん 北海道 66/01/24 45 12 66 32 23 178 2 Bさん 北海道 57/11/23 15 24 50 10 31 130 3 Cさん 北海道 50/05/01 47 38 56 44 13 198 4 Dさん 北海道 62/09/05 22 15 30 61 25 153 5 Eさん 北海道 54/04/14 43 30 31 26 68 198 6 Fさん 神奈川 68/12/12 33 27 69 53 34 216 7 Gさん 神奈川 58/02/01 14 39 41 16 49 159 8 Hさん 神奈川 53/08/16 74 70 30 18 52 244 9 Iさん 神奈川 59/10/23 68 93 19 21 65 266 |
▼miya さんこんにちは: 一発で県順位と個人の成績を抜き出すクエリーを作るのは難しそうです。 下記のようなコードを考えました。 ご参考に 'DAO3.6参照 Option Explicit Sub 順位決定() Dim SQLStr As String Dim Ms_Db As DAO.Database Dim Ms_Rec, Ms_Rec2, Ms_Rec3 As DAO.Recordset Dim 県内順位, 表示順位, 県順位, 人数, 県数 As Long Dim tbl As Variant Set Ms_Db = CurrentDb For Each tbl In Ms_Db.TableDefs Select Case tbl.Name Case "顧客順位テーブル" Ms_Db.Execute "drop table 顧客順位テーブル" Case "県順位テーブル" Ms_Db.Execute "drop table 県順位テーブル" End Select Next tbl SQLStr = "" SQLStr = SQLStr & "SELECT 顧客NO,氏名,県名,生年月日," & Chr(13) & Chr(10) SQLStr = SQLStr & "[1],[2],[3],[4],[5]," & Chr(13) & Chr(10) SQLStr = SQLStr & "[1]+[2]+[3]+[4]+[5] AS 合計," & Chr(13) & Chr(10) SQLStr = SQLStr & "0 AS 県内順位,0 AS 表示順位," & Chr(13) & Chr(10) SQLStr = SQLStr & "'表示無' AS 表示有無" & Chr(13) & Chr(10) SQLStr = SQLStr & "INTO 顧客順位テーブル" & Chr(13) & Chr(10) SQLStr = SQLStr & "FROM 顧客テーブル;" Ms_Db.Execute SQLStr SQLStr = "" SQLStr = SQLStr & "select distinct 県名" & Chr(13) & Chr(10) SQLStr = SQLStr & "from 顧客順位テーブル" & Chr(13) & Chr(10) Set Ms_Rec = Ms_Db.OpenRecordset(SQLStr) Do While Not Ms_Rec.EOF '県内順位の更新 県内順位 = 1 SQLStr = "" SQLStr = SQLStr & "SELECT *" & Chr(13) & Chr(10) SQLStr = SQLStr & "from 顧客順位テーブル" & Chr(13) & Chr(10) SQLStr = SQLStr & "where 県名='" & Ms_Rec("県名").Value & "'" & Chr(13) & Chr(10) SQLStr = SQLStr & "order by 合計 desc,生年月日 asc;" Set Ms_Rec2 = Ms_Db.OpenRecordset(SQLStr) Do While Not Ms_Rec2.EOF SQLStr = "" SQLStr = SQLStr & "update 顧客順位テーブル" & Chr(13) & Chr(10) SQLStr = SQLStr & "set 県内順位=" & 県内順位 & Chr(13) & Chr(10) SQLStr = SQLStr & "where" & CHR(13) & CHR(10) SQLStr = SQLStr & "顧客NO=" & Ms_Rec2("顧客NO").Value Ms_Db.Execute SQLStr 県内順位 = 県内順位 + 1 Ms_Rec2.MoveNext Loop '表示順位の更新 SQLStr = "" SQLStr = SQLStr & "SELECT DISTINCT 合計" & Chr(13) & Chr(10) SQLStr = SQLStr & "from " & Chr(13) & Chr(10) SQLStr = SQLStr & "顧客順位テーブル" & Chr(13) & Chr(10) SQLStr = SQLStr & "where" & Chr(13) & Chr(10) SQLStr = SQLStr & "県名='" & Ms_Rec("県名").Value & "' " SQLStr = SQLStr & "order by 合計 desc" Set Ms_Rec2 = Ms_Db.OpenRecordset(SQLStr) 表示順位 = 1 Do While Not Ms_Rec2.EOF SQLStr = "" SQLStr = SQLStr & "select count(*) as 人数" & Chr(13) & Chr(10) SQLStr = SQLStr & "from 顧客順位テーブル" & Chr(13) & Chr(10) SQLStr = SQLStr & "where" & CHR(13) & CHR(10) SQLStr = SQLStr & "合計=" & Ms_Rec2("合計").Value & " " SQLStr = SQLStr & "and 県名='" & Ms_Rec("県名").Value & "'" Set Ms_Rec3 = Ms_Db.OpenRecordset(SQLStr) 人数 = Ms_Rec3("人数").Value SQLStr = "" SQLStr = SQLStr & "update 顧客順位テーブル" & Chr(13) & Chr(10) SQLStr = SQLStr & "set 表示順位=" & 表示順位 & Chr(13) & Chr(10) SQLStr = SQLStr & "where" & CHR(13) & CHR(10) SQLStr = SQLStr & "合計=" & Ms_Rec2("合計").Value & " " SQLStr = SQLStr & "and 県名='" & Ms_Rec("県名").Value & "'" Ms_Db.Execute SQLStr 表示順位 = 表示順位 + 人数 Ms_Rec2.MoveNext Loop '表示有無の更新 SQLStr = "" SQLStr = SQLStr & "SELECT" & Chr(13) & Chr(10) SQLStr = SQLStr & "表示順位" & Chr(13) & Chr(10) SQLStr = SQLStr & "from 顧客順位テーブル" & Chr(13) & Chr(10) SQLStr = SQLStr & "where" & Chr(13) & Chr(10) SQLStr = SQLStr & "県内順位=5" & Chr(13) & Chr(10) SQLStr = SQLStr & "and 県名='" & Ms_Rec("県名").Value & "'" Set Ms_Rec2 = Ms_Db.OpenRecordset(SQLStr) SQLStr = "" SQLStr = SQLStr & "update" & Chr(13) & Chr(10) SQLStr = SQLStr & "顧客順位テーブル" & Chr(13) & Chr(10) SQLStr = SQLStr & "set 表示有無='表示'" & Chr(13) & Chr(10) SQLStr = SQLStr & "where" & Chr(13) & Chr(10) SQLStr = SQLStr & "県名='" & Ms_Rec("県名").Value & "' " SQLStr = SQLStr & "and 表示順位<=" & Ms_Rec2("表示順位").Value Ms_Db.Execute SQLStr Ms_Rec.MoveNext Loop '次に県順位の判定に必要な情報を組み入れた '県順位テーブルを作成します。 SQLStr = "" SQLStr = SQLStr & "SELECT 県名," & Chr(13) & Chr(10) SQLStr = SQLStr & "SUM([1]+[2]+[3]+[4]+[5]) AS 県合計点," SQLStr = SQLStr & "SUM(IIF(県内順位=4,合計,0)) AS 四番目合計," SQLStr = SQLStr & "format(SUM(IIF(県内順位=4,生年月日,0)),'yy/mm/dd')" SQLStr = SQLStr & " AS 四番目誕生日," & Chr(13) & Chr(10) SQLStr = SQLStr & "0 AS 県順位" & Chr(13) & Chr(10) SQLStr = SQLStr & "INTO 県順位テーブル" & Chr(13) & Chr(10) SQLStr = SQLStr & "FROM 顧客順位テーブル" & Chr(13) & Chr(10) SQLStr = SQLStr & "WHERE 県内順位<=4" & Chr(13) & Chr(10) SQLStr = SQLStr & "GROUP BY 県名;" Ms_Db.Execute SQLStr SQLStr = "" SQLStr = SQLStr & "select distinct" & Chr(13) & Chr(10) SQLStr = SQLStr & "県合計点," & Chr(13) & Chr(10) SQLStr = SQLStr & "四番目合計," & Chr(13) & Chr(10) SQLStr = SQLStr & "四番目誕生日" & Chr(13) & Chr(10) SQLStr = SQLStr & "from 県順位テーブル" & Chr(13) & Chr(10) SQLStr = SQLStr & "order by" & Chr(13) & Chr(10) SQLStr = SQLStr & "県合計点 DESC," & Chr(13) & Chr(10) SQLStr = SQLStr & "四番目合計 DESC," & Chr(13) & Chr(10) SQLStr = SQLStr & "四番目誕生日" Set Ms_Rec = Ms_Db.OpenRecordset(SQLStr) 県順位 = 1 Do While Not Ms_Rec.EOF SQLStr = "" SQLStr = SQLStr & "select" & Chr(13) & Chr(10) SQLStr = SQLStr & "count(*) as 県数" & Chr(13) & Chr(10) SQLStr = SQLStr & "from 県順位テーブル" & Chr(13) & Chr(10) SQLStr = SQLStr & "where" & Chr(13) & Chr(10) SQLStr = SQLStr & "四番目誕生日=" SQLStr = SQLStr & "#" & Ms_Rec("四番目誕生日").Value & "# " SQLStr = SQLStr & "and 四番目合計=" SQLStr = SQLStr & Ms_Rec("四番目合計").Value Set Ms_Rec2 = Ms_Db.OpenRecordset(SQLStr) 県数 = Ms_Rec2("県数").Value SQLStr = "" SQLStr = SQLStr & "update" & Chr(13) & Chr(10) SQLStr = SQLStr & "県順位テーブル" & Chr(13) & Chr(10) SQLStr = SQLStr & "set 県順位=" & 県順位 & Chr(13) & Chr(10) SQLStr = SQLStr & "where" & Chr(13) & Chr(10) SQLStr = SQLStr & "県合計点=" & Ms_Rec("県合計点").Value SQLStr = SQLStr & " and 四番目誕生日=" SQLStr = SQLStr & "#" & Ms_Rec("四番目誕生日").Value & "# " SQLStr = SQLStr & "and 四番目合計=" & Ms_Rec("四番目合計").Value Ms_Db.Execute SQLStr 県順位 = 県順位 + 県数 Ms_Rec.MoveNext Loop Ms_Rec.Close Ms_Rec2.Close Ms_Rec3.Close Ms_Db.Close End Sub |
▼孫悟空 さん: 回答ありがとうございます。 あまりにも無茶苦茶な質問で申し訳ありません。 誠に申し訳ないのですが 下記のコードを どこに書き込めば宜しいのでしょうか? ↓ 下記のようなコードを考えました。 >ご参考に > >'DAO3.6参照 >Option Explicit >Sub 順位決定() >Dim SQLStr As String >Dim Ms_Db As DAO.Database >Dim Ms_Rec, Ms_Rec2, Ms_Rec3 As DAO.Recordset >Dim 県内順位, 表示順位, 県順位, 人数, 県数 As Long >Dim tbl As Variant > >Set Ms_Db = CurrentDb > >For Each tbl In Ms_Db.TableDefs > Select Case tbl.Name > Case "顧客順位テーブル" > Ms_Db.Execute "drop table 顧客順位テーブル" > Case "県順位テーブル" > Ms_Db.Execute "drop table 県順位テーブル" > End Select >Next tbl > >SQLStr = "" >SQLStr = SQLStr & "SELECT 顧客NO,氏名,県名,生年月日," & Chr(13) & Chr(10) >SQLStr = SQLStr & "[1],[2],[3],[4],[5]," & Chr(13) & Chr(10) >SQLStr = SQLStr & "[1]+[2]+[3]+[4]+[5] AS 合計," & Chr(13) & Chr(10) >SQLStr = SQLStr & "0 AS 県内順位,0 AS 表示順位," & Chr(13) & Chr(10) >SQLStr = SQLStr & "'表示無' AS 表示有無" & Chr(13) & Chr(10) >SQLStr = SQLStr & "INTO 顧客順位テーブル" & Chr(13) & Chr(10) >SQLStr = SQLStr & "FROM 顧客テーブル;" >Ms_Db.Execute SQLStr > >SQLStr = "" >SQLStr = SQLStr & "select distinct 県名" & Chr(13) & Chr(10) >SQLStr = SQLStr & "from 顧客順位テーブル" & Chr(13) & Chr(10) >Set Ms_Rec = Ms_Db.OpenRecordset(SQLStr) > >Do While Not Ms_Rec.EOF > '県内順位の更新 > 県内順位 = 1 > SQLStr = "" > SQLStr = SQLStr & "SELECT *" & Chr(13) & Chr(10) > SQLStr = SQLStr & "from 顧客順位テーブル" & Chr(13) & Chr(10) > SQLStr = SQLStr & "where 県名='" & Ms_Rec("県名").Value & "'" & Chr(13) & Chr(10) > SQLStr = SQLStr & "order by 合計 desc,生年月日 asc;" > Set Ms_Rec2 = Ms_Db.OpenRecordset(SQLStr) > > Do While Not Ms_Rec2.EOF > SQLStr = "" > SQLStr = SQLStr & "update 顧客順位テーブル" & Chr(13) & Chr(10) > SQLStr = SQLStr & "set 県内順位=" & 県内順位 & Chr(13) & Chr(10) > SQLStr = SQLStr & "where" & CHR(13) & CHR(10) > SQLStr = SQLStr & "顧客NO=" & Ms_Rec2("顧客NO").Value > Ms_Db.Execute SQLStr > 県内順位 = 県内順位 + 1 > Ms_Rec2.MoveNext > Loop > > '表示順位の更新 > SQLStr = "" > SQLStr = SQLStr & "SELECT DISTINCT 合計" & Chr(13) & Chr(10) > SQLStr = SQLStr & "from " & Chr(13) & Chr(10) > SQLStr = SQLStr & "顧客順位テーブル" & Chr(13) & Chr(10) > SQLStr = SQLStr & "where" & Chr(13) & Chr(10) > SQLStr = SQLStr & "県名='" & Ms_Rec("県名").Value & "' " > SQLStr = SQLStr & "order by 合計 desc" > Set Ms_Rec2 = Ms_Db.OpenRecordset(SQLStr) > > 表示順位 = 1 > Do While Not Ms_Rec2.EOF > SQLStr = "" > SQLStr = SQLStr & "select count(*) as 人数" & Chr(13) & Chr(10) > SQLStr = SQLStr & "from 顧客順位テーブル" & Chr(13) & Chr(10) > SQLStr = SQLStr & "where" & CHR(13) & CHR(10) > SQLStr = SQLStr & "合計=" & Ms_Rec2("合計").Value & " " > SQLStr = SQLStr & "and 県名='" & Ms_Rec("県名").Value & "'" > Set Ms_Rec3 = Ms_Db.OpenRecordset(SQLStr) > 人数 = Ms_Rec3("人数").Value > > SQLStr = "" > SQLStr = SQLStr & "update 顧客順位テーブル" & Chr(13) & Chr(10) > SQLStr = SQLStr & "set 表示順位=" & 表示順位 & Chr(13) & Chr(10) > SQLStr = SQLStr & "where" & CHR(13) & CHR(10) > SQLStr = SQLStr & "合計=" & Ms_Rec2("合計").Value & " " > SQLStr = SQLStr & "and 県名='" & Ms_Rec("県名").Value & "'" > Ms_Db.Execute SQLStr > > 表示順位 = 表示順位 + 人数 > Ms_Rec2.MoveNext > Loop > > '表示有無の更新 > SQLStr = "" > SQLStr = SQLStr & "SELECT" & Chr(13) & Chr(10) > SQLStr = SQLStr & "表示順位" & Chr(13) & Chr(10) > SQLStr = SQLStr & "from 顧客順位テーブル" & Chr(13) & Chr(10) > SQLStr = SQLStr & "where" & Chr(13) & Chr(10) > SQLStr = SQLStr & "県内順位=5" & Chr(13) & Chr(10) > SQLStr = SQLStr & "and 県名='" & Ms_Rec("県名").Value & "'" > Set Ms_Rec2 = Ms_Db.OpenRecordset(SQLStr) > > SQLStr = "" > SQLStr = SQLStr & "update" & Chr(13) & Chr(10) > SQLStr = SQLStr & "顧客順位テーブル" & Chr(13) & Chr(10) > SQLStr = SQLStr & "set 表示有無='表示'" & Chr(13) & Chr(10) > SQLStr = SQLStr & "where" & Chr(13) & Chr(10) > SQLStr = SQLStr & "県名='" & Ms_Rec("県名").Value & "' " > SQLStr = SQLStr & "and 表示順位<=" & Ms_Rec2("表示順位").Value > Ms_Db.Execute SQLStr > > Ms_Rec.MoveNext >Loop > >'次に県順位の判定に必要な情報を組み入れた >'県順位テーブルを作成します。 >SQLStr = "" >SQLStr = SQLStr & "SELECT 県名," & Chr(13) & Chr(10) >SQLStr = SQLStr & "SUM([1]+[2]+[3]+[4]+[5]) AS 県合計点," >SQLStr = SQLStr & "SUM(IIF(県内順位=4,合計,0)) AS 四番目合計," >SQLStr = SQLStr & "format(SUM(IIF(県内順位=4,生年月日,0)),'yy/mm/dd')" >SQLStr = SQLStr & " AS 四番目誕生日," & Chr(13) & Chr(10) >SQLStr = SQLStr & "0 AS 県順位" & Chr(13) & Chr(10) >SQLStr = SQLStr & "INTO 県順位テーブル" & Chr(13) & Chr(10) >SQLStr = SQLStr & "FROM 顧客順位テーブル" & Chr(13) & Chr(10) >SQLStr = SQLStr & "WHERE 県内順位<=4" & Chr(13) & Chr(10) >SQLStr = SQLStr & "GROUP BY 県名;" >Ms_Db.Execute SQLStr > >SQLStr = "" >SQLStr = SQLStr & "select distinct" & Chr(13) & Chr(10) >SQLStr = SQLStr & "県合計点," & Chr(13) & Chr(10) >SQLStr = SQLStr & "四番目合計," & Chr(13) & Chr(10) >SQLStr = SQLStr & "四番目誕生日" & Chr(13) & Chr(10) >SQLStr = SQLStr & "from 県順位テーブル" & Chr(13) & Chr(10) >SQLStr = SQLStr & "order by" & Chr(13) & Chr(10) >SQLStr = SQLStr & "県合計点 DESC," & Chr(13) & Chr(10) >SQLStr = SQLStr & "四番目合計 DESC," & Chr(13) & Chr(10) >SQLStr = SQLStr & "四番目誕生日" >Set Ms_Rec = Ms_Db.OpenRecordset(SQLStr) > >県順位 = 1 >Do While Not Ms_Rec.EOF > > SQLStr = "" > SQLStr = SQLStr & "select" & Chr(13) & Chr(10) > SQLStr = SQLStr & "count(*) as 県数" & Chr(13) & Chr(10) > SQLStr = SQLStr & "from 県順位テーブル" & Chr(13) & Chr(10) > SQLStr = SQLStr & "where" & Chr(13) & Chr(10) > SQLStr = SQLStr & "四番目誕生日=" > SQLStr = SQLStr & "#" & Ms_Rec("四番目誕生日").Value & "# " > SQLStr = SQLStr & "and 四番目合計=" > SQLStr = SQLStr & Ms_Rec("四番目合計").Value > Set Ms_Rec2 = Ms_Db.OpenRecordset(SQLStr) > > 県数 = Ms_Rec2("県数").Value > > SQLStr = "" > SQLStr = SQLStr & "update" & Chr(13) & Chr(10) > SQLStr = SQLStr & "県順位テーブル" & Chr(13) & Chr(10) > SQLStr = SQLStr & "set 県順位=" & 県順位 & Chr(13) & Chr(10) > SQLStr = SQLStr & "where" & Chr(13) & Chr(10) > SQLStr = SQLStr & "県合計点=" & Ms_Rec("県合計点").Value > SQLStr = SQLStr & " and 四番目誕生日=" > SQLStr = SQLStr & "#" & Ms_Rec("四番目誕生日").Value & "# " > SQLStr = SQLStr & "and 四番目合計=" & Ms_Rec("四番目合計").Value > > Ms_Db.Execute SQLStr > 県順位 = 県順位 + 県数 > Ms_Rec.MoveNext >Loop >Ms_Rec.Close >Ms_Rec2.Close >Ms_Rec3.Close >Ms_Db.Close > >End Sub |
▼miya さんへ アクセス2000でしたね。 対象テーブル(作成したモジュールでは仮に"顧客テーブル"としてあるので実際のテーブル名に変更してください。)を持つmdbファイルで、以下のようにします。 ・オブジェクトは、モジュールを選択してください。 ・メニューの挿入,標準モジュールで新しいモジュールを作成し、 そのモジュールを開き、今回作成したコードを貼り付けてください。 ・更に、ツール、参照設定でMicrosoft DAO3.6にチェックをいれて、 ・F5を押して作成したモジュールを実行してみてください。 テーブル名称と、フィールド定義がうまくあっていれば、動くはずですが。。 では、頑張ってみてください。 |
▼孫悟空 さん: 誠にたびたび、申し訳ありません。 >・更に、ツール、参照設定でMicrosoft DAO3.6にチェックをいれて、 Microsoft DAO3.6がありませんでした。 申し訳ありません。 >・F5を押して作成したモジュールを実行してみてください。 Microsoft DAO3.6がない為か実行をしてみましたが エラーが出てしまいました。 他の方の書込み・回答を見ていても DAOと何?では、答えが違ってくるから それも質問と共に書いて下さい。のような書込みを 拝見した事があるのですが DAOとかなのかをどのように調べたらよいのか解りません。 せっかく答えを下さったのに、本当に申し訳なく思います。 もしも、まだ返答して頂けるのなら、ご返答願います。 無理にとは申しませんので宜しくお願い申し上げます。 |
miyaさんへ dao3.5はありますか? もしあればそれで、試してみてください。 |
▼孫悟空 さん:たびたび、すみません。 顧客順位テーブルと県順位テーブルは 下記のコードによって新規に作成されるのですか? もしくは下記コードによって仮のテーブルのように 自動で作成されるのですか? 本当に申し訳ないです。 このような複雑な質問に答えを頂いたのにそれの 使い方も試す事も出来ないなんて情けないです。 本当に申し訳ありません。 >一発で県順位と個人の成績を抜き出すクエリーを作るのは難しそうです。 >下記のようなコードを考えました。 >ご参考に > >'DAO3.6参照 >Option Explicit >Sub 順位決定() >Dim SQLStr As String >Dim Ms_Db As DAO.Database >Dim Ms_Rec, Ms_Rec2, Ms_Rec3 As DAO.Recordset >Dim 県内順位, 表示順位, 県順位, 人数, 県数 As Long >Dim tbl As Variant > >Set Ms_Db = CurrentDb > >For Each tbl In Ms_Db.TableDefs > Select Case tbl.Name > Case "顧客順位テーブル" > Ms_Db.Execute "drop table 顧客順位テーブル" > Case "県順位テーブル" > Ms_Db.Execute "drop table 県順位テーブル" > End Select >Next tbl > >SQLStr = "" >SQLStr = SQLStr & "SELECT 顧客NO,氏名,県名,生年月日," & Chr(13) & Chr(10) >SQLStr = SQLStr & "[1],[2],[3],[4],[5]," & Chr(13) & Chr(10) >SQLStr = SQLStr & "[1]+[2]+[3]+[4]+[5] AS 合計," & Chr(13) & Chr(10) >SQLStr = SQLStr & "0 AS 県内順位,0 AS 表示順位," & Chr(13) & Chr(10) >SQLStr = SQLStr & "'表示無' AS 表示有無" & Chr(13) & Chr(10) >SQLStr = SQLStr & "INTO 顧客順位テーブル" & Chr(13) & Chr(10) >SQLStr = SQLStr & "FROM 顧客テーブル;" >Ms_Db.Execute SQLStr > >SQLStr = "" >SQLStr = SQLStr & "select distinct 県名" & Chr(13) & Chr(10) >SQLStr = SQLStr & "from 顧客順位テーブル" & Chr(13) & Chr(10) >Set Ms_Rec = Ms_Db.OpenRecordset(SQLStr) > >Do While Not Ms_Rec.EOF > '県内順位の更新 > 県内順位 = 1 > SQLStr = "" > SQLStr = SQLStr & "SELECT *" & Chr(13) & Chr(10) > SQLStr = SQLStr & "from 顧客順位テーブル" & Chr(13) & Chr(10) > SQLStr = SQLStr & "where 県名='" & Ms_Rec("県名").Value & "'" & Chr(13) & Chr(10) > SQLStr = SQLStr & "order by 合計 desc,生年月日 asc;" > Set Ms_Rec2 = Ms_Db.OpenRecordset(SQLStr) > > Do While Not Ms_Rec2.EOF > SQLStr = "" > SQLStr = SQLStr & "update 顧客順位テーブル" & Chr(13) & Chr(10) > SQLStr = SQLStr & "set 県内順位=" & 県内順位 & Chr(13) & Chr(10) > SQLStr = SQLStr & "where" & CHR(13) & CHR(10) > SQLStr = SQLStr & "顧客NO=" & Ms_Rec2("顧客NO").Value > Ms_Db.Execute SQLStr > 県内順位 = 県内順位 + 1 > Ms_Rec2.MoveNext > Loop > > '表示順位の更新 > SQLStr = "" > SQLStr = SQLStr & "SELECT DISTINCT 合計" & Chr(13) & Chr(10) > SQLStr = SQLStr & "from " & Chr(13) & Chr(10) > SQLStr = SQLStr & "顧客順位テーブル" & Chr(13) & Chr(10) > SQLStr = SQLStr & "where" & Chr(13) & Chr(10) > SQLStr = SQLStr & "県名='" & Ms_Rec("県名").Value & "' " > SQLStr = SQLStr & "order by 合計 desc" > Set Ms_Rec2 = Ms_Db.OpenRecordset(SQLStr) > > 表示順位 = 1 > Do While Not Ms_Rec2.EOF > SQLStr = "" > SQLStr = SQLStr & "select count(*) as 人数" & Chr(13) & Chr(10) > SQLStr = SQLStr & "from 顧客順位テーブル" & Chr(13) & Chr(10) > SQLStr = SQLStr & "where" & CHR(13) & CHR(10) > SQLStr = SQLStr & "合計=" & Ms_Rec2("合計").Value & " " > SQLStr = SQLStr & "and 県名='" & Ms_Rec("県名").Value & "'" > Set Ms_Rec3 = Ms_Db.OpenRecordset(SQLStr) > 人数 = Ms_Rec3("人数").Value > > SQLStr = "" > SQLStr = SQLStr & "update 顧客順位テーブル" & Chr(13) & Chr(10) > SQLStr = SQLStr & "set 表示順位=" & 表示順位 & Chr(13) & Chr(10) > SQLStr = SQLStr & "where" & CHR(13) & CHR(10) > SQLStr = SQLStr & "合計=" & Ms_Rec2("合計").Value & " " > SQLStr = SQLStr & "and 県名='" & Ms_Rec("県名").Value & "'" > Ms_Db.Execute SQLStr > > 表示順位 = 表示順位 + 人数 > Ms_Rec2.MoveNext > Loop > > '表示有無の更新 > SQLStr = "" > SQLStr = SQLStr & "SELECT" & Chr(13) & Chr(10) > SQLStr = SQLStr & "表示順位" & Chr(13) & Chr(10) > SQLStr = SQLStr & "from 顧客順位テーブル" & Chr(13) & Chr(10) > SQLStr = SQLStr & "where" & Chr(13) & Chr(10) > SQLStr = SQLStr & "県内順位=5" & Chr(13) & Chr(10) > SQLStr = SQLStr & "and 県名='" & Ms_Rec("県名").Value & "'" > Set Ms_Rec2 = Ms_Db.OpenRecordset(SQLStr) > > SQLStr = "" > SQLStr = SQLStr & "update" & Chr(13) & Chr(10) > SQLStr = SQLStr & "顧客順位テーブル" & Chr(13) & Chr(10) > SQLStr = SQLStr & "set 表示有無='表示'" & Chr(13) & Chr(10) > SQLStr = SQLStr & "where" & Chr(13) & Chr(10) > SQLStr = SQLStr & "県名='" & Ms_Rec("県名").Value & "' " > SQLStr = SQLStr & "and 表示順位<=" & Ms_Rec2("表示順位").Value > Ms_Db.Execute SQLStr > > Ms_Rec.MoveNext >Loop > >'次に県順位の判定に必要な情報を組み入れた >'県順位テーブルを作成します。 >SQLStr = "" >SQLStr = SQLStr & "SELECT 県名," & Chr(13) & Chr(10) >SQLStr = SQLStr & "SUM([1]+[2]+[3]+[4]+[5]) AS 県合計点," >SQLStr = SQLStr & "SUM(IIF(県内順位=4,合計,0)) AS 四番目合計," >SQLStr = SQLStr & "format(SUM(IIF(県内順位=4,生年月日,0)),'yy/mm/dd')" >SQLStr = SQLStr & " AS 四番目誕生日," & Chr(13) & Chr(10) >SQLStr = SQLStr & "0 AS 県順位" & Chr(13) & Chr(10) >SQLStr = SQLStr & "INTO 県順位テーブル" & Chr(13) & Chr(10) >SQLStr = SQLStr & "FROM 顧客順位テーブル" & Chr(13) & Chr(10) >SQLStr = SQLStr & "WHERE 県内順位<=4" & Chr(13) & Chr(10) >SQLStr = SQLStr & "GROUP BY 県名;" >Ms_Db.Execute SQLStr > >SQLStr = "" >SQLStr = SQLStr & "select distinct" & Chr(13) & Chr(10) >SQLStr = SQLStr & "県合計点," & Chr(13) & Chr(10) >SQLStr = SQLStr & "四番目合計," & Chr(13) & Chr(10) >SQLStr = SQLStr & "四番目誕生日" & Chr(13) & Chr(10) >SQLStr = SQLStr & "from 県順位テーブル" & Chr(13) & Chr(10) >SQLStr = SQLStr & "order by" & Chr(13) & Chr(10) >SQLStr = SQLStr & "県合計点 DESC," & Chr(13) & Chr(10) >SQLStr = SQLStr & "四番目合計 DESC," & Chr(13) & Chr(10) >SQLStr = SQLStr & "四番目誕生日" >Set Ms_Rec = Ms_Db.OpenRecordset(SQLStr) > >県順位 = 1 >Do While Not Ms_Rec.EOF > > SQLStr = "" > SQLStr = SQLStr & "select" & Chr(13) & Chr(10) > SQLStr = SQLStr & "count(*) as 県数" & Chr(13) & Chr(10) > SQLStr = SQLStr & "from 県順位テーブル" & Chr(13) & Chr(10) > SQLStr = SQLStr & "where" & Chr(13) & Chr(10) > SQLStr = SQLStr & "四番目誕生日=" > SQLStr = SQLStr & "#" & Ms_Rec("四番目誕生日").Value & "# " > SQLStr = SQLStr & "and 四番目合計=" > SQLStr = SQLStr & Ms_Rec("四番目合計").Value > Set Ms_Rec2 = Ms_Db.OpenRecordset(SQLStr) > > 県数 = Ms_Rec2("県数").Value > > SQLStr = "" > SQLStr = SQLStr & "update" & Chr(13) & Chr(10) > SQLStr = SQLStr & "県順位テーブル" & Chr(13) & Chr(10) > SQLStr = SQLStr & "set 県順位=" & 県順位 & Chr(13) & Chr(10) > SQLStr = SQLStr & "where" & Chr(13) & Chr(10) > SQLStr = SQLStr & "県合計点=" & Ms_Rec("県合計点").Value > SQLStr = SQLStr & " and 四番目誕生日=" > SQLStr = SQLStr & "#" & Ms_Rec("四番目誕生日").Value & "# " > SQLStr = SQLStr & "and 四番目合計=" & Ms_Rec("四番目合計").Value > > Ms_Db.Execute SQLStr > 県順位 = 県順位 + 県数 > Ms_Rec.MoveNext >Loop >Ms_Rec.Close >Ms_Rec2.Close >Ms_Rec3.Close >Ms_Db.Close > >End Sub |
▼miya さん: >▼孫悟空 さん:たびたび、すみません。 >顧客順位テーブルと県順位テーブルは >下記のコードによって新規に作成されるのですか? はいそうです。 |
▼孫悟空 さん: 本当に申し訳ないです。 Microsoft DAO3.6 Object Libraryというのがありました。 チェックして実行しましたが 「パラメータが少なすぎます。20を指定してください。」 と出てきましたが 自分の実行方法が間違っているのでしょうか? モジュールは保存したら、どのように呼び出すのですかね? |
▼miya さん: デバックして止まったコードを確かめてください。 多分、以下のいずれかのコードで止まっていると思います。 Set Ms_Rec = Ms_Db.OpenRecordset(SQLStr) Ms_Db.Execute SQLStr エラーは、止まったコードの上のSQLStr内のフィールド名が、実際miyaさんが 準備したテーブルのフィールド名と異なる為に、発生していると思われます。 よくコード内のフィールド名と、実際のテーブルのフィールド名を 比較して、異なる物があれば、コードを修正してください。 本日は久し振りのお休みで、このサイトで遊んでいられましたが また明日からは、地獄の毎日へ逆戻りです。 週末まで、戻ってこられそうにありませんので、どなたか フォローをお願いします。では、がんばってください。 |
▼孫悟空 さん: おはようございます。 久しぶりのお休みでしたのに 自分の質問に何度も ご親切にお答え頂き、本当にありがとうございました。 エラー回避の説明までして頂き、ありがとうございます。 悪戦苦闘しながらもチャレンジしてみます。 どうしても解らない時は、又、質問だけさせてください。 |
顧客順位・県順位テーブルと両方、新規に出来ましたが 県順位テーブルで「県順位」は、評価されないのは 参照している値が比較する事が出来ないからですかね? 県合計は、昇順で並んでいて、四番目誕生日も昇順に並んでいますが 県順位は、1,2,3,4とかではなく、全て"0"しか表示してないのは、何故ですかね? まだ何か、指定が足りないのでしょうか? |
miyaさんへ 県順位は、最後の部分の下記コードで処理しています。 このコードがうまく動いていないようです。 以下の方法で調査してみてください。 1.コードが間違っていましたので、まずはそれを直してみてください。 但し今回の直接の原因では、なさそうですが、、、 2.順位を判定するレコードセットがうまく取得できていない。 3.更新するレコードが取得できていない 4.最後までモジュールが動いたか確認する。 ・・・・・・・・・・・・ Set Ms_Rec = Ms_Db.OpenRecordset(SQLStr) '※2 この3行を追加してみてください。 IF Ms_Rec.RECORDCOUNT=0 THEN MSGBOX "対策2が必要です。" END IF 県順位 = 1 Do While Not Ms_Rec.EOF SQLStr = "" SQLStr = SQLStr & "select" & Chr(13) & Chr(10) SQLStr = SQLStr & "count(*) as 県数" & Chr(13) & Chr(10) SQLStr = SQLStr & "from 県順位テーブル" & Chr(13) & Chr(10) SQLStr = SQLStr & "where" & Chr(13) & Chr(10) SQLStr = SQLStr & "四番目誕生日=" SQLStr = SQLStr & "#" & Ms_Rec("四番目誕生日").Value & "# " SQLStr = SQLStr & "and 四番目合計=" SQLStr = SQLStr & Ms_Rec("四番目合計").Value '※1 この行が抜けてました。 SQLStr = SQLStr & "and 四番目合計=" & Ms_Rec("四番目合計").Value Set Ms_Rec2 = Ms_Db.OpenRecordset(SQLStr) '※2 この3行を追加してみてください。 IF Ms_Rec2.RECORDCOUNT=0 THEN MSGBOX "対策3が必要です。" END IF 県数 = Ms_Rec2("県数").Value SQLStr = "" SQLStr = SQLStr & "update" & Chr(13) & Chr(10) SQLStr = SQLStr & "県順位テーブル" & Chr(13) & Chr(10) SQLStr = SQLStr & "set 県順位=" & 県順位 & Chr(13) & Chr(10) SQLStr = SQLStr & "where" & Chr(13) & Chr(10) SQLStr = SQLStr & "県合計点=" & Ms_Rec("県合計点").Value SQLStr = SQLStr & " and 四番目誕生日=" SQLStr = SQLStr & "#" & Ms_Rec("四番目誕生日").Value & "# " SQLStr = SQLStr & "and 四番目合計=" & Ms_Rec("四番目合計").Value Ms_Db.Execute SQLStr, dbFailOnError 県順位 = 県順位 + 県数 Ms_Rec.MoveNext Loop Ms_Rec.Close Ms_Rec2.Close Ms_Rec3.Close Ms_Db.Close '※4 この1行を追加。 MsgBox "4 終わりまで正常に動きました。" End Sub |
▼孫悟空 さん、ご迷惑をおかけして申し訳ないです。 御親切な回答ありがとうございます。 誠に申し訳ないのですが下記コードをどの部分に追加・訂正してよいのか わからないのですが・・・ なんとなく全てを追っていくと 解るのですが せっかく、直して頂いたのに自分が間違った箇所に 追加・訂正しているようなのですが・・・ お手数ですが宜しければ、ここですよ!と わかるようにして頂けたら、ありがたいです。 >県順位は、最後の部分の下記コードで処理しています。 >このコードがうまく動いていないようです。 >以下の方法で調査してみてください。 > >1.コードが間違っていましたので、まずはそれを直してみてください。 > 但し今回の直接の原因では、なさそうですが、、、 > >2.順位を判定するレコードセットがうまく取得できていない。 >3.更新するレコードが取得できていない >4.最後までモジュールが動いたか確認する。 > >・・・・・・・・・・・・ >Set Ms_Rec = Ms_Db.OpenRecordset(SQLStr) > >'※2 この3行を追加してみてください。 >IF Ms_Rec.RECORDCOUNT=0 THEN > MSGBOX "対策2が必要です。" >END IF > >県順位 = 1 >Do While Not Ms_Rec.EOF > > SQLStr = "" > SQLStr = SQLStr & "select" & Chr(13) & Chr(10) > SQLStr = SQLStr & "count(*) as 県数" & Chr(13) & Chr(10) > SQLStr = SQLStr & "from 県順位テーブル" & Chr(13) & Chr(10) > SQLStr = SQLStr & "where" & Chr(13) & Chr(10) > SQLStr = SQLStr & "四番目誕生日=" > SQLStr = SQLStr & "#" & Ms_Rec("四番目誕生日").Value & "# " > SQLStr = SQLStr & "and 四番目合計=" > SQLStr = SQLStr & Ms_Rec("四番目合計").Value >'※1 この行が抜けてました。 > SQLStr = SQLStr & "and 四番目合計=" & Ms_Rec("四番目合計").Value > > Set Ms_Rec2 = Ms_Db.OpenRecordset(SQLStr) > >'※2 この3行を追加してみてください。 > IF Ms_Rec2.RECORDCOUNT=0 THEN > MSGBOX "対策3が必要です。" > END IF > > 県数 = Ms_Rec2("県数").Value > > SQLStr = "" > SQLStr = SQLStr & "update" & Chr(13) & Chr(10) > SQLStr = SQLStr & "県順位テーブル" & Chr(13) & Chr(10) > SQLStr = SQLStr & "set 県順位=" & 県順位 & Chr(13) & Chr(10) > SQLStr = SQLStr & "where" & Chr(13) & Chr(10) > SQLStr = SQLStr & "県合計点=" & Ms_Rec("県合計点").Value > SQLStr = SQLStr & " and 四番目誕生日=" > SQLStr = SQLStr & "#" & Ms_Rec("四番目誕生日").Value & "# " > SQLStr = SQLStr & "and 四番目合計=" & Ms_Rec("四番目合計").Value > > Ms_Db.Execute SQLStr, dbFailOnError > 県順位 = 県順位 + 県数 > Ms_Rec.MoveNext >Loop >Ms_Rec.Close >Ms_Rec2.Close >Ms_Rec3.Close >Ms_Db.Close >'※4 この1行を追加。 >MsgBox "4 終わりまで正常に動きました。" >End Sub |
▼孫悟空 さん、下記コードの入れ方が間違えて入れてたみたいでした。 すみませんでした。 ちゃんとモジュールは動きました。"4 終わりまで正常に動きました。"と 出ました。 しかし、新規のテーブルは今回なかったです。 |
▼miya さんへ: >しかし、新規のテーブルは今回なかったです。 実行したのは下記モジュールと同じですか? 別モジュールを新たに作って貼り付けて実行してみてください。 そこで以下の点確認ください。 ・新規のテーブル(県順位テーブル,顧客順位テーブル)はできましたか? ・県順位は、更新されましたか? ・4 終わりまで正常に動きました。のメッセージだけがでましたか? ・他にもメッセージがでたなら何のメッセージでしたか? Sub 順位決定() Dim SQLStr As String Dim Ms_Db As DAO.Database Dim Ms_Rec, Ms_Rec2, Ms_Rec3 As DAO.Recordset Dim 県内順位, 表示順位, 県順位, 人数, 県数 As Long Dim tbl As Variant Set Ms_Db = CurrentDb For Each tbl In Ms_Db.TableDefs Select Case tbl.Name Case "顧客順位テーブル" Ms_Db.Execute "drop table 顧客順位テーブル" Case "県順位テーブル" Ms_Db.Execute "drop table 県順位テーブル" End Select Next tbl SQLStr = "" SQLStr = SQLStr & "SELECT 顧客NO,氏名,県名,生年月日," & Chr(13) & Chr(10) SQLStr = SQLStr & "[1],[2],[3],[4],[5]," & Chr(13) & Chr(10) SQLStr = SQLStr & "[1]+[2]+[3]+[4]+[5] AS 合計," & Chr(13) & Chr(10) SQLStr = SQLStr & "0 AS 県内順位,0 AS 表示順位," & Chr(13) & Chr(10) SQLStr = SQLStr & "'表示無' AS 表示有無" & Chr(13) & Chr(10) SQLStr = SQLStr & "INTO 顧客順位テーブル" & Chr(13) & Chr(10) SQLStr = SQLStr & "FROM 顧客テーブル;" Ms_Db.Execute SQLStr SQLStr = "" SQLStr = SQLStr & "select distinct 県名" & Chr(13) & Chr(10) SQLStr = SQLStr & "from 顧客順位テーブル" & Chr(13) & Chr(10) Set Ms_Rec = Ms_Db.OpenRecordset(SQLStr) Do While Not Ms_Rec.EOF '県内順位の更新 県内順位 = 1 SQLStr = "" SQLStr = SQLStr & "SELECT *" & Chr(13) & Chr(10) SQLStr = SQLStr & "from 顧客順位テーブル" & Chr(13) & Chr(10) SQLStr = SQLStr & "where 県名='" & Ms_Rec("県名").Value & "'" & Chr(13) & Chr(10) SQLStr = SQLStr & "order by 合計 desc,生年月日 asc;" Set Ms_Rec2 = Ms_Db.OpenRecordset(SQLStr) Do While Not Ms_Rec2.EOF SQLStr = "" SQLStr = SQLStr & "update 顧客順位テーブル" & Chr(13) & Chr(10) SQLStr = SQLStr & "set 県内順位=" & 県内順位 & Chr(13) & Chr(10) SQLStr = SQLStr & "where" & Chr(13) & Chr(10) SQLStr = SQLStr & "顧客NO=" & Ms_Rec2("顧客NO").Value Ms_Db.Execute SQLStr 県内順位 = 県内順位 + 1 Ms_Rec2.MoveNext Loop '表示順位の更新 SQLStr = "" SQLStr = SQLStr & "SELECT DISTINCT 合計" & Chr(13) & Chr(10) SQLStr = SQLStr & "from " & Chr(13) & Chr(10) SQLStr = SQLStr & "顧客順位テーブル" & Chr(13) & Chr(10) SQLStr = SQLStr & "where" & Chr(13) & Chr(10) SQLStr = SQLStr & "県名='" & Ms_Rec("県名").Value & "' " SQLStr = SQLStr & "order by 合計 desc" Set Ms_Rec2 = Ms_Db.OpenRecordset(SQLStr) 表示順位 = 1 Do While Not Ms_Rec2.EOF SQLStr = "" SQLStr = SQLStr & "select count(*) as 人数" & Chr(13) & Chr(10) SQLStr = SQLStr & "from 顧客順位テーブル" & Chr(13) & Chr(10) SQLStr = SQLStr & "where" & Chr(13) & Chr(10) SQLStr = SQLStr & "合計=" & Ms_Rec2("合計").Value & " " SQLStr = SQLStr & "and 県名='" & Ms_Rec("県名").Value & "'" Set Ms_Rec3 = Ms_Db.OpenRecordset(SQLStr) 人数 = Ms_Rec3("人数").Value SQLStr = "" SQLStr = SQLStr & "update 顧客順位テーブル" & Chr(13) & Chr(10) SQLStr = SQLStr & "set 表示順位=" & 表示順位 & Chr(13) & Chr(10) SQLStr = SQLStr & "where" & Chr(13) & Chr(10) SQLStr = SQLStr & "合計=" & Ms_Rec2("合計").Value & " " SQLStr = SQLStr & "and 県名='" & Ms_Rec("県名").Value & "'" Ms_Db.Execute SQLStr 表示順位 = 表示順位 + 人数 Ms_Rec2.MoveNext Loop '表示有無の更新 SQLStr = "" SQLStr = SQLStr & "SELECT" & Chr(13) & Chr(10) SQLStr = SQLStr & "表示順位" & Chr(13) & Chr(10) SQLStr = SQLStr & "from 顧客順位テーブル" & Chr(13) & Chr(10) SQLStr = SQLStr & "where" & Chr(13) & Chr(10) SQLStr = SQLStr & "県内順位=5" & Chr(13) & Chr(10) SQLStr = SQLStr & "and 県名='" & Ms_Rec("県名").Value & "'" Set Ms_Rec2 = Ms_Db.OpenRecordset(SQLStr) SQLStr = "" SQLStr = SQLStr & "update" & Chr(13) & Chr(10) SQLStr = SQLStr & "顧客順位テーブル" & Chr(13) & Chr(10) SQLStr = SQLStr & "set 表示有無='表示'" & Chr(13) & Chr(10) SQLStr = SQLStr & "where" & Chr(13) & Chr(10) SQLStr = SQLStr & "県名='" & Ms_Rec("県名").Value & "' " SQLStr = SQLStr & "and 表示順位<=" & Ms_Rec2("表示順位").Value Ms_Db.Execute SQLStr Ms_Rec.MoveNext Loop '次に県順位の判定に必要な情報を組み入れた '県順位テーブルを作成します。 SQLStr = "" SQLStr = SQLStr & "SELECT 県名," & Chr(13) & Chr(10) SQLStr = SQLStr & "SUM([1]+[2]+[3]+[4]+[5]) AS 県合計点," SQLStr = SQLStr & "SUM(IIF(県内順位=4,合計,0)) AS 四番目合計," SQLStr = SQLStr & "format(SUM(IIF(県内順位=4,生年月日,0)),'yy/mm/dd')" SQLStr = SQLStr & " AS 四番目誕生日," & Chr(13) & Chr(10) SQLStr = SQLStr & "0 AS 県順位" & Chr(13) & Chr(10) SQLStr = SQLStr & "INTO 県順位テーブル" & Chr(13) & Chr(10) SQLStr = SQLStr & "FROM 顧客順位テーブル" & Chr(13) & Chr(10) SQLStr = SQLStr & "WHERE 県内順位<=4" & Chr(13) & Chr(10) SQLStr = SQLStr & "GROUP BY 県名;" Ms_Db.Execute SQLStr SQLStr = "" SQLStr = SQLStr & "select distinct" & Chr(13) & Chr(10) SQLStr = SQLStr & "県合計点," & Chr(13) & Chr(10) SQLStr = SQLStr & "四番目合計," & Chr(13) & Chr(10) SQLStr = SQLStr & "四番目誕生日" & Chr(13) & Chr(10) SQLStr = SQLStr & "from 県順位テーブル" & Chr(13) & Chr(10) SQLStr = SQLStr & "order by" & Chr(13) & Chr(10) SQLStr = SQLStr & "県合計点 DESC," & Chr(13) & Chr(10) SQLStr = SQLStr & "四番目合計 DESC," & Chr(13) & Chr(10) SQLStr = SQLStr & "四番目誕生日" Set Ms_Rec = Ms_Db.OpenRecordset(SQLStr) '※2 この3行を追加してみてください。 If Ms_Rec.RecordCount = 0 Then MsgBox "対策2が必要です。" End If 県順位 = 1 Do While Not Ms_Rec.EOF SQLStr = "" SQLStr = SQLStr & "select" & Chr(13) & Chr(10) SQLStr = SQLStr & "count(*) as 県数" & Chr(13) & Chr(10) SQLStr = SQLStr & "from 県順位テーブル" & Chr(13) & Chr(10) SQLStr = SQLStr & "where" & Chr(13) & Chr(10) SQLStr = SQLStr & "四番目誕生日=" SQLStr = SQLStr & "#" & Ms_Rec("四番目誕生日").Value & "# " SQLStr = SQLStr & "and 四番目合計=" SQLStr = SQLStr & Ms_Rec("四番目合計").Value '※1 この行が抜けてました。 SQLStr = SQLStr & "and 四番目合計=" & Ms_Rec("四番目合計").Value Set Ms_Rec2 = Ms_Db.OpenRecordset(SQLStr) '※2 この3行を追加してみてください。 If Ms_Rec2.RecordCount = 0 Then MsgBox "対策3が必要です。" End If 県数 = Ms_Rec2("県数").Value SQLStr = "" SQLStr = SQLStr & "update" & Chr(13) & Chr(10) SQLStr = SQLStr & "県順位テーブル" & Chr(13) & Chr(10) SQLStr = SQLStr & "set 県順位=" & 県順位 & Chr(13) & Chr(10) SQLStr = SQLStr & "where" & Chr(13) & Chr(10) SQLStr = SQLStr & "県合計点=" & Ms_Rec("県合計点").Value SQLStr = SQLStr & " and 四番目誕生日=" SQLStr = SQLStr & "#" & Ms_Rec("四番目誕生日").Value & "# " SQLStr = SQLStr & "and 四番目合計=" & Ms_Rec("四番目合計").Value Ms_Db.Execute SQLStr, dbFailOnError 県順位 = 県順位 + 県数 Ms_Rec.MoveNext Loop Ms_Rec.Close Ms_Rec2.Close Ms_Rec3.Close Ms_Db.Close '※4 この1行を追加。 MsgBox "4 終わりまで正常に動きました。" End Sub |
▼孫悟空 さん 何度も何度も本当に申し訳ないです。 新規テーブルが出来なかったのは、自分がデータベースをテーブルの所で 開いていたから出来なかっただけのようでした。 すみません。 >実行したのは下記モジュールと同じですか? >別モジュールを新たに作って貼り付けて実行してみてください。 下記モジュールで実行しました。 >そこで以下の点確認ください。 > >・新規のテーブル(県順位テーブル,顧客順位テーブル)はできましたか? 新規テーブル(県順位テーブル,顧客順位テーブル)出来ました。 >・県順位は、更新されましたか? 県順位テーブルの県順位は、申し訳ないのですが 県別に合計、四番目合計、四番目誕生日は表示されました。 県順位だけは、どうしても全て"0"表示になってしまいました。 >・4 終わりまで正常に動きました。のメッセージだけがでましたか? 「4 終わりまで正常に動きました。」メッセージだけ出ました。 それ以外のメッセージは、何も出ませんでした。 顧客順位テーブルの県内順位は、合計の降順での順位付けに なってますがそれはコードを昇順の指定にすればいいのですかね? |
▼miya さん: >>・県順位は、更新されましたか? >県順位テーブルの県順位は、申し訳ないのですが >県別に合計、四番目合計、四番目誕生日は表示されました。 >県順位だけは、どうしても全て"0"表示になってしまいました。 原因がよくわかりません。多分日付データが原因と思います。 試しに以下のコードを試してください。 Option Explicit Sub 順位決定() Dim SQLStr As String Dim Ms_Db As DAO.Database Dim Ms_Rec, Ms_Rec2, Ms_Rec3 As DAO.Recordset Dim 県内順位, 表示順位, 県順位, 人数, 県数 As Long Dim tbl As Variant Set Ms_Db = CurrentDb For Each tbl In Ms_Db.TableDefs Select Case tbl.Name Case "顧客順位テーブル" Ms_Db.Execute "drop table 顧客順位テーブル" Case "県順位テーブル" Ms_Db.Execute "drop table 県順位テーブル" End Select Next tbl SQLStr = "" SQLStr = SQLStr & "SELECT 顧客NO,氏名,県名,生年月日," & Chr(13) & Chr(10) SQLStr = SQLStr & "[1],[2],[3],[4],[5]," & Chr(13) & Chr(10) SQLStr = SQLStr & "[1]+[2]+[3]+[4]+[5] AS 合計," & Chr(13) & Chr(10) SQLStr = SQLStr & "0 AS 県内順位,0 AS 表示順位," & Chr(13) & Chr(10) SQLStr = SQLStr & "'表示無' AS 表示有無" & Chr(13) & Chr(10) SQLStr = SQLStr & "INTO 顧客順位テーブル" & Chr(13) & Chr(10) SQLStr = SQLStr & "FROM 顧客テーブル;" Ms_Db.Execute SQLStr SQLStr = "" SQLStr = SQLStr & "select distinct 県名" & Chr(13) & Chr(10) SQLStr = SQLStr & "from 顧客順位テーブル" & Chr(13) & Chr(10) Set Ms_Rec = Ms_Db.OpenRecordset(SQLStr) Do While Not Ms_Rec.EOF '県内順位の更新 県内順位 = 1 SQLStr = "" SQLStr = SQLStr & "SELECT *" & Chr(13) & Chr(10) SQLStr = SQLStr & "from 顧客順位テーブル" & Chr(13) & Chr(10) SQLStr = SQLStr & "where 県名='" & Ms_Rec("県名").Value & "'" & Chr(13) & Chr(10) SQLStr = SQLStr & "order by 合計 desc,生年月日 asc;" Set Ms_Rec2 = Ms_Db.OpenRecordset(SQLStr) Do While Not Ms_Rec2.EOF SQLStr = "" SQLStr = SQLStr & "update 顧客順位テーブル" & Chr(13) & Chr(10) SQLStr = SQLStr & "set 県内順位=" & 県内順位 & Chr(13) & Chr(10) SQLStr = SQLStr & "where" & Chr(13) & Chr(10) SQLStr = SQLStr & "顧客NO=" & Ms_Rec2("顧客NO").Value Ms_Db.Execute SQLStr 県内順位 = 県内順位 + 1 Ms_Rec2.MoveNext Loop '表示順位の更新 SQLStr = "" SQLStr = SQLStr & "SELECT DISTINCT 合計" & Chr(13) & Chr(10) SQLStr = SQLStr & "from " & Chr(13) & Chr(10) SQLStr = SQLStr & "顧客順位テーブル" & Chr(13) & Chr(10) SQLStr = SQLStr & "where" & Chr(13) & Chr(10) SQLStr = SQLStr & "県名='" & Ms_Rec("県名").Value & "' " SQLStr = SQLStr & "order by 合計 desc" Set Ms_Rec2 = Ms_Db.OpenRecordset(SQLStr) 表示順位 = 1 Do While Not Ms_Rec2.EOF SQLStr = "" SQLStr = SQLStr & "select count(*) as 人数" & Chr(13) & Chr(10) SQLStr = SQLStr & "from 顧客順位テーブル" & Chr(13) & Chr(10) SQLStr = SQLStr & "where" & Chr(13) & Chr(10) SQLStr = SQLStr & "合計=" & Ms_Rec2("合計").Value & " " SQLStr = SQLStr & "and 県名='" & Ms_Rec("県名").Value & "'" Set Ms_Rec3 = Ms_Db.OpenRecordset(SQLStr) 人数 = Ms_Rec3("人数").Value SQLStr = "" SQLStr = SQLStr & "update 顧客順位テーブル" & Chr(13) & Chr(10) SQLStr = SQLStr & "set 表示順位=" & 表示順位 & Chr(13) & Chr(10) SQLStr = SQLStr & "where" & Chr(13) & Chr(10) SQLStr = SQLStr & "合計=" & Ms_Rec2("合計").Value & " " SQLStr = SQLStr & "and 県名='" & Ms_Rec("県名").Value & "'" Ms_Db.Execute SQLStr 表示順位 = 表示順位 + 人数 Ms_Rec2.MoveNext Loop '表示有無の更新 SQLStr = "" SQLStr = SQLStr & "SELECT" & Chr(13) & Chr(10) SQLStr = SQLStr & "表示順位" & Chr(13) & Chr(10) SQLStr = SQLStr & "from 顧客順位テーブル" & Chr(13) & Chr(10) SQLStr = SQLStr & "where" & Chr(13) & Chr(10) SQLStr = SQLStr & "県内順位=5" & Chr(13) & Chr(10) SQLStr = SQLStr & "and 県名='" & Ms_Rec("県名").Value & "'" Set Ms_Rec2 = Ms_Db.OpenRecordset(SQLStr) SQLStr = "" SQLStr = SQLStr & "update" & Chr(13) & Chr(10) SQLStr = SQLStr & "顧客順位テーブル" & Chr(13) & Chr(10) SQLStr = SQLStr & "set 表示有無='表示'" & Chr(13) & Chr(10) SQLStr = SQLStr & "where" & Chr(13) & Chr(10) SQLStr = SQLStr & "県名='" & Ms_Rec("県名").Value & "' " SQLStr = SQLStr & "and 表示順位<=" & Ms_Rec2("表示順位").Value Ms_Db.Execute SQLStr Ms_Rec.MoveNext Loop '次に県順位の判定に必要な情報を組み入れた '県順位テーブルを作成します。 SQLStr = "" SQLStr = SQLStr & "SELECT 県名," & Chr(13) & Chr(10) SQLStr = SQLStr & "SUM([1]+[2]+[3]+[4]+[5]) AS 県合計点," SQLStr = SQLStr & "SUM(IIF(県内順位=4,合計,0)) AS 四番目合計," SQLStr = SQLStr & "format(SUM(IIF(県内順位=4,生年月日,0)),'YYYY/MM/DD')" SQLStr = SQLStr & " AS 四番目誕生日," & Chr(13) & Chr(10) SQLStr = SQLStr & "0 AS 県順位" & Chr(13) & Chr(10) SQLStr = SQLStr & "INTO 県順位テーブル" & Chr(13) & Chr(10) SQLStr = SQLStr & "FROM 顧客順位テーブル" & Chr(13) & Chr(10) SQLStr = SQLStr & "WHERE 県内順位<=4" & Chr(13) & Chr(10) SQLStr = SQLStr & "GROUP BY 県名;" Ms_Db.Execute SQLStr SQLStr = "" SQLStr = SQLStr & "select distinct" & Chr(13) & Chr(10) SQLStr = SQLStr & "県合計点," & Chr(13) & Chr(10) SQLStr = SQLStr & "四番目合計," & Chr(13) & Chr(10) SQLStr = SQLStr & "四番目誕生日" & Chr(13) & Chr(10) SQLStr = SQLStr & "from 県順位テーブル" & Chr(13) & Chr(10) SQLStr = SQLStr & "order by" & Chr(13) & Chr(10) SQLStr = SQLStr & "県合計点 DESC," & Chr(13) & Chr(10) SQLStr = SQLStr & "四番目合計 DESC," & Chr(13) & Chr(10) SQLStr = SQLStr & "四番目誕生日" Set Ms_Rec = Ms_Db.OpenRecordset(SQLStr) '※2 この3行を追加してみてください。 If Ms_Rec.RecordCount = 0 Then MsgBox "対策2が必要です。" End If 県順位 = 1 Do While Not Ms_Rec.EOF MsgBox 県順位 & "位の更新をします。" SQLStr = "" SQLStr = SQLStr & "select" & Chr(13) & Chr(10) SQLStr = SQLStr & "count(*) as 県数" & Chr(13) & Chr(10) SQLStr = SQLStr & "from 県順位テーブル" & Chr(13) & Chr(10) SQLStr = SQLStr & "where" & Chr(13) & Chr(10) SQLStr = SQLStr & "四番目誕生日=" SQLStr = SQLStr & "'" & Ms_Rec("四番目誕生日").Value & "' " SQLStr = SQLStr & "and 四番目合計=" SQLStr = SQLStr & Ms_Rec("四番目合計").Value '※1 この行が抜けてました。 SQLStr = SQLStr & "and 四番目合計=" & Ms_Rec("四番目合計").Value Set Ms_Rec2 = Ms_Db.OpenRecordset(SQLStr) '※2 この3行を追加してみてください。 If Ms_Rec2.RecordCount = 0 Then MsgBox "対策3が必要です。" End If 県数 = Ms_Rec2("県数").Value SQLStr = "" SQLStr = SQLStr & "update" & Chr(13) & Chr(10) SQLStr = SQLStr & "県順位テーブル" & Chr(13) & Chr(10) SQLStr = SQLStr & "set 県順位=" & 県順位 & Chr(13) & Chr(10) SQLStr = SQLStr & "where" & Chr(13) & Chr(10) SQLStr = SQLStr & "県合計点=" & Ms_Rec("県合計点").Value SQLStr = SQLStr & " and 四番目誕生日=" SQLStr = SQLStr & "'" & Ms_Rec("四番目誕生日").Value & "' " SQLStr = SQLStr & "and 四番目合計=" & Ms_Rec("四番目合計").Value Ms_Db.Execute SQLStr, dbFailOnError 県順位 = 県順位 + 県数 Ms_Rec.MoveNext Loop Ms_Rec.Close Ms_Rec2.Close Ms_Rec3.Close Ms_Db.Close '※4 この1行を追加。 MsgBox "4 終わりまで正常に動きました。" End Sub これでどんなメッセージがでたか教えてください。 >顧客順位テーブルの県内順位は、合計の降順での順位付けに >なってますがそれはコードを昇順の指定にすればいいのですかね? テーブルは、順番は関係無いので、順位で並べたい場合はクエリーで 呼び出しましょう。 |
▼孫悟空 さん、何度もありがとうございます。 >県順位は、更新されましたか? 更新されました。 >原因がよくわかりません。多分日付データが原因と思います。 申し訳ありませんでした。 下記のコードで試しましたら、県順位が表示されました。 >試しに以下のコードを試してください。 >Option Explicit >Sub 順位決定() >Dim SQLStr As String >Dim Ms_Db As DAO.Database >Dim Ms_Rec, Ms_Rec2, Ms_Rec3 As DAO.Recordset >Dim 県内順位, 表示順位, 県順位, 人数, 県数 As Long >Dim tbl As Variant > >Set Ms_Db = CurrentDb > >For Each tbl In Ms_Db.TableDefs > Select Case tbl.Name > Case "顧客順位テーブル" > Ms_Db.Execute "drop table 顧客順位テーブル" > Case "県順位テーブル" > Ms_Db.Execute "drop table 県順位テーブル" > End Select >Next tbl > >SQLStr = "" >SQLStr = SQLStr & "SELECT 顧客NO,氏名,県名,生年月日," & Chr(13) & Chr(10) >SQLStr = SQLStr & "[1],[2],[3],[4],[5]," & Chr(13) & Chr(10) >SQLStr = SQLStr & "[1]+[2]+[3]+[4]+[5] AS 合計," & Chr(13) & Chr(10) >SQLStr = SQLStr & "0 AS 県内順位,0 AS 表示順位," & Chr(13) & Chr(10) >SQLStr = SQLStr & "'表示無' AS 表示有無" & Chr(13) & Chr(10) >SQLStr = SQLStr & "INTO 顧客順位テーブル" & Chr(13) & Chr(10) >SQLStr = SQLStr & "FROM 顧客テーブル;" >Ms_Db.Execute SQLStr > >SQLStr = "" >SQLStr = SQLStr & "select distinct 県名" & Chr(13) & Chr(10) >SQLStr = SQLStr & "from 顧客順位テーブル" & Chr(13) & Chr(10) >Set Ms_Rec = Ms_Db.OpenRecordset(SQLStr) > >Do While Not Ms_Rec.EOF > '県内順位の更新 > 県内順位 = 1 > SQLStr = "" > SQLStr = SQLStr & "SELECT *" & Chr(13) & Chr(10) > SQLStr = SQLStr & "from 顧客順位テーブル" & Chr(13) & Chr(10) > SQLStr = SQLStr & "where 県名='" & Ms_Rec("県名").Value & "'" & Chr(13) & Chr(10) > SQLStr = SQLStr & "order by 合計 desc,生年月日 asc;" > Set Ms_Rec2 = Ms_Db.OpenRecordset(SQLStr) > > Do While Not Ms_Rec2.EOF > SQLStr = "" > SQLStr = SQLStr & "update 顧客順位テーブル" & Chr(13) & Chr(10) > SQLStr = SQLStr & "set 県内順位=" & 県内順位 & Chr(13) & Chr(10) > SQLStr = SQLStr & "where" & Chr(13) & Chr(10) > SQLStr = SQLStr & "顧客NO=" & Ms_Rec2("顧客NO").Value > Ms_Db.Execute SQLStr > 県内順位 = 県内順位 + 1 > Ms_Rec2.MoveNext > Loop > > '表示順位の更新 > SQLStr = "" > SQLStr = SQLStr & "SELECT DISTINCT 合計" & Chr(13) & Chr(10) > SQLStr = SQLStr & "from " & Chr(13) & Chr(10) > SQLStr = SQLStr & "顧客順位テーブル" & Chr(13) & Chr(10) > SQLStr = SQLStr & "where" & Chr(13) & Chr(10) > SQLStr = SQLStr & "県名='" & Ms_Rec("県名").Value & "' " > SQLStr = SQLStr & "order by 合計 desc" > Set Ms_Rec2 = Ms_Db.OpenRecordset(SQLStr) > > 表示順位 = 1 > Do While Not Ms_Rec2.EOF > SQLStr = "" > SQLStr = SQLStr & "select count(*) as 人数" & Chr(13) & Chr(10) > SQLStr = SQLStr & "from 顧客順位テーブル" & Chr(13) & Chr(10) > SQLStr = SQLStr & "where" & Chr(13) & Chr(10) > SQLStr = SQLStr & "合計=" & Ms_Rec2("合計").Value & " " > SQLStr = SQLStr & "and 県名='" & Ms_Rec("県名").Value & "'" > Set Ms_Rec3 = Ms_Db.OpenRecordset(SQLStr) > 人数 = Ms_Rec3("人数").Value > > SQLStr = "" > SQLStr = SQLStr & "update 顧客順位テーブル" & Chr(13) & Chr(10) > SQLStr = SQLStr & "set 表示順位=" & 表示順位 & Chr(13) & Chr(10) > SQLStr = SQLStr & "where" & Chr(13) & Chr(10) > SQLStr = SQLStr & "合計=" & Ms_Rec2("合計").Value & " " > SQLStr = SQLStr & "and 県名='" & Ms_Rec("県名").Value & "'" > Ms_Db.Execute SQLStr > > 表示順位 = 表示順位 + 人数 > Ms_Rec2.MoveNext > Loop > > '表示有無の更新 > SQLStr = "" > SQLStr = SQLStr & "SELECT" & Chr(13) & Chr(10) > SQLStr = SQLStr & "表示順位" & Chr(13) & Chr(10) > SQLStr = SQLStr & "from 顧客順位テーブル" & Chr(13) & Chr(10) > SQLStr = SQLStr & "where" & Chr(13) & Chr(10) > SQLStr = SQLStr & "県内順位=5" & Chr(13) & Chr(10) > SQLStr = SQLStr & "and 県名='" & Ms_Rec("県名").Value & "'" > Set Ms_Rec2 = Ms_Db.OpenRecordset(SQLStr) > > SQLStr = "" > SQLStr = SQLStr & "update" & Chr(13) & Chr(10) > SQLStr = SQLStr & "顧客順位テーブル" & Chr(13) & Chr(10) > SQLStr = SQLStr & "set 表示有無='表示'" & Chr(13) & Chr(10) > SQLStr = SQLStr & "where" & Chr(13) & Chr(10) > SQLStr = SQLStr & "県名='" & Ms_Rec("県名").Value & "' " > SQLStr = SQLStr & "and 表示順位<=" & Ms_Rec2("表示順位").Value > Ms_Db.Execute SQLStr > > Ms_Rec.MoveNext >Loop > >'次に県順位の判定に必要な情報を組み入れた >'県順位テーブルを作成します。 >SQLStr = "" >SQLStr = SQLStr & "SELECT 県名," & Chr(13) & Chr(10) >SQLStr = SQLStr & "SUM([1]+[2]+[3]+[4]+[5]) AS 県合計点," >SQLStr = SQLStr & "SUM(IIF(県内順位=4,合計,0)) AS 四番目合計," >SQLStr = SQLStr & "format(SUM(IIF(県内順位=4,生年月日,0)),'YYYY/MM/DD')" >SQLStr = SQLStr & " AS 四番目誕生日," & Chr(13) & Chr(10) >SQLStr = SQLStr & "0 AS 県順位" & Chr(13) & Chr(10) >SQLStr = SQLStr & "INTO 県順位テーブル" & Chr(13) & Chr(10) >SQLStr = SQLStr & "FROM 顧客順位テーブル" & Chr(13) & Chr(10) >SQLStr = SQLStr & "WHERE 県内順位<=4" & Chr(13) & Chr(10) >SQLStr = SQLStr & "GROUP BY 県名;" > >Ms_Db.Execute SQLStr > >SQLStr = "" >SQLStr = SQLStr & "select distinct" & Chr(13) & Chr(10) >SQLStr = SQLStr & "県合計点," & Chr(13) & Chr(10) >SQLStr = SQLStr & "四番目合計," & Chr(13) & Chr(10) >SQLStr = SQLStr & "四番目誕生日" & Chr(13) & Chr(10) >SQLStr = SQLStr & "from 県順位テーブル" & Chr(13) & Chr(10) >SQLStr = SQLStr & "order by" & Chr(13) & Chr(10) >SQLStr = SQLStr & "県合計点 DESC," & Chr(13) & Chr(10) >SQLStr = SQLStr & "四番目合計 DESC," & Chr(13) & Chr(10) >SQLStr = SQLStr & "四番目誕生日" > >Set Ms_Rec = Ms_Db.OpenRecordset(SQLStr) > >'※2 この3行を追加してみてください。 >If Ms_Rec.RecordCount = 0 Then > MsgBox "対策2が必要です。" >End If > >県順位 = 1 >Do While Not Ms_Rec.EOF > MsgBox 県順位 & "位の更新をします。" > SQLStr = "" > SQLStr = SQLStr & "select" & Chr(13) & Chr(10) > SQLStr = SQLStr & "count(*) as 県数" & Chr(13) & Chr(10) > SQLStr = SQLStr & "from 県順位テーブル" & Chr(13) & Chr(10) > SQLStr = SQLStr & "where" & Chr(13) & Chr(10) > SQLStr = SQLStr & "四番目誕生日=" > SQLStr = SQLStr & "'" & Ms_Rec("四番目誕生日").Value & "' " > SQLStr = SQLStr & "and 四番目合計=" > SQLStr = SQLStr & Ms_Rec("四番目合計").Value >'※1 この行が抜けてました。 > SQLStr = SQLStr & "and 四番目合計=" & Ms_Rec("四番目合計").Value > > Set Ms_Rec2 = Ms_Db.OpenRecordset(SQLStr) > >'※2 この3行を追加してみてください。 > If Ms_Rec2.RecordCount = 0 Then > MsgBox "対策3が必要です。" > End If > > 県数 = Ms_Rec2("県数").Value > > SQLStr = "" > SQLStr = SQLStr & "update" & Chr(13) & Chr(10) > SQLStr = SQLStr & "県順位テーブル" & Chr(13) & Chr(10) > SQLStr = SQLStr & "set 県順位=" & 県順位 & Chr(13) & Chr(10) > SQLStr = SQLStr & "where" & Chr(13) & Chr(10) > SQLStr = SQLStr & "県合計点=" & Ms_Rec("県合計点").Value > SQLStr = SQLStr & " and 四番目誕生日=" > SQLStr = SQLStr & "'" & Ms_Rec("四番目誕生日").Value & "' " > SQLStr = SQLStr & "and 四番目合計=" & Ms_Rec("四番目合計").Value > > Ms_Db.Execute SQLStr, dbFailOnError > 県順位 = 県順位 + 県数 > Ms_Rec.MoveNext >Loop >Ms_Rec.Close >Ms_Rec2.Close >Ms_Rec3.Close >Ms_Db.Close >'※4 この1行を追加。 >MsgBox "4 終わりまで正常に動きました。" >End Sub >これでどんなメッセージがでたか教えてください。 1位の更新をします。2位の更新をします。〜5位の更新をします。 4終わりまで正常に動きました。のメッセージが出ました。 最初の質問の祭、[1]〜[5]で質問したので、[1]〜[5]コードは書かれていますが、 [1]〜[5]だけではなく増えた時は、孫悟空さんの作成したコード内に 書き足せば良いだけでしょうか? こんな感じで SQLStr = SQLStr & "[1],[2],[3],[4],[5],[6],[7],[8],[9], [10]" & Chr(13) & Chr(10) さらに、最初の質問では、四番目合計、四番目誕生日だけでよかったのですが 急遽、県順位を指定するのに、県別合計が同じ場合 4番目合計、4番目合計が同じ場合は、3番目合計を比較 3番目合計が同じ場合は、2番目合計を比較 2番目合計が同じ場合は、1番目合計を比較 1番目合計が同じ場合は、4番目誕生日を比較 4番目誕生日がが同じ場合は、3番目誕生日を比較 3番目誕生日がが同じ場合は、3番目誕生日を比較 2番目誕生日がが同じ場合は、1番目誕生日を比較 これもコードに書き足せば可能でしょうか? ここまで親切に回答を頂いといて、いつまでもご迷惑をおかけして 本当に申し訳ありません。 [1]〜[10]までをコード内に追加して、試したのですが出来ませんでした。 Chr(13) & Chr(10) ← ( )内の数字も変更しないと いけないのでしょうか? |
▼miya さん: > 更新されました。 コードにミスがありご迷惑をおかけしました。 > 1位の更新をします。2位の更新をします。〜5位の更新をします。 > 4終わりまで正常に動きました。のメッセージが出ました。 やっと正常に動いているようです。 >最初の質問の祭、[1]〜[5]で質問したので、[1]〜[5]コードは書かれていますが、 >[1]〜[5]だけではなく増えた時は、孫悟空さんの作成したコード内に >書き足せば良いだけでしょうか? > >こんな感じで >SQLStr = SQLStr & "[1],[2],[3],[4],[5],[6],[7],[8],[9], >[10]" & Chr(13) & Chr(10) 一般解では、こんな感じでしょう。 SQLStr = SQLStr & "[1],[2],・,・,・,[N]," & Chr(13) & Chr(10) SQLStr = SQLStr & "[1]+[2]+・・・・+[N] AS 合計," & Chr(13) & Chr(10) >さらに、最初の質問では、四番目合計、四番目誕生日だけでよかったのですが >急遽、県順位を指定するのに、県別合計が同じ場合 >4番目合計、4番目合計が同じ場合は、3番目合計を比較 > 3番目合計が同じ場合は、2番目合計を比較 > 2番目合計が同じ場合は、1番目合計を比較 > 1番目合計が同じ場合は、4番目誕生日を比較 > 4番目誕生日がが同じ場合は、3番目誕生日を比較 > 3番目誕生日がが同じ場合は、3番目誕生日を比較 > 2番目誕生日がが同じ場合は、1番目誕生日を比較 >これもコードに書き足せば可能でしょうか? まずは県順位テーブルから見直しが必要です。 '次に県順位の判定に必要な情報を組み入れた '県順位テーブルを作成します。 SQLStr = "" SQLStr = SQLStr & "SELECT 県名," & Chr(13) & Chr(10) SQLStr = SQLStr & "SUM([1]+・・・・+[N]) AS 県合計点," SQLStr = SQLStr & "SUM(IIF(県内順位=1,合計,0)) AS 一番目合計," SQLStr = SQLStr & "SUM(IIF(県内順位=2,合計,0)) AS 二番目合計," ・・・・・・ ・・・・・・ SQLStr = SQLStr & "SUM(IIF(県内順位=N,合計,0)) AS N番目合計," SQLStr = SQLStr & "format(SUM(IIF(県内順位=1,生年月日,0)),'YYYY/MM/DD')" SQLStr = SQLStr & " AS 一番目誕生日," & Chr(13) & Chr(10) SQLStr = SQLStr & "format(SUM(IIF(県内順位=2,生年月日,0)),'YYYY/MM/DD')" SQLStr = SQLStr & " AS 二番目誕生日," & Chr(13) & Chr(10) ・・・・・・ ・・・・・・ SQLStr = SQLStr & "format(SUM(IIF(県内順位=N,生年月日,0)),'YYYY/MM/DD')" SQLStr = SQLStr & " AS N番目誕生日," & Chr(13) & Chr(10) SQLStr = SQLStr & "0 AS 県順位" & Chr(13) & Chr(10) SQLStr = SQLStr & "INTO 県順位テーブル" & Chr(13) & Chr(10) SQLStr = SQLStr & "FROM 顧客順位テーブル" & Chr(13) & Chr(10) SQLStr = SQLStr & "WHERE 県内順位<=4" & Chr(13) & Chr(10) SQLStr = SQLStr & "GROUP BY 県名;" 次に順位の決定ロジックの変更も必要です。 SQLStr = "" SQLStr = SQLStr & "select distinct" & Chr(13) & Chr(10) SQLStr = SQLStr & "県合計点," & Chr(13) & Chr(10) SQLStr = SQLStr & "N番目合計," & Chr(13) & Chr(10) ・・・・・・ ・・・・・・ SQLStr = SQLStr & "二番目合計," & Chr(13) & Chr(10) SQLStr = SQLStr & "一番目合計," & Chr(13) & Chr(10) SQLStr = SQLStr & "四番目誕生日" & Chr(13) & Chr(10) ・・・・・・ ・・・・・・ SQLStr = SQLStr & "二番目誕生日" & Chr(13) & Chr(10) SQLStr = SQLStr & "一番目誕生日" & Chr(13) & Chr(10) SQLStr = SQLStr & "from 県順位テーブル" & Chr(13) & Chr(10) SQLStr = SQLStr & "order by" & Chr(13) & Chr(10) SQLStr = SQLStr & "県合計点 DESC," & Chr(13) & Chr(10) SQLStr = SQLStr & "N番目合計 DESC," & Chr(13) & Chr(10) ・・・・・・ ・・・・・・ SQLStr = SQLStr & "二番目合計 DESC," & Chr(13) & Chr(10) SQLStr = SQLStr & "一番目合計 DESC," & Chr(13) & Chr(10) SQLStr = SQLStr & "四番目誕生日," ・・・・・・ ・・・・・・ SQLStr = SQLStr & "二番目誕生日," SQLStr = SQLStr & "一番目誕生日" Set Ms_Rec = Ms_Db.OpenRecordset(SQLStr) 県順位 = 1 Do While Not Ms_Rec.EOF MsgBox 県順位 & "位の更新をします。" SQLStr = "" SQLStr = SQLStr & "select" & Chr(13) & Chr(10) SQLStr = SQLStr & "count(*) as 県数" & Chr(13) & Chr(10) SQLStr = SQLStr & "from 県順位テーブル" & Chr(13) & Chr(10) SQLStr = SQLStr & "where" & Chr(13) & Chr(10) SQLStr = SQLStr & "四番目誕生日=" SQLStr = SQLStr & "'" & Ms_Rec("四番目誕生日").Value & "' " ・・・・・・・・ ・・・・・・・・ SQLStr = SQLStr & "and 二番目誕生日=" SQLStr = SQLStr & "'" & Ms_Rec("二番目誕生日").Value & "' " SQLStr = SQLStr & "and 一番目誕生日=" SQLStr = SQLStr & "'" & Ms_Rec("一番目誕生日").Value & "' " SQLStr = SQLStr & "and N番目合計=" SQLStr = SQLStr & Ms_Rec("N番目合計").Value ・・・・・・・ ・・・・・・・ SQLStr = SQLStr & "and 二番目合計=" SQLStr = SQLStr & Ms_Rec("二番目合計").Value SQLStr = SQLStr & "and 一番目合計=" SQLStr = SQLStr & Ms_Rec("一番目合計").Value Set Ms_Rec2 = Ms_Db.OpenRecordset(SQLStr) 県数 = Ms_Rec2("県数").Value SQLStr = "" SQLStr = SQLStr & "update" & Chr(13) & Chr(10) SQLStr = SQLStr & "県順位テーブル" & Chr(13) & Chr(10) SQLStr = SQLStr & "set 県順位=" & 県順位 & Chr(13) & Chr(10) SQLStr = SQLStr & "where" & Chr(13) & Chr(10) SQLStr = SQLStr & "県合計点=" & Ms_Rec("県合計点").Value SQLStr = SQLStr & " and N番目誕生日=" SQLStr = SQLStr & "'" & Ms_Rec("N番目誕生日").Value & "' " ・・・・・・・・・・・ ・・・・・・・・・・・ SQLStr = SQLStr & " and 二番目誕生日=" SQLStr = SQLStr & "'" & Ms_Rec("二番目誕生日").Value & "' " SQLStr = SQLStr & " and 一番目誕生日=" SQLStr = SQLStr & "'" & Ms_Rec("一番目誕生日").Value & "' " SQLStr = SQLStr & "and 四番目合計=" & Ms_Rec("四番目合計").Value ・・・・・ ・・・・・ SQLStr = SQLStr & "and 二番目合計=" & Ms_Rec("二番目合計").Value SQLStr = SQLStr & "and 一番目合計=" & Ms_Rec("一番目合計").Value と言う感じで、直してみてください。 >ここまで親切に回答を頂いといて、いつまでもご迷惑をおかけして >本当に申し訳ありません。 >[1]〜[10]までをコード内に追加して、試したのですが出来ませんでした。 原因は色々あると思いますが推測不可です。 上の参考コードと、ヘルプなんかを見ながら勉強してみてください。 >Chr(13) & Chr(10) ← ( )内の数字も変更しないと >いけないのでしょうか? 不要です。 & CHR(13) & CHR(10)は、確かラインフィードと カーソルリターンを意味します。関係ありません。 デバックする際見やすくするのに使っています。 ちょっ長くなりすぎましたのでこの辺で一息しましょう。 |
▼孫悟空 さん 長いこと、ご迷惑をおかけして申し訳ありませんでした。 このような、面倒な質問にご親切に何度も 回答を頂き、本当にありがとうございました。 心から感謝いたしております。 お忙しい中、お付き合い頂き、誠にありがとうございました。 |