- ベストアンサー
任意の表から、重複するデータを抜き出すには??
- みんなの回答 (5)
- 専門家の回答
質問者が選んだベストアンサー
質問内容がいま一つわかりません。 元データの状態によって、最も効率的な方法が異なります(使用できる関数も異なります)ので補足説明をお願いします。 まずSheet1のデータですが「NO」と「名前」は1対1に対応している(どちらかのデータが決まればデータのセットが1つだけに固定されている)のでしょうか? また、同じNOや名前が別の行にも存在するのでしょうか? さらに図1には重複するデータが表示されていますが、もし、これが最初からわかっているなら、重複するデータは不備理由(VLOOKUP関数で表示できる)以外は抜き出す必要がないので、ご質問は重複しないデータだけ抜き出したいということですね。 #Officeソフトはバージョンによって使用できる機能や操作方法が大きく異なりますので、質問の際には必ずご使用のエクセルのバージョンを明記するようにしましょう。
その他の回答 (4)
- imogasi
- ベストアンサー率27% (4737/17069)
こういう表の組み換えは、VBAを使わないと、素直なロジックでは出来ない。いつも関数に非常に詳しい方が、 どうにか(しかしそこには一定のやり方・考え方が流れているはずだが)やれる式で回答が出ます。 これをコピペして出来ましたで良いとするか、質問者の考え方によると思う。 A表は元データだろうが Aと重複するデータはどのようにして、出てきた(出してきた)ものか。 突然出てきてよくわからない。これは普通A表からでは出ないはず。 ーー またA,B、Cは同列に又出現することがあるのか。初心者はこのことを書かないのでいつも考える上で、困る。無いものとする。 ーー 例データ Sheet1 元表 A2:B8 B列は後述の関数の結果 A 1 C 1 B 2 D 1 F 2 G 2 H 2 ーー 重複することがわかっているデータ 仮定でSheet1のF列におくものとする F2:F4 A C D ーー B列の式はB2に =IF(NOT(ISERROR(VLOOKUP(A2,$F$2:$F$4,1,FALSE))),1,2) 下方向に式複写。 F列に在れば1、見つから無ければ2をセット。作業列です。 ーーー C2に=IF(B2=1,MAX($C$1:C1)+1,"") 下方向に式を複写 D2に =IF(B2=2,MAX($D$1:D1)+1,"") 下方向に式を複写 ーー 結果の見た目は A2:D8 A 1 1 C 1 2 B 2 1 D 1 3 F 2 2 G 2 3 H 2 4 それぞれ条件に合う行に、連番を振ったことになります。 ーー Sheet2には、重複しない方のデータを出すとして Sheet2に行って A2に =INDEX(Sheet1!$A$2:$A$8,MATCH(ROW()-1,Sheet1!$D$2:$D$8,0)) 下方向に式を複写。 Sheet2の行番号と、Sheet1のD列の連番を関連付けて、データを 引っ張ってくるのがアイデア。ROW()-1が第2行目に連番1の行を持ってくるための 調節。 ーーー 以上imogasi方式の例。(Googleでimogasi方式で照会すれば、抜き出し問題の 過去回答の種々のタイプが出てくる) ーー A.上記のほかに、重複するものの表を出す B、キーとなる列以外のデータ列をあわせて出す C。式複写を多数行すると#N/Aがでるがそれを抑止する方法 は回答省略。この方式に興味があれば勉強して。 ーー 作業列を使うところが欠点だが、既出の複雑な式よりは理解しやすいだろうと思っているが。 こちらも判りにくいというかも。 関数ではこのタイプの問題は不適と思う。
- KURUMITO
- ベストアンサー率42% (1835/4283)
回答No2です。ごめんなさい。シート1のG2セルには次の式を入力して下方にオートフィルドラッグします。 =E2&F2 F1をF2に訂正
- KURUMITO
- ベストアンサー率42% (1835/4283)
A表がシート1に有るとしてA1セルにNO,B1セルに名前、C1セルに不満理由の項目名がそれぞれ入力されておりデータは2行目以降にあるとします。 また、抜き出したいデータ(重複データ)の表示はE1にNO,F1に名前の項目名が有り各データは2行目以降にあるとします。 そこで作業列を作って対応するのですがG2セルには次の式を入力して下方にオートフィルドラッグします。 =E2&F1 また、D列も作業列としてD2セルには次の式を入力して下方にオートフィルドラッグします。 =IF(OR(A2="",B2=""),"",IF(COUNTIF(G:G,A2&B2)>0,MAX(D$1:D1)+1000,COUNT(D$1:D1)-COUNTIF(D$1:D1,">=1000")+1)) そこでお求めの表ですが別のシートに作るとして、例えば別のシートのA1セルには重複データの表示などと入力してからA2セルからC2セルにはNO,名前、不満理由などの項目名を入力します。その上でA3セルには次の式を入力してC3セルまでオートフィルドラッグしたのちに下方にもオートフィルドラッグします。 =IF(ROW(A1)*1000>MAX(Sheet1!$D:$D),"",INDEX(Sheet1!$A:$C,MATCH(ROW(A1)*1000,Sheet1!$D:$D,0),COLUMN(A1))) 重複していないデータを例えば上と同じシートのA100セルに重複していないデータの表示などと入力し、A101からC101セルには上記と同様に項目名を並べます。その上でA103セルには次の式を入力してC103セルまでオートフィルドラッグしたのちに下方にもオートフィルドラッグします。 =IF(ROW(A1)>COUNTIF(Sheet1!$D:$D,"<1000"),"",INDEX(Sheet1!$A:$C,MATCH(ROW(A1),Sheet1!$D:$D,0),COLUMN(A1))) なお、重複しているデータや重複していないデータの表の表示はシートのどの行から表示させるようにしても特に問題はありません。
- kiyosatono
- ベストアンサー率25% (177/694)
ソフトは何でやります? Accessでやるのなら、A表と重複するデータの双方をテーブルに取り込んで、選択クエリで重複分だけを抜き出し(クエリ1とする)、A表とクエリ1の差分クエリを作れば、重複していないものが抜き出せます。 Excelでやるのなら、私ならConcatenateで各列のデータをくっつけたものを1列作成して、重複分の表にあるかないかをMatchか何かで判定させて、並べ替えで重複するデータと重複していないデータに分けるかな。うまいやり方じゃないかもしれませんが。 詳しく説明が必要でしたら補足ください。
補足
ソフトはエクセルです。 お時間ございましたら、教えて下さい。