即効テクニック |
● 概要 ● ExcelのRanking関数は、あるレコードセット(データの集合)の順位を算出する関数です。特に同点の場合には同順位として計算してくれるのが特徴です。 例) 名前 点数 順位 A 100 1 B 90 2 C 90 2 D 80 4 この機能をAccess上で実現する方法を説明します。 ● 準備 ● (1) テーブル[順位]を用意し、以下のようなサンプルデータを入力します。 名前 点数 順位 A 100 B 90 C 90 D 80 [順位]フィールドには何も入力しないで下さい。 ● DAOを使用してコードを書く方法 ● ここではDAOのレコードセットを使用して、いわゆる「ゴリゴリコードを書く」方法を紹介します。ロジックは以下の通りです。 標準モジュールにコードを記述して下さい。 1) 評価したいフィールドを降順に並び替えてレコードセット取得 2) 前レコードの点数と今回のレコードの点数を比較 3) 同じ場合には前レコードの順位をテーブルに代入 4) 繰り返し Private Sub MakeRanking() Dim Rst As DAO.Recordset Dim strSQL As String Dim iPoint As Integer Dim iRank As Integer Dim iRenban As Integer '並べ替えしたレコードセットを取得 strSQL = "Select * From 順位 Order By 点数 Desc" Set Rst = CurrentDb.OpenRecordset(strSQL, dbOpenDynaset) '変数&レコードセット初期化 iRenban = 1 iPoint = 0 iRank = 0 Rst.MoveFirst Do Until Rst.EOF '点数を比較して、同じだったら前回の順位を代入 If Rst![点数] = iPoint Then Rst.Edit Rst![順位] = iRank Rst.Update '違う場合は連番を順位に代入 Else Rst.Edit Rst![順位] = iRenban Rst.Update End If iRenban = iRenban + 1 '点数と順位の取得 iPoint = Rst![点数] iRank = Rst![順位] Rst.MoveNext Loop '終了処理 Rst.Close Set Rst = Nothing MsgBox "終了しました" End Sub ● DCount関数を使用してクエリに表示する方法 ● 今度はDCount関数を使用して、クエリに順位を表示する方法を説明します。 レコードセット(データの集合)が可変であり、順位を計算属性として考える のであれば、こちらの方法のほうがふさわしいでしょう。 (1) 新規クエリを作成し[順位]テーブルを追加します。 (2) [名前]、[点数]フィールドを追加し、その右隣のフィールドに以下の式を 記述します。 --------------------------------------------------- 順位1: DCount("[点数]","順位","[点数]>" & [点数])+1 --------------------------------------------------- (3) クエリをデータシートビューに変更すると、同点を考慮した順位が表示さ れます。 ここでは、DCountで自分よりも点数の高い人の人数を数え、その人数に1を足すことによって同点を考慮した人数を算出しています。 ただ、DCountのような定義域集計関数を使用する場合、レコード数が多くなってくるとかなり実行速度が遅くなりますのでご注意下さい。 ● 詳細 ● 今回紹介した2つの方法は、それぞれ一長一短があります。 テーブルに直接データを書き込む前者の方法は、速度的に早いということと、一度実行した後は単にテーブルを参照すれば済むという長所があります。 反面、データに変更があった場合に再実行しなくてはならない点や、誤ってデータを書き換えてしまう可能性があることが欠点です。 後者の方法はまったく逆の特性を持ち、速度的には不利ですがデータの書き換えの可能性は無く、データの変更に対しても柔軟に対応できます。 また、計算によって算出することのできるデータ(計算属性)は、できるだけテーブルに持たせないのがRDB(リレーショナルデータベース)の基本的な考え方であり、それに応じた方法でもあります。 このように両者の特徴をつかんだ上で、場面に応じて使い分けるようにして下さい。 ● 備考 ● Access2000の場合、デフォルトではDAOに参照設定されていません。 Visual Basic Editor(VBE)を開き、メニューの[ツール]-[参照設定]から、Microsoft DAO 3.6 Object Libraryにチェックを入れて下さい。 その際にMicrosoft ActiveX Data Object 2.1 Libraryよりも上に、DAOのチェックを持ってきて下さい。