• ベストアンサー

エクセルで同一データの行を自動削除するツールを作成したい

VBA、マクロ初心者です。 たぶんマクロではできないと思うのですが、エクセルにて同一データを持つ行を自動検索して削除していきたいのです。どのように作ればよいのか教えてください。

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

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

VBA初心者で何故「出来る出来ない」の判断ができるのかがわかりません。 VBAで出来ないと思っているのに作り方を教えてくれってのも変な話ですね。 条件がサッパリわからないので下記のようなものしかできませんが。 A列に対してA列の値が重複している行を削除します。 重複している値の行で2回目以降に出てくる行を削除します。 Sub test() Dim i As Long, j As Long For j = 1 To Range("A65536").End(xlUp).Row For i = Range("A65536").End(xlUp).Row To j + 1 Step -1 If Cells(j, 1).Value = Cells(i, 1).Value Then Rows(i).Delete Shift:=xlUp End If Next i Next j End Sub

KKseguro
質問者

お礼

ありがとうございます。マクロとVBAって違うものだと思っていました。今、いただいたコード(プログラム?)をマクロ登録してみて実行してみたところ、私の知りたかった通りの動きをしてくれたようです。今から検証してみます。 わかりづらい質問だったのに、ありがとうございました。 これからもっと勉強します。

その他の回答 (5)

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

補足 Wendy02です。 後々、考えてみて、 #2 のマクロ Sub FilterOptionUsedMethod() × mySheet.Range("A1").CurrentRegion.ClearContents   ↓ mySheet.Range("A1").CurrentRegion.Clear こちらのほうがよいです。ClearContents ですと、書式が残ります。 なお、#5さんのおっしゃっているのは、この上記のマクロのことです。

KKseguro
質問者

お礼

この一行が、Rich53さんの教えてくださった、フィルタをかけることと同じ意味を持つのですか! Wendy02さんの教えてくださったプロフラム行、一行ずつ理解していこうと思っています。時間がかかると思いますが、自分なりの答えを出したらこちらでコードを発表できたら、と思います。 質問としてはここでしめさせていただきます。ありがとうございました。

noname#95859
noname#95859
回答No.5

間違っていたらごめんなさい。 フィルタ機能をつかいます。 該当の列を選択します。 Data/Filter/Advanced Filter (すいません。英語版使っています) 開いたウィンドウで、左下のUnique record onlyにチェックマークをいれます。 OKを押します。 結果は、重複行がHideされますので、 全セルを選択、CtrlーCでコピー新しいワークシートに移動して、Ctrl-Vでペースト(この時、Hideされている 行まで、コピーされるようであれば、なにがしかの設定が必要) 一番楽な方法だと思います。

KKseguro
質問者

お礼

ありがとうございます。フィルタ利用も考えたのですが、コピーして別ワークシートに移動する方法があったんですね。 コピーすると隠れているセルもコピーされてしまうものと思いこんでいました。 しかしながら、ずぼらなわたくしは、一つのマクロを動かすだけで、大量データの中からほしいデータ行を残すやり方を模索していました。 一つ勉強になりました。今後もよろしくお願いいたします。

  • KenKen_SP
  • ベストアンサー率62% (785/1258)
回答No.4

こんにちは。KenKen_SP です。 >同一データを持つ行を自動検索して削除していきたいのです。 「同一データを持つ行」という意味はA列など特定の列内で重複する 行を調べるとの意味ですか? それとも ワークシート内のA~IV列、つまり全ての列で重複する行を調べるの 意味でしょうか? それにより、コードが変わってきます。

KKseguro
質問者

お礼

はい、特定の列の中で同じデータをもったものを拾い出し、重複分の行を削除する、ということをやりたいのです。 もうすこし、自分のやりたいことをまとめて質問できるように勉強しますね。でも本当に、私のわかりづらい質問に反応してくださる方がたくさんいらっしゃって、感謝しています。ありがとうございました。

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

こんにちは。 Wendy02です。 >マクロとVBAって違うものだと思っていました。 正確にいうと、マクロとプロシージャという分け方をします。 マクロというのは、Office では、マクロの記録機能を使ったもので、標準モジュールに作成されたものは、全てマクロになります。マクロには、また引数がありません。 「新しいマクロの記録」では、どうしても出来ないことがあります。また、「新しい記録マクロの記録」で、記録した時は出来たのに、それをマクロでやってみると、出来ないものもあります。 なるべく、良い本を手に入れられて、基礎から始め、それから勉強されると良いかと思います。なお、私自身は、VBAは、Webサイトでは覚えませんでしたが、今は、みなさんのご質問を通して、VBAの実践の勉強をしています。ある意味では、漠然として、量的なものがない、ご質問が一番むつかしいです。 参考書籍:日本VBA協会 http://www.vbaa.jp/training/books.htm

KKseguro
質問者

お礼

参考書籍のページ添付ありがとうございました。仕事をしていて、もっと使いやすくするためにVBAの勉強をしたいと日々思いつつ流された生活をしていました! ここに投稿したのを機に、勉強を始めようと思います。次に質問をするときには「おっ、わかってきたな」と思ってもらえるようがんばるぞ。

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

こんにちは。 VBAとマクロ: >たぶんマクロではできないと思うのですが、エクセルにて同一データを持つ行を自動検索して削除していきたいのです。 おっしゃるように、「自動」という意味によっては、厳密な意味で言えば、マクロでは出来ないかもしれません。マクロというのは、ひとつのパッケージになっているわけですから、私たち、Excelユーザーの多くは、マクロでないものも、マクロと呼んでいるわけで、本来、引数を取るものはマクロとは呼びません。 ただ、今の段階では、マクロから始めないと、ラチが開かないように思います。それで、データ量によってコードが決まりますが、作ってみましたが、大量の範囲の場合は、思った以上に、そういう方法に決定するまで試行錯誤してしまいました。 少量の場合。 Sub DoubleDataFindDelete() Dim c As Range Dim DeleteRng As Range Dim myRng As Range Set myRng = Range("A1", Range("A65536").End(xlUp)) Application.ScreenUpdating = False For Each c In myRng  If Not IsEmpty(c) Then    If WorksheetFunction.CountIf(Range("A1", c), c) > 1 Then     If DeleteRng Is Nothing Then      Set DeleteRng = c     Else      Set DeleteRng = Union(DeleteRng, c)     End If    End If  End If Next c  If Not DeleteRng Is Nothing Then    DeleteRng.Delete  End If Application.ScreenUpdating = True  Set DeleteRng = Nothing  Set myRng = Nothing End Sub '-------------------------------------------- '大量の場合 今回は、25000行で調べました。 '1行目のタイトル行は必要です。 '<標準モジュールのみ> Sub FilterOptionUsedMethod()   Dim myRng As Range   Dim mySheet As Worksheet   Set mySheet = ActiveSheet     Application.ScreenUpdating = False     'A列によって重複を探す   Set myRng = mySheet.Range("A1", Range("A65536").End(xlUp))     myRng.AdvancedFilter Action:=xlFilterInPlace, Unique:=True   With mySheet.Range("A1", Range("A1").End(xlDown)).SpecialCells(xlCellTypeVisible)    .EntireRow.Copy   End With   With Worksheets.Add(After:=Sheets(Worksheets.Count))    .Range("A1").PasteSpecial    mySheet.ShowAllData    mySheet.Range("A1").CurrentRegion.ClearContents    .Range("A1").CurrentRegion.Copy    mySheet.Range("A1").PasteSpecial    Application.DisplayAlerts = False    .Delete    Application.DisplayAlerts = True   End With   Application.ScreenUpdating = True   Application.Goto mySheet.Range("A1")   Set myRng = Nothing: Set mySheet = Nothing End Sub

KKseguro
質問者

お礼

わかりづらい質問なのに、こんな短時間で考えて頂いてありがとうございました。 少量データの方のコードでは、だぶっているデータ行を検索することができました。 「新しいマクロの記録」という登録方法ではどうやってもできなかったので、VBAというプログラムを使用しないとだめなんだろうな・・・と思っているだけで、とっかかりがなんともわからず、こちらで相談してみてよかったです。 VBAでどんなことができるのか、おふたかたの例題を糧にさせていただき、これから勉強していきたいと思います。ありがとうございました。

関連するQ&A

専門家に質問してみよう