Excel vba で重複した値をチェックするにはどうすればいいですか?

Excel vba で重複した値をチェックするにはどうすればいいですか?

ユーザーがデータをコピーして貼り付けると、Excel のデータ検証が機能しません。

ユーザーが列に重複データを貼り付けたときにエラー メッセージが表示されるようにします。

私は次のコード(別の代替案)を使用していますが、これは私が望んでいるものではありません。ユーザーがデータを挿入するときにこれをチェックし、問題がある場合はエラー メッセージをスローするようにします。

Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean) 
  Dim rngCell As Range Dim lngLstRow As Long lngLstRow = Sheet1.UsedRange.Rows.Count
  For Each rngCell In Sheet1.Range("A1:A" & lngLstRow) 
    If CountIf(Range("A:A"),A1) > 2 Then
      MsgBox "Please enter unique value " & rngCell.Address
        rngCell.Select
    End If 
  Next 
End Sub

答え1

イベントを使用するとChange、データ検証なしで重複エントリをトラップできます。

Private Sub Worksheet_Change(ByVal Target As Range)
    Dim RangeOfInterest As Range, Intersection As Range, cell As Range
    
    Set RangeOfInterest = Range("A:A")
    Set Intersection = Intersect(RangeOfInterest, Target)
    If Intersection Is Nothing Then Exit Sub
    
    With Application
        For Each cell In Intersection
            If .WorksheetFunction.CountIf(RangeOfInterest, cell.Value) > 1 Then
                .EnableEvents = False
                    .Undo
                .EnableEvents = True
                MsgBox "duplicates not allowed"
            Exit Sub
            End If
        Next cell
    End With
End Sub

注記:

  1. コードは列に入力されたエントリの両方を処理できます列にコピー/貼り付けすることも可能
  2. コードは列への複数セルのコピー/貼り付けを処理できます

関連情報