【VBA】重複データが存在するか確認する

VBAを使用して、Excelのシートに重複データが存在するか調べてみます。

VBAで重複データの確認

Sheet1のA列とB列にデータが入力されています。
A列は文字Eが重複していますがB列に重複している文字は存在しません。

VBAで重複データがあるか確認するにはDictionaryオブジェクトを使用します。

Dictionaryオブジェクトを使用するにはMicrosoft Scripting Runtimeに参照設定を行う必要があります。
参照設定についてはこちらをご覧ください。

https://kazusa-pg.com/vba-references/

Dictionaryオブジェクトを使用して重複データの存在を確認をするコードです。

 1Option Explicit
 2Sub findDupulicates(sht As Worksheet, col As Long)
 3'###################################################################################
 4'指定した列に重複データが存在するか確認する
 5'-----------------------------------------------------------------------------------
 6'引数  :sht 重複データが存在するか確認したいシート
 7'      :col 重複データが存在するか確認したい列
 8'###################################################################################
 9
10  Dim dic As Dictionary
11  Set dic = New Dictionary
12
13  Dim lastRow As Long
14  lastRow = getMaxRow(sht, col)
15
16  Dim dupulicateFlag As Boolean
17  dupulicateFlag = False
18  Dim i As Long
19  For i = 1 To lastRow
20    If dic.Exists(sht.Cells(i, col).Value) Then
21      dupulicateFlag = True
22    Else
23      dic.Add sht.Cells(i, col).Value, sht.Cells(i, col).Value
24    End If
25  Next i
26
27  If dupulicateFlag Then
28    MsgBox "重複しているデータが存在します", vbInformation, "重複データあり"
29  Else
30    MsgBox "重複しているデータは存在しません", vbInformation, "重複データなし"
31  End If
32
33  Set dic = Nothing
34
35End Sub
36
37Function getMaxRow(sht As Worksheet, targetCol As Long) As Long
38
39  getMaxRow = sht.Cells(sht.Rows.Count, targetCol).End(xlUp).Row
40
41End Function

データの最終行を取得するためにgetMaxRowを使用しています。

1For i = 1 To lastRow
2  If dic.Exists(sht.Cells(i, col).Value) Then
3    dupulicateFlag = True
4  Else
5    dic.Add sht.Cells(i, col).Value, sht.Cells(i, col).Value
6  End If
7Next i

DictionaryのExistsメソッドとAddメソッドでcells(i, col).Valueと入力しています。
cells(i, col) とValueの入力を省略してしまうとセルの値ではなくRangeオブジェクトが呼び出されます。
重複チェックが動かなくなってしまうので、必ずValueをつけてください。

test_findDupulicatesを実行するとfindDuplicatesを呼び出してA列とB列に重複データがあるか確認します。

 1Option Explicit
 2Sub test_findDupulicates()
 3
 4  Dim sht As Worksheet
 5  Set sht = ThisWorkbook.Worksheets("Sheet1")
 6
 7  Call findDupulicates(sht, 1)
 8  Call findDupulicates(sht, 2)
 9
10  Set sht = Nothing
11
12End Sub

Call findDupulicates(sht, 1) でA列に重複データがあるか確認しています。
文字Eが重複しているので、メッセージボックスに重複データが存在すると表示されます。

Call findDupulicates(sht, 2) でB列に重複データがあるか確認しています。
重複している文字はないので、重複データなしと表示されます。

VBAで重複しているデータを取得

VBAでExcelのシートの重複データを取得するには、Dictionaryオブジェクトを使用します。
Dictionaryオブジェクトを使用するにはMicrosoft Scripting Runtimeに参照設定を行う必要があります。
Sheet2のA列に都道府県を一部抜粋したデータを入力しました。

データが少ないので目視でも確認できますが、千葉県と奈良県が重複しています。
VBAを使用して重複データを取得します。

重複データを取得するコード

シートの特定の列から重複データを取得するコードです。

 1Option Explicit
 2Function listDupulicates(sht As Worksheet, col As Long) As Dictionary
 3'###################################################################################
 4'指定した列の重複データをDictionaryとして返す
 5'-----------------------------------------------------------------------------------
 6'引数  :sht 重複データを取り出したいしたいシート
 7'         :col 重複データが取り出したい列番号
 8'戻り値:重複しているデータのDictionary
 9'###################################################################################
10
11  Dim dic As Dictionary
12  Set dic = New Dictionary
13  
14  Dim lastRow As Long
15  lastRow = getMaxRow(sht, col)
16
17  Dim i As Long
18  For i = 1 To lastRow
19    If dic.Exists(sht.Cells(i, col).Value) Then
20      'Dictionaryに項目が存在するときはフラグをTrueにする
21      dic(sht.Cells(i, col).Value) = True
22    Else
23      dic.Add sht.Cells(i, col).Value, False
24    End If
25  Next i
26  
27  Dim duplicateDic As Dictionary
28  Set duplicateDic = New Dictionary
29  For i = 0 To dic.Count - 1
30     '重複している項目をdicからduplicateDicにコピーする
31    If dic(dic.Keys(i)) Then
32      duplicateDic.Add dic.Keys(i), True
33    End If
34  Next i
35  
36  Set listDupulicates = duplicateDic
37  Set dic = Nothing
38  Set duplicateDic = Nothing
39  
40End Function
41Function getMaxRow(sht As Worksheet, targetCol As Long) As Long
42
43  getMaxRow = sht.Cells(sht.Rows.Count, targetCol).End(xlUp).Row
44
45End Function

データの最終行を取得するためにgetMaxRowを使用しています。

listDupulicatesプロシージャーはシートオブジェクトと重複データが存在する列を指定すると
重複データをDictionaryオブジェクトとして返します。

test_listDuplicatesを動かすと、重複データをSheet2のB列に書き出します。

 1Sub test_listDupulicates()
 2
 3  Dim sht As Worksheet
 4  Set sht = ThisWorkbook.Worksheets("Sheet2")
 5
 6  Dim duplicateDic As Dictionary
 7  Set duplicateDic = listDupulicates(sht, 1) 'Sheet2の1列目の重複データを取得します
 8
 9  Dim i As Long
10  For i = 0 To duplicateDic.Count - 1
11    'Sheet2の2列目に重複データを書き出します
12    sht.Cells(i + 1, 2) = duplicateDic.Keys(i)
13  Next i
14
15  Set duplicateDic = Nothing
16  Set sht = Nothing
17
18End Sub

重複データを削除する

VBAを使用せず、手っ取り早くシートから重複データを削除したいときは
Excelのデータタブにある重複の削除を使用することをおすすめします。

VBAを使用する場合はRangeオブジェクトのRemoveDuplicates メソッドを使用します。

Sheet2に都道府県のデータを入力しましたが、千葉県と奈良県が重複しています。
重複している千葉県と奈良県のデータを削除します。

シートから重複データを削除するコードです。

 1Option Explicit
 2Sub deleteDupulicates()
 3
 4  Dim sht As Worksheet
 5  Set sht = ThisWorkbook.Worksheets("Sheet2")
 6
 7  Dim lastRow As Long
 8  lastRow = getMaxRow(sht, 1) '1列目の最終行を取得します
 9
10  sht.Range("A1:A" & lastRow).RemoveDuplicates Columns:=Array(1), Header:=xlYes
11
12  Set sht = Nothing
13
14End Sub
15
16Function getMaxRow(sht As Worksheet, targetCol As Long) As Long
17
18  getMaxRow = sht.Cells(sht.Rows.Count, targetCol).End(xlUp).Row
19
20End Function

データの最終行を取得するためにgetMaxRowを使用しています。

deleteDuplicatesを実行すると、重複している千葉県と奈良県のデータが削除されます。

関連ページ