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

Visual Basic

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を活用することで効率的に全重複レコードをマークでき、後からの修正も簡単になります。

この手法を使えば、大規模なデータでも正確に重複検出とマーク付けが可能です。

コメント

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