Excel VBA 重複チェックを高速に行うマクロ【配列同士を比較すると圧倒的に速い!】

こんにちは、説也です。

この記事では、エクセルVBAマクロで、高速に重複チェックを行うマクロについて紹介しています。配列を使う方法ですが、非常に簡単なので是非見ていってください。🙂

完成イメージ

コード全容

Sub 高速重複チェック()
'*******************************************************************
'* 高速重複チェック                                               *
'*******************************************************************
'(1) マクロ実行中、描画オフ、カーソル描画オフ
 Application.ScreenUpdating = False
 Application.Cursor = xlWait
'
'+-----------------------------------------------------------------+
'+ 変数宣言                                                       +
'+-----------------------------------------------------------------+
'配列作成用
 Dim 処理行         As Long
 Dim 比較文字列()  As String
'
'配列比較用
 Dim 配列A処理行    As Long
 Dim 配列B処理行    As Long

'+-----------------------------------------------------------------+
'+ 初期設定                                                       +
'+-----------------------------------------------------------------+
 重複チェック列 = 3
 重複チェック開始行 = 7
 重複チェック終了行 = 24
 結果出力列 = 4
 シート名 = "シートA"

'===================================================================
'(2) 配列 作成                                                    +
'===================================================================
'初期処理
 処理行 = 重複チェック開始行
 
 Do Until 処理行 > 重複チェック終了行
    ReDim Preserve 比較文字列(処理行)
    比較文字列(処理行) = Worksheets(シート名).Cells(処理行, 重複チェック列)
    処理行 = 処理行 + 1
 Loop

'===================================================================
'(3) 重複確認                                                       +
'===================================================================
 配列A処理行 = 重複チェック開始行
 Do Until 配列A処理行 > 重複チェック終了行
    配列B処理行 = 配列A処理行 + 1
    Do Until 配列B処理行 > 重複チェック終了行
       If 比較文字列(配列A処理行) <> "" Then
          If 比較文字列(配列A処理行) = 比較文字列(配列B処理行) Then
             Worksheets(シート名).Cells(配列A処理行, 結果出力列).Interior.ColorIndex = 3
             Worksheets(シート名).Cells(配列A処理行, 結果出力列).Value = "重複"
             Worksheets(シート名).Cells(配列B処理行, 結果出力列).Interior.ColorIndex = 3
             Worksheets(シート名).Cells(配列B処理行, 結果出力列).Value = "重複"
          End If
       End If
     配列B処理行 = 配列B処理行 + 1
    Loop
  配列A処理行 = 配列A処理行 + 1
 Loop

'描画オン
 Application.ScreenUpdating = True
 Application.Cursor = xlDefault
End Sub

● 初期設定を変更することで、そのまま使用できます。下記を参考にコピーして使ってみてください👍

設定項目設定内容
シート名重複チェックデータがあるシート名を指定
重複チェック列重複チェックしたい列番号を指定
重複チェック開始行重複チェックをしたい最初の行を指定
重複チェック終了行重複チェックをしたい最終の行を指定
結果出力列チェックした結果を表示する列を指定

コード解説

(1)マクロ実行中、描画オフ、カーソル描画オフ

マクロ実行中、各種描画をオフにしています。

 Application.ScreenUpdating = False
 Application.Cursor = xlWait
コード内容
Application.ScreenUpdating画面更新のオン・オフ
Application.Cursorマウスカーソルの表示

(2) 配列データの作成

重複チェックをしたいデータを「比較文字列」という配列に全て格納します。

 処理行 = 重複チェック開始行 
 Do Until 処理行 > 重複チェック終了行
    ReDim Preserve 比較文字列(処理行)
    比較文字列(処理行) = Worksheets(シート名).Cells(処理行, 重複チェック列)
    処理行 = 処理行 + 1
 Loop

重複チェックの「開始行」から「終了行」までのデータを1件ずつ配列に格納する処理になります。

コード内容
ReDim Preserve 比較文字列(処理行)動的配列の変数再宣言を実行
配列の変数宣言を行う場合、通常最大件数を指定しますが、最大件数が変動する場合には、ReDimを使用し再宣言します。

(3) 重複確認

配列Aと配列Bの中身をひとつずつ比較し、同値があった場合に「重複」を設定します。
※ 値が入っていない場合は、重複チェックを行いません。

 配列A処理行 = 重複チェック開始行
 Do Until 配列A処理行 > 重複チェック終了行
    配列B処理行 = 配列A処理行 + 1
    Do Until 配列B処理行 > 重複チェック終了行
       If 比較文字列(配列A処理行) <> "" Then
          If 比較文字列(配列A処理行) = 比較文字列(配列B処理行) Then
             Worksheets(シート名).Cells(配列A処理行, 結果出力列).Interior.ColorIndex = 3
             Worksheets(シート名).Cells(配列A処理行, 結果出力列).Value = "重複"
             Worksheets(シート名).Cells(配列B処理行, 結果出力列).Interior.ColorIndex = 3
             Worksheets(シート名).Cells(配列B処理行, 結果出力列).Value = "重複"
          End If
       End If
     配列B処理行 = 配列B処理行 + 1
    Loop
  配列A処理行 = 配列A処理行 + 1
 Loop

以上になります。

ここまで、見ていただきありがとうございました。
また是非遊びにきてください。では😀