![Excel vba で重複した値をチェックするにはどうすればいいですか?](https://rvso.com/image/1628808/Excel%20vba%20%E3%81%A7%E9%87%8D%E8%A4%87%E3%81%97%E3%81%9F%E5%80%A4%E3%82%92%E3%83%81%E3%82%A7%E3%83%83%E3%82%AF%E3%81%99%E3%82%8B%E3%81%AB%E3%81%AF%E3%81%A9%E3%81%86%E3%81%99%E3%82%8C%E3%81%B0%E3%81%84%E3%81%84%E3%81%A7%E3%81%99%E3%81%8B%3F.png)
ユーザーがデータをコピーして貼り付けると、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
注記:
- コードは列に入力されたエントリの両方を処理できますあ列にコピー/貼り付けすることも可能
- コードは列への複数セルのコピー/貼り付けを処理できます