- ベストアンサー
エクセル2003 重複データの抽出
エクセル2003を使っています。 重複したデータの抽出を行いたいのですが、 例えば、 A B C D コード 書籍名 出版社名 著者 といった感じのデータが1万件ほどあります。 このうち、B列の「書籍名」が重複しているデータを抽出したい です。(抽出したものは、書籍名だけではなくて、ほかの出版社や著者の指定したデータも表示させたい。) VLOOKUPなどを使えばできないこともないのですが、一万件の 処理を行う上に、パソコンも非力なので時間がかかってしまい 困っています。 どうぞよろしくお願いします。
- みんなの回答 (7)
- 専門家の回答
質問者が選んだベストアンサー
なさりたい内容はほぼ分かりました。 ただVLOOKUPなどの関数を使用しても重複が2つまでとは限らないようですから一行で他の重複データを表示するのは難しいような気がします。 そこで次のような方法はどうでしょうか。 1.回答NO.2(誤りがありました。「各セルのセル番号」ではなくて「各行のB列のセル番号」が正しいです、また重複しない場合は1、重複する場合は2以上です)の方法でE列にフラグを立てる。 2.フラグが立っている行のデータのみをIF文でそれぞれ別の列に(A列→F列、B列→G列、C列→H列、D列→I列)にコピーするようにF列、G列、H列、I列に式を入れる。 3.F列~I列を別のシートに値だけコピーしてから書籍名でソートする。 こうすれば一覧性も良いのではと思いますが、手順が煩雑でしょうか?
その他の回答 (6)
- KuMa_bEaR
- ベストアンサー率38% (5/13)
便利なツールがあります。 1. http://www15.big.or.jp/~t98907/duplication/ ↑ このサイトからダウンロードして展開します。 2. duplication.exeをダブルクリックします。 3. エクセルのファイルをそのツールにドロップします。 4. ツールのテキストボックスに B と入力し、開始ボタンをクリックします。 5. 重複した行には○が付いています。オートフィルタでフィルタリングできます。
- merlionXX
- ベストアンサー率48% (1930/4007)
#4のmerlionXXです。 > ほかの社員も同じような作業を行いますので、 > エクセルに搭載してある機能や関数を使えれば、 VBAもエクセルに搭載してある機能なのですが・・・・。 お使いになるかどうかわかりませんが、一応少し修正し、saikoro123さんが修正もできるようにくわしく解説をつけてみました。(解説は'で区切ってあるのでこのままコピペしても大丈夫です。) オリジナルのデータはA1~D1がタイトル行でコード、書籍名、出版社名、著者の順で並ぶ。 2行目以降には切れ目無くデータが並ぶという前提です。 これを書籍名で重複するデータの書籍名、出版社名、著者をE~G列に転記します。 Sub test02() Dim x As Long 'xは桁数の多い整数であると宣言 With ActiveSheet 'アクティブなシートにおいて .AutoFilterMode = False 'オートフィルーがあれば解除 x = .Cells(Rows.Count, "B").End(xlUp).Row 'B列のデータの最終行を取得しxとする。 .Range(.Cells(2, "E"), .Cells(x, "E")).FormulaR1C1 = "=COUNTIF(R2C2:R" & x & "C[-3],RC[-3])" 'E列2行目から最終行までCOUNTIF式を挿入 .Range("A1:E1").AutoFilter 'オートフィルー設定 .Range("A1:E1").AutoFilter Field:=5, Criteria1:=">1" '重複書籍名の行を抽出 .Range("B1:D" & x).SpecialCells(xlCellTypeVisible).Copy '重複書籍名の行のB~D行をコピー .AutoFilterMode = False 'オートフィルー解除 .Range("F1").PasteSpecial 'コピーしたデータをF1~H1以降に貼り付け Application.CutCopyMode = False 'コピーモード終了 .Range(.Range("F1:H1"), .Range("F1:H1").End(xlDown)).Sort Key1:=Range("F2"), _ Order1:=xlAscending, Key2:=Range("G2"), _ Order2:=xlAscending, Header:=xlYes '貼り付けられたデータを書籍名で並び替え .Range("E1:E" & x).Delete Shift:=xlToLeft 'E列の式を削除しF~H列のデータを左に移す。 End With End Sub
お礼
>>VBAもエクセルに搭載してある機能なのですが… 私には少し敷居が高そうに感じたものですから・・・(^^;) GUIで出来る機能でもあればと思った次第です。 ご丁寧に解説までつけていただき、ありがとうございます。 コピペして使ってみたのですが、すごく・・・遅いんです・・・。 PCスペック等も関係あるのでしょうか? 今回は別の方法で対応させていただきました。 ありがとうございました!!
- ensan8
- ベストアンサー率45% (45/100)
>COUNTIFを使ってみたのですが、うまくいきませんでした・・・。 >この場合の式の意味は、セルB2に書籍名が入力されているとすると、 >「B列をセルB2の書籍名で検索して、同じものがあるなら >カウントする」 >といった意味でよろしいでしょうか? >一つしかないものに「2」のフラグが立ったりしています。 うまくいきませんか。テストで作った10行程度のデータでは動いたんですが、どこか違うのかも知れませんね。 おっしゃるとおり式の意味はE2に「=countif(B$1:B$10000,B2)」と入れますとB1からB10000までの範囲でB2と同じデータの数を数えるというものです。自分自身も数えますので重複するものが無くても必ず1はカウントされます。 ユニークな(同じものが他に無い)データが2にカウントされてしまう原因が分かりませんが、そこの行のE列の式をコピーしてコメント欄に貼り付けていただけませんか?何か分かるかもしれません。
お礼
返事が遅くなって申し訳ございません。 できました! 私が式をミスしてました・・・。 これで処理できそうです。ありがとうございました。
- merlionXX
- ベストアンサー率48% (1930/4007)
一万件もあるならVBAでやったほうがいいでしょう。 以下の手順をおためしください。 1.Altキー+F11キーでVisualBasicEditorを呼び出します。 2.メニューから挿入、標準モジュールで出てきたコードウィンド(右側の白い広い部分)に以下のコードをコピペします。 Sub test01() Dim x As Long With ActiveSheet .AutoFilterMode = False x = .Cells(Rows.Count, "B").End(xlUp).Row .Range(.Cells(2, "E"), .Cells(x, "E")).FormulaR1C1 = "=COUNTIF(R2C2:R" & x & "C[-3],RC[-3])" .Range("A1:E1").AutoFilter .Range("A1:E1").AutoFilter Field:=5, Criteria1:=">1", Operator:=xlAnd .Range("B1:D" & x).SpecialCells(xlCellTypeVisible).Copy .AutoFilterMode = False .Range("F1").PasteSpecial .Range("E1:E" & x).Delete Shift:=xlToLeft Application.CutCopyMode = False End With End Sub 3.Alt+F11キーでワークシートへもどります. 4.メニューから、ツール、マクロ、マクロで出てきたマクロ名(test01)を選択して実行 これでご要望のようになると思います。 ただし、これはやり直しが聞きませんので必ずオリジナルデータの控えをとってからやってくださいね。
お礼
お返事ありがとうございます。 VBAを使えばこのようなこともできるのですね。 関数もロクに使えない私にはすごいの一言です。 ただ、私だけではなく、ほかの社員も同じような作業を行いますので、 エクセルに搭載してある機能や関数を使えれば、説明もしやすいし、 データに変更があった場合も対応しやすいかな。思っています。 (VBAがまったくわからないので、データに変更があった場合、どこをどう書き換えればいいのかわかりません・・・)
- ensan8
- ベストアンサー率45% (45/100)
E列の各セルに「=countif(B1:B10000,各セルのセル番号)」という式を入れると重複しない場合は値が0、重複する書籍名がある場合は値が1以上になるますから、重複はこれで判定できます。 (抽出したものは、書籍名だけではなくて、ほかの出版社や著者の指定したデータも表示させたい。)というくだりはちょっと意味が取りかねるのですが。
補足
説明がわかりづらくてすみません。 質問の内容を例にとると、 「書籍名」を基準にして重複データを検索。 「重複した書籍名があれば、書籍名ならびにその出版社、著者をE列に表示させたい。」 ということです。 自分の説明力の無さが悲しい・・・。 よろしくお願いします。
- ww-_-ww
- ベストアンサー率51% (46/89)
ひとつ思ったんですけど、関数ではなく「オートフィルタ」では駄目なのですか?
お礼
お返事ありがとうございます。 オートフィルタでの抽出だと、抽出する条件を 入力しないといけないですよね? (それを言ったらVLOOKUPもなんですけど・・・) 「同じ書籍名が二つ以上あったら抽出」を行いたいです。
お礼
COUNTIFを使ってみたのですが、うまくいきませんでした・・・。 この場合の式の意味は、セルB2に書籍名が入力されているとすると、 「B列をセルB2の書籍名で検索して、同じものがあるなら カウントする」 といった意味でよろしいでしょうか? 一つしかないものに「2」のフラグが立ったりしています。