HOME > 即効テクニック > AccessVBA > 日付・文字列操作・演算 > ExcelのRanking関数のように順位を算出する

即効テクニック

日付・文字列操作・演算

ExcelのRanking関数のように順位を算出する

(Access 97)
● 概要 ●
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のチェックを持ってきて下さい。