
下図のような名簿があるんだけど、
A列の支店が合計何店あるのか、B列の班が何班あるのか知りたい…。
VBA(マクロ)で重複行を削除することってできないの?


なるほど…。
では今回は、「VBA(マクロ)でエクセルの重複行を削除する方法」を
VBAマクロ歴3年の私が、できるだけわかりやすく解説いたします。
エクセルの重複行を削除する方法(VBAマクロ)
「RemoveDuplicates」を使います。
まずは実行見本をどうぞ。
実行見本
ひとまず全コードと実行結果をご覧ください。
解説は後ほど行います。
全コード
Sub 重複行を削除()
WorkSheets("Sheet1").Range("A1:C50").RemoveDuplicates Columns:=1
End Sub
実行結果

解説
※わかりやすさを重視しております。厳密には解釈が異なる場合がありますことをご了承ください。
プロシージャの作成
Sub 重複行を削除()
End Sub
プロシージャなど、マクロの基礎は下記記事でわかりやすく解説しております。
コードだけではなく、開発タブの表示からマクロの保存まで知りたい方はご参考ください。
重複行を削除
WorkSheets("Sheet1").Range("A1:C50").RemoveDuplicates Columns:=1
上記コードにて、重複行を削除することができます。
今回は「Sheet1」の「A列」を基準に重複行を削除しています。
【 WorkSheets(“対象のシート“).Range(“表の範囲“).RemoveDuplicates Columns:=基準にする列番号 】
まずは対象のシートを選択します(省略可)
今回はシート名で指定しましたが、シート番号やアクティブシートを指定することもできます。
下記記事をご参考ください。
次に「表の範囲」を指定します。
今回の表は「A1~C10」なので、「A1:C10」と指定するのがベストですが、
「A1:C50」のように多めに指定してもエラーは出ません。
最後に、基準にする列番号を指定します。
今回はA列の重複を削除したいので、A列に対応した「1」を指定しました。
(B列なら2という具合です)
これでA列の重複が削除され、「A支店」と「B支店」がそれぞれ1つだけ残ります。
マクロが完成したら、実行して動作を確認してみましょう。

エクセル内に作成した自作のボタンを押してマクロを実行させることも可能です。
ボタンの作り方は、下記記事でわかりやすく解説しております。
ショートカットキーを押すことでマクロを実行させることもできます。
下記記事をご参考ください。
下図が実行結果です。

重複行が削除され、A支店、B支店が1つずつ残りました。
「Columns:=2」としてB列の重複行を削除した場合は、下図のようになります。

応用例(重複削除)
ソートされていなくても成功する?
下図のように、キレイにソート(並び替え)されていない場合も、キチンと成功するのでしょうか?

A列の重複削除を実行してみます。

ソートされている時と同じように、「A支店」と「B支店」が1つずつ残りました。成功です。
タイトル行が無い場合

上図のようにタイトルが無い表もたまに見かけるかと思います。
この表を普通に処理してしまうと、一行目がタイトルと認識されて、うまくいかない場合があります。

タイトル行が無い場合は、「Header:=xlNo」を追加しましょう。
Sub 重複行を削除()
WorkSheets("Sheet1").Range("A1:C50").RemoveDuplicates Columns:=1, Header:=xlNo
End Sub
2行目の最後に「Header:=xlNo」を追加しました。
これで、タイトル行が無いとみなされ、一行目も重複削除の対象になります。

- Header:=xlNo:一行目も重複削除の対象になる(タイトル行が無い場合に使用)
- Header:=xlYes:一行目は重複削除の対象にならない(一行目はタイトル行とみなされる)
- Header:=xlGuess:エクセルが自動で判断(記述を省略した場合/デフォルト設定)
複数の列を基準に重複行を削除
まずは下図を見てください。

7行目と8行目が、A列・B列・C列ともに同じで、完全に重複していることがわかります。
この8行目だけ削除したいという時、ありますよね?
このように、複数にまたがる条件で重複行を削除することもできます。
下記のVBAコードを見てください。
Sub 複数の列を基準に重複行を削除()
Worksheets("Sheet1").Range("A1:C50").RemoveDuplicates Columns:=Array(1, 2, 3)
End Sub
2行目の最後に注目です。
「Columns:=」を「Array(1, 2, 3)」と指定しています。
これでA列~C列を基準に、重複行を削除するよう指定したことになります。
実行してみましょう。

完全に重複している8行目だけが削除されました。
うまく動作しないときの対処法
エラーが発生する
コンパイルエラー・実行時エラー
コードに問題がある場合が多いです。
「”」や()など、2つセットの記号が片方だけになっていないかなど、コードを再確認しましょう。
セル名を「”」で囲っていない場合でもエラーが発生します。
警告表示

上記の表示が出た場合は、マクロが無効になっています。
エクセルに表示された「コンテンツの有効化」をクリックするか、下記記事を参考にセキュリティ設定を変更してください。
最後に
VBAでエクセルの重複行を削除する方法を解説いたしました。
当ブログでは、VBAマクロやPythonなど、時間を生み出すプログラミング術を公開しております。
この記事がわかりやすいと感じた方は、他の記事も読んでいってください。
最後までお読みいただき、ありがとうございました。がんばってください!