顧客リストや商品マスターなどで、同じデータが複数行にわたって重複して登録されている場合、これらを整理してユニークなリストを作成したいことがあります。
Excelの「重複の削除」機能は強力ですが、VBAを使えばこの処理をマクロに組み込めます。この記事では、データを一度並べ替えてから、ループ処理で重複行を削除していくという、古典的で確実なアルゴリズムを解説します。また、最後にはよりモダンでシンプルな方法も紹介します。
処理の基本ロジック
この方法の処理は、大きく分けて2つのステップで構成されます。
- 並べ替え(ソート): まず、重複をチェックしたいキーとなる列(例:氏名や商品コードの列)を基準に、データ範囲全体を並べ替えます。これにより、同じ値を持つ行が隣り合わせに集まります。
- 後ろからループして比較・削除: 次に、リストの最終行から先頭行に向かってループ処理を行います。現在の行の値と、一つ上の行の値を比較し、もし同じであれば現在の行を削除します。
行の削除は、必ず「後ろから」ループするのが鉄則です。これにより、行を削除しても、これからチェックする行のインデックス番号がずれるのを防げます。
完成したVBAコード
Sub DeleteDuplicateRowsByLooping()
' 変数を宣言します
Dim dataArea As Range
Dim keyColumn As Range
Dim i As Long
'--- 設定 ---
' 処理対象のデータ範囲(A1セルを含む表全体)
Set dataArea = ActiveSheet.Range("A1").CurrentRegion
' 重複をチェックする基準となる列(範囲の1列目)
Set keyColumn = dataArea.Columns(1)
'--- 設定ここまで ---
Application.ScreenUpdating = False
'--- 1. 基準列をキーとして、データ範囲全体を並べ替え ---
dataArea.Sort Key1:=keyColumn, Order1:=xlAscending, Header:=xlYes
'--- 2. 最終行から先頭行に向かってループ ---
For i = dataArea.Rows.Count To 2 Step -1
' 現在の行の値と、1つ上の行の値を比較
' Columns(1)で基準列のセルを特定
If dataArea.Cells(i, 1).Value = dataArea.Cells(i - 1, 1).Value Then
' 同じであれば、現在の行全体を削除
dataArea.Rows(i).EntireRow.Delete
End If
Next i
Application.ScreenUpdating = True
MsgBox "重複行の削除が完了しました。"
End Sub
コードのポイント解説
① .Sort
メソッドによる並べ替え
dataArea.Sort Key1:=keyColumn, Order1:=xlAscending, Header:=xlYes
Range
オブジェクトの.Sort
メソッドを使い、データ全体を並べ替えます。
Key1
: 並べ替えの基準となるキーを指定します。Order1
:xlAscending
(昇順)かxlDescending
(降順)かを指定します。Header
:xlYes
とすると、範囲の1行目を見出しとして認識し、並べ替えの対象外とします。
② 後ろからのループと比較・削除
For i = dataArea.Rows.Count To 2 Step -1
If dataArea.Cells(i, 1).Value = dataArea.Cells(i - 1, 1).Value Then
dataArea.Rows(i).EntireRow.Delete
End If
Next i
For i = 最終行 To 2 Step -1
という構文で、後ろからループします。If
文で、i
行目のセルの値と、その一つ上であるi-1
行目のセルの値を比較します。値が同じ(=重複している)場合は、i
行目全体(.EntireRow
)を削除(.Delete
)します。
【推奨】もっと簡単な方法: .RemoveDuplicates
メソッド
実は、最新のExcel VBAには、この一連の処理を一行で実行できる、非常に強力なメソッドが用意されています。
Sub DeleteDuplicates_EasyWay()
Dim dataArea As Range
Set dataArea = ActiveSheet.Range("A1").CurrentRegion
' 1列目を基準に重複を削除(見出しあり)
dataArea.RemoveDuplicates Columns:=1, Header:=xlYes
MsgBox "重複行の削除が完了しました。(RemoveDuplicates)"
End Sub
.RemoveDuplicates
メソッドは、指定した列(Columns:=1
)の値が重複している行を、自動的に削除してくれます。コードが圧倒的にシンプルで、処理も高速なため、特別な理由がなければこちらの方法を使いましょう。
まとめ
方法 | 長所 | 短所 |
並べ替えとループ | VBAの基本的な処理の組み合わせで、アルゴリズムの学習になる。 | コードが長くなり、処理速度もやや遅い。 |
.RemoveDuplicates | コードが1行で済む。高速で確実。 | 特になし。 |
VBAで重複行を削除する場合、.RemoveDuplicates
メソッドの存在を知っているかどうかが、コードの質を大きく左右します。古い手法である「並べ替えとループ」はアルゴリズムの理解には役立ちますが、実務では迷わず.RemoveDuplicates
メソッドを活用することをお勧めします。