重要なお知らせ

「教えて! goo」は2025年9月17日(水)をもちまして、サービスを終了いたします。詳細はこちら>

電子書籍の厳選無料作品が豊富!

エクセル2003を使っています。

重複したデータの抽出を行いたいのですが、
例えば、

 A      B     C      D
コード  書籍名  出版社名  著者

といった感じのデータが1万件ほどあります。
このうち、B列の「書籍名」が重複しているデータを抽出したい
です。(抽出したものは、書籍名だけではなくて、ほかの出版社や著者の指定したデータも表示させたい。)

VLOOKUPなどを使えばできないこともないのですが、一万件の
処理を行う上に、パソコンも非力なので時間がかかってしまい
困っています。
どうぞよろしくお願いします。

A 回答 (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列を別のシートに値だけコピーしてから書籍名でソートする。

こうすれば一覧性も良いのではと思いますが、手順が煩雑でしょうか?
    • good
    • 0
この回答へのお礼

COUNTIFを使ってみたのですが、うまくいきませんでした・・・。
この場合の式の意味は、セルB2に書籍名が入力されているとすると、

「B列をセルB2の書籍名で検索して、同じものがあるなら
カウントする」

といった意味でよろしいでしょうか?
一つしかないものに「2」のフラグが立ったりしています。

お礼日時:2008/02/18 15:53

便利なツールがあります。



1. http://www15.big.or.jp/~t98907/duplication/

このサイトからダウンロードして展開します。

2. duplication.exeをダブルクリックします。
3. エクセルのファイルをそのツールにドロップします。
4. ツールのテキストボックスに B と入力し、開始ボタンをクリックします。
5. 重複した行には○が付いています。オートフィルタでフィルタリングできます。

参考URL:http://www15.big.or.jp/~t98907/duplication/
    • good
    • 0

#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
    • good
    • 0
この回答へのお礼

>>VBAもエクセルに搭載してある機能なのですが…

私には少し敷居が高そうに感じたものですから・・・(^^;)
GUIで出来る機能でもあればと思った次第です。

ご丁寧に解説までつけていただき、ありがとうございます。
コピペして使ってみたのですが、すごく・・・遅いんです・・・。
PCスペック等も関係あるのでしょうか?

今回は別の方法で対応させていただきました。
ありがとうございました!!

お礼日時:2008/02/25 10:06

>COUNTIFを使ってみたのですが、うまくいきませんでした・・・。


>この場合の式の意味は、セルB2に書籍名が入力されているとすると、
>「B列をセルB2の書籍名で検索して、同じものがあるなら
>カウントする」
>といった意味でよろしいでしょうか?
>一つしかないものに「2」のフラグが立ったりしています。

うまくいきませんか。テストで作った10行程度のデータでは動いたんですが、どこか違うのかも知れませんね。
おっしゃるとおり式の意味はE2に「=countif(B$1:B$10000,B2)」と入れますとB1からB10000までの範囲でB2と同じデータの数を数えるというものです。自分自身も数えますので重複するものが無くても必ず1はカウントされます。

ユニークな(同じものが他に無い)データが2にカウントされてしまう原因が分かりませんが、そこの行のE列の式をコピーしてコメント欄に貼り付けていただけませんか?何か分かるかもしれません。
    • good
    • 0
この回答へのお礼

返事が遅くなって申し訳ございません。
できました! 私が式をミスしてました・・・。

これで処理できそうです。ありがとうございました。

お礼日時:2008/02/25 10:01

一万件もあるなら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)を選択して実行

これでご要望のようになると思います。
ただし、これはやり直しが聞きませんので必ずオリジナルデータの控えをとってからやってくださいね。
    • good
    • 0
この回答へのお礼

お返事ありがとうございます。
VBAを使えばこのようなこともできるのですね。
関数もロクに使えない私にはすごいの一言です。

ただ、私だけではなく、ほかの社員も同じような作業を行いますので、
エクセルに搭載してある機能や関数を使えれば、説明もしやすいし、
データに変更があった場合も対応しやすいかな。思っています。
(VBAがまったくわからないので、データに変更があった場合、どこをどう書き換えればいいのかわかりません・・・)

お礼日時:2008/02/18 16:13

E列の各セルに「=countif(B1:B10000,各セルのセル番号)」という式を入れると重複しない場合は値が0、重複する書籍名がある場合は値が1以上になるますから、重複はこれで判定できます。



(抽出したものは、書籍名だけではなくて、ほかの出版社や著者の指定したデータも表示させたい。)というくだりはちょっと意味が取りかねるのですが。

この回答への補足

説明がわかりづらくてすみません。

質問の内容を例にとると、
「書籍名」を基準にして重複データを検索。
「重複した書籍名があれば、書籍名ならびにその出版社、著者をE列に表示させたい。」
ということです。

自分の説明力の無さが悲しい・・・。
よろしくお願いします。

補足日時:2008/02/18 14:07
    • good
    • 0

ひとつ思ったんですけど、関数ではなく「オートフィルタ」では駄目なのですか?

    • good
    • 0
この回答へのお礼

お返事ありがとうございます。
オートフィルタでの抽出だと、抽出する条件を
入力しないといけないですよね?
(それを言ったらVLOOKUPもなんですけど・・・)

「同じ書籍名が二つ以上あったら抽出」を行いたいです。

お礼日時:2008/02/18 13:50

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!