Excel vba 重複チェック

  • このエントリーをはてなブックマークに追加
  • Pocket
  • LINEで送る

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
next
変数list、list2を比較しているループのイメージです
キーが異なる かつ IDと名前が同一の場合は〇

If count = 0 Then
  Cells(key, 3) = “”
End If
count = 0
keyのループ毎に重複していた数をカウントしています。
重複が解消された場合は自動で重複列の〇が消えます。


Application.EnableEvents = True
プロシージャの呼び出しを再開します。

  • このエントリーをはてなブックマークに追加
  • Pocket
  • LINEで送る

SNSでもご購読できます。

コメントを残す

*