- ベストアンサー
Excelのダブりをチェックし、削除するマクロ
ExcelのA列に半角英数字のIDが入っています。 このA列のIDにダブりがあるかどうかをチェックし、 ダブりがあった場合にダブりがなくなるように削除するマクロを作成したのですが どのようにマクロを作成すればよいかわからず手詰まっております。 なお「0001」と「1」は別のIDとして処理をしたいです。 大文字小文字は区別しません。 ※できれば関数にしたいのですが、関数では削除ができないと思いましたので マクロで実現できればと思っています。 ぜひ教えていただければと思います。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
マクロを作成する必要はありません。 https://www.microsoft.com/ja-jp/atlife/tips/archive/office/tips/002.aspx マクロと言うよりはVBAで記述したいならば、単純にA列の値を一つ一つ比較して重複していたらその行を削除すれば良いです。
その他の回答 (2)
- Prome_Lin
- ベストアンサー率42% (201/470)
極めて、鈍くさいマクロで申し訳ございません。 1万行ほどのデータで確認しましたが、私のマシンで、2分ほどかかりました。 本来は、「Find()」を使うべきなのでしょうけど、「Find()」を使った場合、例えば「AB1」というのが、何回出てくるか分からず、それを「Do Until f Is Nothing~Loop」や「For Each~Next」で繰り返す方法がうまくゆきませんでした。 以下のマクロは、極めて単純に1個目の文字列を「s」に入れ、それを、2行目から最後まで探す、という単純なものです。 その際、「UCase()」を使って、すべて大文字にしています。 見つかった行を削除し・・・、と、あとはこれの繰り返しですが、行はだんだん減ってゆくわけですから、「s」に何も入らないときが必ずやってきます。 そのときは、「For Next」を抜け出して、終了(「Finished!」というメッセージを出力)します。 Option Explicit Sub Test() Dim i, j, r As Long Dim s As String r = Range("A1").End(xlDown).Row For i = 1 To r - 1 s = Cells(i, 1).Value If s = "" Then Exit For End If For j = i + 1 To r If UCase(s) = UCase(Cells(j, 1).Value) Then Rows(j).Delete End If Next j Next i MsgBox ("Finished!") End Sub
お礼
回答ありがとうございます。 ご教示いただいた手順で稼働が確認できました。 2万行までテストいただいたので、大変恐縮です! 実際には500行ぐらいなので非常に助かります!ありがとうございました!
- imogasi
- ベストアンサー率27% (4737/17069)
直ぐ関数やマクロが頭にくるらしいが、下記の操作ではどうか。やってみたか。 データー重複の削除ー(列の指定) ーー もし知っているなら、質問にそれをやっても、ここがニーズに合わないなどと注記して 質問したら。 2003以前のバージョンではこの操作はなかったと思う以ので、(フィルタオプションの設定であったかも?)質問にはエクセルのバージョンを書け。 ーー VBAでやるなら (1)デ―タ全行の処理を繰り返す方法 (2)ソート法 (3)特別なエクセルの操作があればそれを使い、マクロの記録を取る。 などがある。 (2)は(A)元データの行に連番を振り、(B)データをソートして(C)ID列を 直前の行と比較して、同じなら行削除(D)元データの連番列でソート(その列も削除) のようなもの。 ーー こういうロジックを自分で考えられるように、日ごろから頭の訓練をしておかないと、仕事などでは、VBAは使えない。1週間も掛けて質問して回答を修正などやってられないだろう。 仕事がらみなら、(文系的な)金額や、数などを扱うものなら、AccessVBAの方が適しているだろう。 エクセル<ー>アクセスのデータ相互移動はやりやすいですから。 また数種の回答の、それぞれの良さも判別する力も必要なはず。
お礼
ご指摘ありがとうございます。 次からはExcelのバージョンなども記載するようにいたします。 頭の訓練を心がけます。
お礼
まさか標準機能であるとは……目から鱗でした。 非常にためになりました。ありがとうございます!