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 比較文字列(処理行) | 動的配列の変数再宣言を実行 |
(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
以上になります。
ここまで、見ていただきありがとうございました。
また是非遊びにきてください。では😀
ディスカッション
コメント一覧
まだ、コメントがありません