Access VBAで指定フィールドの重複を検出し、全ての重複レコードに〇印を付ける方法は、多くのユーザーが悩むポイントです。この記事では、既存コードの問題点を解説し、最初に出現したレコードにも〇印を付ける方法を紹介します。
重複検出の基本ロジック
重複検出は対象フィールドの値をキーとして管理し、既に出現した値に対してマークを付ける手法が一般的です。Dictionaryオブジェクトを使うと効率的に管理できます。
重要なのは、初めて出現したレコードにもマークを付けることです。これにより、全ての重複レコードが視覚的に識別可能になります。
改善ポイント
既存コードでは、後から出現する重複レコードに〇印を付ける処理はあるものの、初回のレコードに付ける処理が不足していました。
改善方法としては、Dictionaryに値を追加する前に初回レコードに〇印を付ける処理を入れることです。
改良したVBAコード例
Public Sub MarkDuplicateRecords()
Dim db As DAO.Database
Dim rs As DAO.Recordset
Dim dict As Object
Dim keyValue As Variant
Set db = CurrentDb
Set rs = db.OpenRecordset("SELECT ID, TargetField, MarkField FROM MyTable", dbOpenDynaset)
Set dict = CreateObject("Scripting.Dictionary")
' 印をクリア
rs.MoveFirst
Do Until rs.EOF
rs.Edit
rs!MarkField = Null
rs.Update
rs.MoveNext
Loop
rs.MoveFirst
Do Until rs.EOF
keyValue = rs!TargetField
If Not IsNull(keyValue) Then
If dict.Exists(keyValue) Then
' 後から出現した重複レコードに〇
rs.Edit
rs!MarkField = "〇"
rs.Update
' 初回レコードにも〇を付ける
Dim rs2 As DAO.Recordset
Set rs2 = db.OpenRecordset("SELECT ID, MarkField FROM MyTable WHERE ID=" & dict(keyValue), dbOpenDynaset)
If Not rs2.EOF Then
rs2.Edit
rs2!MarkField = "〇"
rs2.Update
End If
rs2.Close
Set rs2 = Nothing
Else
' 初出レコードに〇印
rs.Edit
rs!MarkField = "〇"
rs.Update
dict.Add keyValue, rs!ID
End If
End If
rs.MoveNext
Loop
MsgBox "重複レコードに〇印を付けました。", vbInformation
rs.Close
Set rs = Nothing
Set db = Nothing
Set dict = Nothing
End Sub
実例と注意点
この方法により、TargetFieldに同じ値が存在する場合、最初のレコードにも〇印が付くため、全ての重複を視覚的に確認できます。
処理速度を考慮する場合、Dictionaryの使用やRecordset操作の最小化がポイントです。
まとめ
VBAで重複レコードに〇印を付ける際は、初回出現のレコードにも印を付ける処理を忘れずに入れることが重要です。Dictionaryを活用することで効率的に全ての重複をマークできます。
これにより、データの重複チェックや可視化が容易になり、正確なデータ管理に役立ちます。


コメント