VBAで重複レコードに〇印を正しく付ける方法とコード例

Microsoft Access

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を活用することで効率的に全ての重複をマークできます。

これにより、データの重複チェックや可視化が容易になり、正確なデータ管理に役立ちます。

コメント

タイトルとURLをコピーしました