- ベストアンサー
重複する行の削除の方法(VBA)
エクセルのVBAで質問です。 以下のような表で、 A B C 1 赤 10 × 2 青 20 ○ 3 青 20 ○ 4 黄 30 × 5 緑 10 ○ 6 紫 15 △ 7 紫 15 △ 8 紫 15 △ Aのセルの要素が重複しているこのような場合に1つだけを残したい、 つまり3行目と7.8行目を削除したいのです。 (実際の列数は10、行数は1万程度あります) このような場合、どのようなマクロを組めばいいでしょうか? なお、最終行の場所は lngMaxRow = Cells.SpecialCells(xlLastCell).Rowによって取得しております。 出来れば後学のために処理の簡単な説明も付けていただけると助かります。 宜しくお願いします。
- みんなの回答 (7)
- 専門家の回答
質問者が選んだベストアンサー
使い捨てマクロでよくやるけど。 読めばわかると思うけど。 わからないところがあったらさらに聞いていったほうが早いかな。 t = 1 Do Until t = IngMaxRow If Cells(t, 1) = Cells(t-1,1) Then Rows(t).Select Application.CutCopyMode = False Selection.Delete Shift:=xlUp t = t - 1 End If t = t + 1 Loop
その他の回答 (6)
- Wendy02
- ベストアンサー率57% (3570/6232)
#3 です。 >Aのセルの要素が重複しているこのような場合に1つだけを残したい、 読み間違えました。私は、A, B, C をあわせてというようにしてしまいました。#3の回答は、撤回します。改めて書く必要もありません。「フィルタ・オプション」を使った、#6 さんので良かったのでした。
参考です。 本件は、VBAを持ち出す必要は全く無いと思います。 Advanced filter機能だけで済みます。 タイトルのセル「A」を選んで、CtrlShiftを押した状態で、下矢印を 押します。すると、最終行まで選択されます。 次に、メニュの「データ・フィルタ・フィルタオプションの設定」 を選び(エラーが出ても無視) 「重複するレコードは無視」にチェックマークを入れます。 「OK」を押すことで、重複行は、隠されます。 この状態で、全セルを選択して、コピー、新しいシートを選択して、 ペーストしてやれば、完了です。
お礼
すみません、VBAの形で必要だったのです。 回答してくださったみなさんありがとうございました。
- finneganswake
- ベストアンサー率23% (194/809)
おお、本当だ。 ごめんなさい。 1行目を t=2 にしないと駄目ですね。 あのIfのところは、セル(t,1)の値がセル(t-1,1)と同じときは、ってことなんですがtが1だと参照するセルがないのでそういうことになります。基本的なミス。ごめん。
- zap35
- ベストアンサー率44% (1383/3079)
Sub Macro2() Dim idx As Long For idx = Range("A65536").End(xlUp).Row To 1 Step -1 If Application.CountIf(Range(Range("A1"), _ Range("A65536").End(xlUp)), Cells(idx, 1)) > 1 Then Cells(idx, 1).EntireRow.Delete '行削除 End If Next idx End Sub 最終行から上に向かって、COUNTIF関数でA列に同じ値があるか調べて結果が1より大きければ重複です。簡単にするならCOOUNTIF関数の記述は CountIf(Range("A1:A10000",Cells(idx,1))) にしてもよいです。 でもシート上にCOUNTIF関数で重複数を表示して、オートフィルタで絞り込んで削除する方がよほど簡単ではないでしょうか
- Wendy02
- ベストアンサー率57% (3570/6232)
こんにちは。 それは、本当にマクロが必要なのですか? ちょっと見た限りでは、手動できる範囲ですね。 最初に、1行目を挿入します。 そして、D列にでも、D1 に、何でもよいのですが、仮に「統合」とします。 次に、 D2 の数式は、以下のようなものを作り、 =A2&","&B2&","&C2 D2 をコピーして、1万行まで選択(D2:D10000) として、同じ場所で、貼り付けしてしまいます。 それから、データ-フィル・タオプション ○指定した範囲 □重複するレコードは無視する 抽出範囲は、適当な場所に、セル1つを設定して、 「OK」で、 重複するレコードは削除されます。 後は、抽出したデータを、再び範囲を選択して、 データ-区切り位置-カンマやタブなどの・・・ で、「コンマ」の切り分けをします。 後は、元の場所に上書きすればよいです。 これをいくらマクロにしても、せいぜい、記録マクロ程度にしかならないのです。それ以外の方法もありますが、結局のところ、Rangeオブジェクトを取得しながらですから、1万ものデータになると遅いし、あまり利口ではないような気がします。
- kazuhisa01
- ベストアンサー率32% (158/487)
ここを参考に作成してみては? http://www.officetanaka.net/excel/vba/tips/tips14.htm
補足
回答ありがとうございます。 すみません、 If Cells(t, 1) = Cells(t-1,1) Then の部分で「アプリケーション定義またはオブジェクトのエラー」が出てしまいます。