- ベストアンサー
エクセルで同一データの行を自動削除するツールを作成したい
VBA、マクロ初心者です。 たぶんマクロではできないと思うのですが、エクセルにて同一データを持つ行を自動検索して削除していきたいのです。どのように作ればよいのか教えてください。
- みんなの回答 (6)
- 専門家の回答
質問者が選んだベストアンサー
- ベストアンサー
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
その他の回答 (5)
- Wendy02
- ベストアンサー率57% (3570/6232)
補足 Wendy02です。 後々、考えてみて、 #2 のマクロ Sub FilterOptionUsedMethod() × mySheet.Range("A1").CurrentRegion.ClearContents ↓ mySheet.Range("A1").CurrentRegion.Clear こちらのほうがよいです。ClearContents ですと、書式が残ります。 なお、#5さんのおっしゃっているのは、この上記のマクロのことです。
お礼
この一行が、Rich53さんの教えてくださった、フィルタをかけることと同じ意味を持つのですか! Wendy02さんの教えてくださったプロフラム行、一行ずつ理解していこうと思っています。時間がかかると思いますが、自分なりの答えを出したらこちらでコードを発表できたら、と思います。 質問としてはここでしめさせていただきます。ありがとうございました。
間違っていたらごめんなさい。 フィルタ機能をつかいます。 該当の列を選択します。 Data/Filter/Advanced Filter (すいません。英語版使っています) 開いたウィンドウで、左下のUnique record onlyにチェックマークをいれます。 OKを押します。 結果は、重複行がHideされますので、 全セルを選択、CtrlーCでコピー新しいワークシートに移動して、Ctrl-Vでペースト(この時、Hideされている 行まで、コピーされるようであれば、なにがしかの設定が必要) 一番楽な方法だと思います。
お礼
ありがとうございます。フィルタ利用も考えたのですが、コピーして別ワークシートに移動する方法があったんですね。 コピーすると隠れているセルもコピーされてしまうものと思いこんでいました。 しかしながら、ずぼらなわたくしは、一つのマクロを動かすだけで、大量データの中からほしいデータ行を残すやり方を模索していました。 一つ勉強になりました。今後もよろしくお願いいたします。
- KenKen_SP
- ベストアンサー率62% (785/1258)
こんにちは。KenKen_SP です。 >同一データを持つ行を自動検索して削除していきたいのです。 「同一データを持つ行」という意味はA列など特定の列内で重複する 行を調べるとの意味ですか? それとも ワークシート内のA~IV列、つまり全ての列で重複する行を調べるの 意味でしょうか? それにより、コードが変わってきます。
お礼
はい、特定の列の中で同じデータをもったものを拾い出し、重複分の行を削除する、ということをやりたいのです。 もうすこし、自分のやりたいことをまとめて質問できるように勉強しますね。でも本当に、私のわかりづらい質問に反応してくださる方がたくさんいらっしゃって、感謝しています。ありがとうございました。
- Wendy02
- ベストアンサー率57% (3570/6232)
こんにちは。 Wendy02です。 >マクロとVBAって違うものだと思っていました。 正確にいうと、マクロとプロシージャという分け方をします。 マクロというのは、Office では、マクロの記録機能を使ったもので、標準モジュールに作成されたものは、全てマクロになります。マクロには、また引数がありません。 「新しいマクロの記録」では、どうしても出来ないことがあります。また、「新しい記録マクロの記録」で、記録した時は出来たのに、それをマクロでやってみると、出来ないものもあります。 なるべく、良い本を手に入れられて、基礎から始め、それから勉強されると良いかと思います。なお、私自身は、VBAは、Webサイトでは覚えませんでしたが、今は、みなさんのご質問を通して、VBAの実践の勉強をしています。ある意味では、漠然として、量的なものがない、ご質問が一番むつかしいです。 参考書籍:日本VBA協会 http://www.vbaa.jp/training/books.htm
お礼
参考書籍のページ添付ありがとうございました。仕事をしていて、もっと使いやすくするためにVBAの勉強をしたいと日々思いつつ流された生活をしていました! ここに投稿したのを機に、勉強を始めようと思います。次に質問をするときには「おっ、わかってきたな」と思ってもらえるようがんばるぞ。
- Wendy02
- ベストアンサー率57% (3570/6232)
こんにちは。 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
お礼
わかりづらい質問なのに、こんな短時間で考えて頂いてありがとうございました。 少量データの方のコードでは、だぶっているデータ行を検索することができました。 「新しいマクロの記録」という登録方法ではどうやってもできなかったので、VBAというプログラムを使用しないとだめなんだろうな・・・と思っているだけで、とっかかりがなんともわからず、こちらで相談してみてよかったです。 VBAでどんなことができるのか、おふたかたの例題を糧にさせていただき、これから勉強していきたいと思います。ありがとうございました。
お礼
ありがとうございます。マクロとVBAって違うものだと思っていました。今、いただいたコード(プログラム?)をマクロ登録してみて実行してみたところ、私の知りたかった通りの動きをしてくれたようです。今から検証してみます。 わかりづらい質問だったのに、ありがとうございました。 これからもっと勉強します。