Access VBAで重複レコードを検出してマークを付ける場合、後の重複レコードには〇印が付くのに、先に出現したレコードに付かない問題はよくあります。この記事では、全ての重複レコードに〇印を付ける方法と、サンプルコードの改善例を解説します。
重複レコード検出の基本
重複レコードを検出する際には、対象フィールドの値をキーとして管理し、既に出現した値に対して印を付けるのが一般的です。DAO.RecordsetやScripting.Dictionaryを活用すると効率的です。
重要なのは、最初に出現したレコードにも〇印を付けるロジックを組み込むことです。
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で管理することで処理速度が向上します。また、rs2での追加レコード編集は必要最小限に留めると効率的です。
まとめ
Access VBAで重複レコードに〇印を付ける際は、最初に出現したレコードにも印を付けることが重要です。Dictionaryを活用することで効率的に全重複レコードをマークでき、後からの修正も簡単になります。
この手法を使えば、大規模なデータでも正確に重複検出とマーク付けが可能です。


コメント