• ベストアンサー

重複する行の削除の方法(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によって取得しております。 出来れば後学のために処理の簡単な説明も付けていただけると助かります。 宜しくお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
回答No.1

使い捨てマクロでよくやるけど。 読めばわかると思うけど。 わからないところがあったらさらに聞いていったほうが早いかな。 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

ferini
質問者

補足

回答ありがとうございます。 すみません、 If Cells(t, 1) = Cells(t-1,1) Then の部分で「アプリケーション定義またはオブジェクトのエラー」が出てしまいます。

その他の回答 (6)

  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.7

#3 です。 >Aのセルの要素が重複しているこのような場合に1つだけを残したい、 読み間違えました。私は、A, B, C をあわせてというようにしてしまいました。#3の回答は、撤回します。改めて書く必要もありません。「フィルタ・オプション」を使った、#6 さんので良かったのでした。

noname#95859
noname#95859
回答No.6

参考です。 本件は、VBAを持ち出す必要は全く無いと思います。 Advanced filter機能だけで済みます。 タイトルのセル「A」を選んで、CtrlShiftを押した状態で、下矢印を 押します。すると、最終行まで選択されます。 次に、メニュの「データ・フィルタ・フィルタオプションの設定」 を選び(エラーが出ても無視) 「重複するレコードは無視」にチェックマークを入れます。 「OK」を押すことで、重複行は、隠されます。 この状態で、全セルを選択して、コピー、新しいシートを選択して、 ペーストしてやれば、完了です。

ferini
質問者

お礼

すみません、VBAの形で必要だったのです。 回答してくださったみなさんありがとうございました。

回答No.5

おお、本当だ。 ごめんなさい。 1行目を t=2 にしないと駄目ですね。 あのIfのところは、セル(t,1)の値がセル(t-1,1)と同じときは、ってことなんですがtが1だと参照するセルがないのでそういうことになります。基本的なミス。ごめん。

  • zap35
  • ベストアンサー率44% (1383/3079)
回答No.4

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)
回答No.3

こんにちは。 それは、本当にマクロが必要なのですか? ちょっと見た限りでは、手動できる範囲ですね。 最初に、1行目を挿入します。 そして、D列にでも、D1 に、何でもよいのですが、仮に「統合」とします。 次に、 D2 の数式は、以下のようなものを作り、 =A2&","&B2&","&C2 D2 をコピーして、1万行まで選択(D2:D10000) として、同じ場所で、貼り付けしてしまいます。 それから、データ-フィル・タオプション ○指定した範囲 □重複するレコードは無視する 抽出範囲は、適当な場所に、セル1つを設定して、 「OK」で、 重複するレコードは削除されます。 後は、抽出したデータを、再び範囲を選択して、 データ-区切り位置-カンマやタブなどの・・・ で、「コンマ」の切り分けをします。 後は、元の場所に上書きすればよいです。 これをいくらマクロにしても、せいぜい、記録マクロ程度にしかならないのです。それ以外の方法もありますが、結局のところ、Rangeオブジェクトを取得しながらですから、1万ものデータになると遅いし、あまり利口ではないような気がします。

回答No.2

ここを参考に作成してみては? http://www.officetanaka.net/excel/vba/tips/tips14.htm

関連するQ&A

  • エクセルVBAでデータ最終行取得方法

    エクセルVBAでデータ最終行取得方法で良い方法を教えてください。 データの行数、列数は不定。 最多のデータ行の列も不定。 この条件で、データ最終行を取得するにはどうすればよいでしょうか? lastrow = ActiveSheet.Cells(ActiveSheet.Rows.Count, "A").End(xlUp).Row では、A列の最終行に限定されます。 lastrow = ActiveSheet.Cells(1, "A").SpecialCells(xlLastCell).Row では、列の限定はありませんが、一旦データ入力後、削除した部分まで入ってしまいます。 lastrow = ActiveSheet.UsedRange.Rows.Count では、データ入力後、削除した部分まで入ってしまい、かつ、1行目など上部が空白の場合、不正確になります。

  • 最終行/処理対象のデータまでを表すVBA

    こんばんは、データの最終行/処理する対象のセルまで処理する場合のVBAの記述について質問させてください!VBAの最終行/処理する対象のセルまで選択するために使用する記述方法が何種類かありますが、そのうち、書籍やネットで検索しても出てこない記述方法について今一つ理解ができていません(T_T) 本屋で売っている書籍やネットで検索すると出てくる記述方法 Range~.End(xlUp).Row Range~.CurrentRegion Range~.SpecialCells(xlLastCell) Range~.Cells(Rows.Count, 1).End(xlUp).Row 上記のようなVBAは書籍やネットで検索すると説明や違いについても出てくるので、説明を読めば理解ができるのですが、 Sheets("テスト").Range("A1:C" & Sheets("テスト").Cells _(1).CurrentRegion.Rows.Count) Range("A1").CurrentRegion.Cells(Range _("A1").CurrentRegion.Cells.Count).Row 上記のようなVBAについては検索しても説明など出てこないうえに、 なぜ上記のような記述になるのかあまり理解できていません(>_<) 書籍やネットで検索すると出てくる「Range~.CurrentRegion」などの記述方法から何となく、CurrentRegionやCells.Countを使わないといけないというのは理解できますが、なぜ「~CurrentRegion.Rows.Count)」はRowsがカッコの中に入っていて、「~CurrentRegion.Cells.Count).Row」はカッコの外に出ているのか??といった細かいことが分からずにいます。。。 半ば丸暗記のようにして使ってしまっているのですが、もし上記のようなVBAについてわかるかたがいらっしゃれば、ご教授いただけるととても嬉しいです! また、上記以外にもまだ検索しても出てこないようなVBAがあるのでしょうか?? 頭が混乱しそうです!(゜Д゜;)

  • EXCEL VBAの重複行削除について

    EXCEL2010を使用しています。 添付画像の「重複行削除 前」の表を、RemoveDuplicatesで下の様にコードを組んで A列で重複する行を見て重複する行を削除しています。 Public Sub 重複行削除()  With WorkSheets(1)   .Range(.Cells(1, 1), .Cells(8, 3)).RemoveDuplicates _      Columns:=1, Header:=xlYes  End With End Sub すると、日付の新しいデータが削除され、古いデータが残ってしまいます。 (添付画像の「重複行削除 後」) ReniveDuplicates Columns:=Array(1,3) とした場合は、すべてのデータが残ってしまいます。 添付画像の「欲しいデータ」の表の様に、 日付の新しいものを残すように重複行削除は出来ないでしょうか? 詳しい方、どうか教えてください。 よろしくお願いします。

  • ExcelVBAで最終行を誤認する問題の回避方法

    いつもお世話になります。 ActiveSheet.Cells.SpecialCells(xlLastCell).Rowなどのコードで 最終行を取得しようとするとき、縦スクロールバーを下端まで下げた 時に空行を表示してしまうなどをすると正しく取得できなくなると いったことが起こります。現在では保存すれば修正されるみたい ですが、保存をせずに正しく取得できるようにするための方法は ありますでしょうか。 宜しくお願いいたします。

  • 重複行を完全削除するエクセルのマクロ

    Sub sakujyo() Dim i, ii As Long For i = 1 To Range("a65336").End(xlUp).Row For ii = Range("a65336").End(xlUp).Row To i + 1 Step -1 If Cells(i, 4).Value = Cells(ii, 4).Value _ And Cells(i, 13).Value = Cells(ii, 13).Value Then Delete Shift:=xlUp End If Next ii Next i End Sub マクロに関しては、素人でございます。 こちらのマクロを作ってみたのですがうまくいきません。 4列目と13列目の列が重複したときのみ重複した行をすべて削除させたいと思っております。どうぞお教えください。

  • Excel VBAで値が重複する行を削除する

    Excel2000を使っています。 シートAに数千件のデータがあります。 シートBのE列にある文字とシートAのD列の文字が重複する場合に、シートAの重複するセルがある行を削除する(且つできれば行のデータを抜き出すVBAを作ろうと考えています。 最近VBAの初心者本をやっと理解したところで、ちんぷんかんぷんとまではいかないけど、知恵熱がでました。 仕事なので自分でなんとかすべきかと思いますが、きっかけの調べ方がまずわからない。 どなたか、解かるきっかけだけでも与えて頂けないでしょうか。とくに、別シートの値と重複する値を探す場合に何をいれるかわかればきっと道は開けると思うんですが…。 初めての質問なので、質問内容が至らなかったらもうしわけありません。

  • エクセルまたはVBAで重複行を削除

    例えば、 A B 1 1 a 2 2 b 3 3 c 4 4 d 5 4 d 6 5 e 7 6 g 8 6 g といった表があるとします。 A列をキーに、昇順にされた一覧表です。 ここで番号が重複している行、この例では4行目と5行目、7行目と8行目がそうです。 こういった重複した行を検索して、行削除したいのですがどんな方法が可能でしょうか? 最終的にはVBAでのイベントになるでしょうが、それ以前にエクセルで前準備などしておくようなことは必要でしょうか? 表自体はかなり膨大な量のデータベースです。 よろしくお願いします。

  • 【Excel VBA】重複行の削除

    はじめまして。 IDの重複を削除し、日付データを横1列にまとめるVBAについてご教示いただけますと幸いです。 ------------------------------------------------------- ▼シート1(データ入力がされているシート)    A   B   C   D   E   F    1   ID 日付 2  1234  1/1  1/6  1/10  1/20   3  1234  2/3  2/20 4  1234  3/2 5  7777  1/10  1/15  1/20 6  7777  2/2   2/12  2/22 7  9876  2/3 ⇓ マクロ起動後 ▼シート2(重複行を削除しまとめたシート)    A   B   C   D   E   F   G   H 1   ID 日付 2  1234  1/1  1/6  1/10  1/20  2/3  2/20  3/2 3  7777  1/10  1/15  1/20  2/2  2/12  2/22 4  9876  2/3 【補足】 列情報  ・A列…ID  ・B-F列…日付(左詰め) ※日付はIDごと月毎に行が変わるため、IDによって複数行存在する場合があります。 ※A列のIDは重複しない場合もあれば、4行以上ある場合があります。 ※シート1のデータはおおよそ1000-5000行です。 ※IDに対して、日付は5つあれば問題ありません。そのためG列以降の日付を削除しても支障はございません。 ------------------------------------------------------ VBAの知識があまりなく、調べて出てきたものをコピペ使用も試みたのですが、 上手く動かす事ができませんでした…。 お力添え頂けますと幸いです…。 Windows10でエクセル2016を使用しております。 何卒宜しくお願いいたします。

  • 重複行を完全削除するエクセルのマクロ

    Sub sakujyo() Dim i, ii As Long For i = 1 To Range("a65336").End(xlUp).Row For ii = Range("a65336").End(xlUp).Row To i + 1 Step -1 If Cells(i, 2).Value = Cells(ii, 2).Value _ And Cells(i, 4).Value = Cells(ii, 4).Value _ And Cells(i, 5).Value = Cells(ii, 5).Value Then Dim iii As Byte iii = 1 Rows(ii).Delete Shift:=xlUp End If Next ii If iii = 1 Then Rows(i).Delete Shift:=xlUp iii = 0 Next i End Sub データーが下の表のように入っております。     A    B    C    E    F 1  1/26  a1234  fdsa  5000  C1 2  1/27  a4567  sdfa  4000  T2 3  1/28  a1234  dfsa  5000  C1 4  1/30  b4567  asdf  6600  A2 5  2/10  b4567  fsda  6600  A2 6  2/10  a1234  afds  5000  C1 B列、E列、F列が完全一致(重複1行目と3行目と6行目・4行目と5行目)で削除し結果的に2行目だけ残る方法がしたいのですが、このマクロですと少ないデータですとうまく動くのですが、『大量のデータを一気に削除出来ない』、『同じ重複が3つ以上のデータが多数ある場合データが削除されずに残ってしまう』エラーが出てしまいます。どうかお教えください。

  • excelVBA 行の範囲指定についてです。

    excel2007のVBAの質問です。 1行目から文字入力がされている行までを範囲指定したいのですが、 For i = 1 To ActiveSheet.Cells.SpecialCells(xlCellTypeLastCell).Row このように入力すると、数式が入力されている行まで指定されてしまいます。 あくまでも 「文字入力がされているところまで」を指定したい場合 どのようにVBAを作成したらよいのでしょうか? よろしくお願いします!

専門家に質問してみよう