vbaを使用して重複チェックを行いたいと思います。
重複しているデータがあった場合は重複列に〇を付ける。
完成イメージ
Altキーを押しながら[F11]キーを押してVBE画面を開きます!
今回ソースを記載する場所はSheet1(Sheet1)
オブジェクトはWorksheet、プロシージャはChange
以下ソースです。
Private Sub Worksheet_Change(ByVal Target As Range)
Application.EnableEvents = False
Dim list As Object
Set list = CreateObject(“scripting.dictionary”)
Dim list2 As Object
Set list2 = CreateObject(“scripting.dictionary”)
Dim i As Long
Dim key As Variant
Dim key2 As Variant
Dim count As Long
Dim max As Long
’A列の最終行の行番号を取得します。
max = Cells(Rows.count, 1).End(xlUp).Row
If Cells(2, 1).End(xlDown).Value = “” Then
max = 0
End If
’比較するため1列目と2列目を連結させて2つの変数に格納します。
For i = 2 To max
list.Add i, Cells(i, 1) & Cells(i, 2)
list2.Add i, Cells(i, 1) & Cells(i, 2)
Next
’2つのListを比較します
For Each key In list.keys
For Each key2 In list2.keys
’同一のキーは処理しません
If key = key2 Then
‘何もしない
Else
‘比較する側とされる側がどちらもNULLの場合は処理なし
If list.Item(key) <> “” And list2.Item(key2) <> “” Then
‘同一のキーではなく同一の値の場合は重複列に〇
If list.Item(key) = list2.Item(key2) Then
Cells(key, 3) = “〇”
count = count + 1
End If
End If
End If
Next
’重複がなくなった場合、重複列の〇を消す。
If count = 0 Then
Cells(key, 3) = “”
End If
count = 0
Next
Application.EnableEvents = True
End Sub
ソース解説
Application.EnableEvents = False
プロシージャの呼び出しを停止させます。
詳細は「Application.EnableEventsを教えて・・・」参照
Dim list As Object
Set list = CreateObject(“scripting.dictionary”)
Dim list2 As Object
Set list2 = CreateObject(“scripting.dictionary”)
キーと値が設定可能なdictionaryオブジェクトの変数を定義します。
dictionaryオブジェクトを分かりやすく言うと、
学校では出席番号というのがあったはずです。
この出席番号が「キー」です!(重複しない番号)「値」が名前です。
たとえばExcel小学校の1年1組の出席番号1番は一人しかいないはずです。
もし先生に「Excel小学校1年1組出席番号1番!!」・・・と呼ばれたら、
あぁーあいつね。と「名前」(値)がわかるはずです。
max = Cells(Rows.count, 1).End(xlUp).Row
左から1列目の最終行の行番号を取得します。
詳細は「Excel xlUpのイメージを掴む」参照
For i = 2 To max
list.Add i, Cells(i, 1) & Cells(i, 2)
list2.Add i, Cells(i, 1) & Cells(i, 2)
Next
変数list、list2にキーを指定してIDと名前を入れます。
For Each key In list.keys
For Each key2 In list2.keys
next
変数list、list2を比較しているループのイメージです
キーが異なる かつ IDと名前が同一の場合は〇
If count = 0 Then
Cells(key, 3) = “”
End If
count = 0
keyのループ毎に重複していた数をカウントしています。
重複が解消された場合は自動で重複列の〇が消えます。
Application.EnableEvents = True
プロシージャの呼び出しを再開します。