Microsoft Access 掲示板

同順位のデータを書き換えたいです。

8 コメント
views
4 フォロー

MT_test というテーブルがあります。

グループID⇒文字
順位⇒数値
売上⇒数値
勤怠係数⇒数値

順位が、同一順位になる事があります。
この時に、勤怠係数が、上位のものを1位として、
勤怠係数が悪いものに、順位を下げたいのです。
画像1

えいじ
作成: 2022/07/05 (火) 18:52:11
通報 ...
1

MT_test というテーブルに 順位 というフィールドがあり、そのフィールドに順位を書き込みたいという話ですか。

同一順位になる事があるとのことですが、現状のコードを提示してもらえますか。

とりあえず、下記が参考になると思いますので、ご参照ください。

グループ毎連番を自動入力する関数 - hatena chips

2
えいじ 2022/07/06 (水) 23:11:24

グループID ⇒文字型
名前 ⇒文字型
順位 ⇒数値型
売上 ⇒数値型
勤怠係数 ⇒数値型

やりたいこと

売上の高いものから、順位を昇順で振っています。

現在、Aグループの甲、乙が、同順位です。

順位列で、同順位は困ので、同順位が発生した場合、勤怠係数が、小さい方を優先して、昇順で連番を振りたいのです

今回の場合は、

甲⇒売上100
乙⇒売上100

売上では、同順位ですが、

勤怠係数

甲⇒90
乙⇒50

この場合に、甲の順位を2 乙の順位を1としたいのです。

3

それは最初の質問でわかっています。

順位フィールドにVBAか更新クエリで書き込んでいるのですよね。
それをどのようにしているのか、説明してください。
VBAならコードを、クエリならSQLを提示してください。

どちらにしても、方法は前回の回答のリンク先に説明してありますので、参照してみてください。

4
えいじ 2022/07/07 (木) 21:18:38

申し訳ありませんでした。
なにもしていません。
CSVファイルを、ACCESSにコピペしています。

紹介していただいたページですが、
同順位だったら書き換えるという条件判定がわかりませんでした。

申し訳ありません。

5

グループ毎連番を自動入力する関数 - hatena chips

上記の汎用関数のコードをコピーして、標準モジュールに貼り付けます。
そのうえで、下記のコードを実行すればご希望の結果になります。

If SetSequenceNumber("順位", "MT_test", "グループID", "売上 DESC,勤怠係数 DESC") Then
     MsgBox "完了"
End If

フォーム上のコマンドボタンのクリック時のイベントプロシージャ内に記述すれば、ボタンクリックで実行できます。

6
えいじ 2022/07/08 (金) 20:05:12
Private Sub コマンド0_Click()
If SetSequenceNumber("順位", "MT_test", "グループID", "売上 DESC,勤怠係数 DESC") Then
     MsgBox "完了"
End If
End Sub

このように記載するという事ですよね。

上部に記載のあるページを参考にしたのですが、

Subまたは、Functionが定義されていませんとエラーが出ます。

申し訳ありません。

7

リンク先から転載

'グループ毎の連番を入力する関数
'引数 FieldName:連番を格納するフィールド名(データ型は数値型)
'   TableName:対象のテーブル名またはクエリ名(パラメータクエリは不可)
'   GroupBy:グループ化するフィールド名(省略可能)
'               複数フィールドをカンマ区切りで指定可能
'               省略した場合は全レコードを通しての連番になります。
'   Orderby:並べ替えするフィールド名(省略可能)
'               SQLのORDER BY句内の式と同一
'               省略した場合は並び順は不定になります。
'   WhereCondition:抽出条件式(省略可能)
'               SQLのOWHERE句内の式と同一
'               省略した場合は全レコードが対象になります。
'使用上の注意: DAO ライブラリへの参照設定が必要です。
Public Function SetSequenceNumber( _
       FieldName As String, _
       TableName As String, _
       Optional GroupBy As String, _
       Optional Orderby As String, _
       Optional WhereCondition As String) As Boolean
    Dim ws As DAO.Workspace
    Dim rs As DAO.Recordset
    Dim c As Long, GCnt As Long, i As Long
    Dim strSQL As String, strOrderby As String
    Dim v() As String
 
    Const CommitInterval As Long = 5000 'トランザクションをコミットする間隔
    Dim TranCount As Long
    Dim TranBegin As Boolean
    On Error GoTo ErrHdl
 
    SetSequenceNumber = True
 
    'SQL文生成
    strSQL = "SELECT " & FieldName
    If LenB(GroupBy) > 0 Then
        strSQL = strSQL & ", " & GroupBy
        strOrderby = "," & GroupBy
    End If
    strSQL = strSQL & " FROM " & TableName
    If LenB(WhereCondition) > 0 Then strSQL = strSQL & " WHERE " & WhereCondition
    If LenB(Orderby) > 0 Then strOrderby = strOrderby & "," & Orderby
    If LenB(strOrderby) > 0 Then strSQL = strSQL & " ORDER BY " & Mid$(strOrderby, 2)
    strSQL = strSQL & ";"
     
    Set ws = DBEngine.Workspaces(0)
    Set rs = CurrentDb.OpenRecordset(strSQL, dbOpenDynaset)
 
    'グループ化するフィールド数分の動的配列確保
    GCnt = UBound(Split(GroupBy, ","))
    If GCnt > -1 Then ReDim v(GCnt)
 
    '連番書き込みループ
    TranCount = 0
    ws.BeginTrans: TranBegin = True
    Do Until rs.EOF
        For i = 0 To GCnt
            If v(i) = rs(i + 1) Then
            Else
                c = 0
                v(i) = rs(i + 1)
            End If
        Next
        c = c + 1
        rs.Edit
        rs(0) = c
        rs.Update
        rs.MoveNext
        '↓対象レコード件数が多い時に共有ロック数エラーが出る時の対策用
        TranCount = TranCount + 1
        If TranCount = CommitInterval Then
            ws.CommitTrans
            ws.BeginTrans
            TranCount = 0
        End If
    Loop
    ws.CommitTrans: TranBegin = False
 
Ext:
    On Error Resume Next
    rs.Close
    Set rs = Nothing
    Set ws = Nothing
    Exit Function
ErrHdl:
    MsgBox Err & ":" & Err.Description
    SetSequenceNumber = False
    If TranBegin Then ws.Rollback
    Resume Ext
End Function

上記のコードをコピーして標準モジュールに貼り付けましたか。

8
えいじ 2022/07/10 (日) 23:09:21

ご丁寧に、ありがとうございました。