すべてのカテゴリ » インターネット・パソコン » ソフトウェア » 使い方・不具合

質問

終了

エクセルで、二つの行を見比べて、重複していないデータだけを抽出したいのです。重複を削除することは、できたのですが、、、。教えてください。

  • 質問者:質問者
  • 質問日時:2009-02-17 11:34:59
  • 2

一時的に抽出して今後はその機能は使わないのか、それともワークシートに組み込んで常時使用するのか、マクロで抽出するのか等、どのような目的で使うかによって方針は多岐に渡ります。

様々な方法が有りますが今回は最も簡単に組み込めて、その後も自動計算でリアルタイムに抽出が出来るように文末に関数として組み込んで常時重複を削除したデータを集めるシートのサンプルを作成したので参考にしてみてください。

先ずはサンプルをExcelに読み込んでください。*** 開始 ***の直下の行から*** 終了 ***の直上の行までを範囲選択してコピーしてメモ帳などに貼り付けてから、test.slk等の拡張子をslkにした適当なファイル名で保存してください。これで数式を含むサンプルシート(ブック)が出来上がりますので、このファイルをダブルクリック等でExcelに読み込んでください。

巧く読み込めたら、以下の解説を読んで参考にしてください。

A1~C12までは元データ、E1~E12は重複を検査するための作業用セル、G1~I12は重複していないデータその物を除いた=唯一1回しかデータ中に存在しないデータです。

★E1~E12の解説
B列のデータからを自分自身を除くB列のセルからMatch関数で一致を検出します。自分が4行目ならば1行目~3行目、5行目~11行目までをチェックします。同じデータが見つからない場合はMatch関数はエラーを返しますので、エラーの状況をチェックして一致が無い場合は項目の番行(行)を、一致する物が有った(重複が有った)場合は実際のデータとして出現しない様な最大の数値=10^99等をセットします。

10^99を、例えば10000+A列とかにすれば、排除ではなく抽出した一覧の最後の方に付け加える事も可能です。

★G1~G12までの解説
先程E1~E12で検査した数値をSmall関数を使って小さい順にソートします。これで重複があったデータ番号は最大の数値になっていますのでSmall関数の最大値として下の方に弾き飛ばされます。番号順なので元データの出現順に並びますから、前の項で説明した様な並び替えや大きい順等も可能です。

★H1~I12の解説
G列で検出しソートした番号をオフセットとしてOffset関数を使って元データのテーブルからデータ群を拾ってきます。F14~I14は抽出したい列の番号ですが、これは後々列を挿入した時に不便をしないための配慮なので、その可能性が無ければ無理にセル上に置く事も無いので直接関数の中に置いてしまっても構いません。

なお、各関数の説明はExcelのHelpで確認してください。お役に立てれば幸いです。これ以外にも方法は沢山有りますが、色々と弄ってみると、もっと色々と試す事が出来ると思います。



以下を切り取ってtest.slk等のファイル名で保存してください。サンプルファイルが出来ます。
*** 開始 ***
ID;PWXL;N;E
C;Y1;X1;K"元のデータ"
C;X5;K"検査処理"
C;X7;K"重複データを含まない抽出後のデータ"
C;Y2;X1;K"番号"
C;X2;K"項目"
C;X3;K"数量"
C;X5;K"重複検査値"
C;X7;K"番号"
C;X8;K"項目"
C;X9;K"数量"
C;Y3;X1;K1;E1
C;X2;K"a"
C;X3;K100
C;X5;K1E+99;EIF(AND(ISERROR(MATCH(RC[-3],R[+1]C[-3]:R13C2,0)),ISERROR(MATCH(RC[-3],R2C2:R[-1]C[-3],0))),RC[-4],10^99)
C;X7;K2;ESMALL(R3C5:R12C5,RC[-6])
C;X8;K"bb";EIF(RC7>10^98,0,OFFSET(R2C1,RC7,R14C))
C;X9;K200;EIF(RC7>10^98,0,OFFSET(R2C1,RC7,R14C))
C;Y4;X1;K2;ER[-1]C+1
C;X2;K"bb"
C;X3;K200
C;X5;K2;EIF(AND(ISERROR(MATCH(RC[-3],R[+1]C[-3]:R13C2,0)),ISERROR(MATCH(RC[-3],R2C2:R[-1]C[-3],0))),RC[-4],10^99)
C;X7;K3;ESMALL(R3C5:R12C5,RC[-6])
C;X8;K"c";EIF(RC7>10^98,0,OFFSET(R2C1,RC7,R14C))
C;X9;K500;EIF(RC7>10^98,0,OFFSET(R2C1,RC7,R14C))
C;Y5;X1;K3;ER[-1]C+1
C;X2;K"c"
C;X3;K500
C;X5;K3;EIF(AND(ISERROR(MATCH(RC[-3],R[+1]C[-3]:R13C2,0)),ISERROR(MATCH(RC[-3],R2C2:R[-1]C[-3],0))),RC[-4],10^99)
C;X7;K5;ESMALL(R3C5:R12C5,RC[-6])
C;X8;K"dd";EIF(RC7>10^98,0,OFFSET(R2C1,RC7,R14C))
C;X9;K444;EIF(RC7>10^98,0,OFFSET(R2C1,RC7,R14C))
C;Y6;X1;K4;ER[-1]C+1
C;X2;K"d"
C;X3;K10
C;X5;K1E+99;EIF(AND(ISERROR(MATCH(RC[-3],R[+1]C[-3]:R13C2,0)),ISERROR(MATCH(RC[-3],R2C2:R[-1]C[-3],0))),RC[-4],10^99)
C;X7;K6;ESMALL(R3C5:R12C5,RC[-6])
C;X8;K"b";EIF(RC7>10^98,0,OFFSET(R2C1,RC7,R14C))
C;X9;K666;EIF(RC7>10^98,0,OFFSET(R2C1,RC7,R14C))
C;Y7;X1;K5;ER[-1]C+1
C;X2;K"dd"
C;X3;K444
C;X5;K5;EIF(AND(ISERROR(MATCH(RC[-3],R[+1]C[-3]:R13C2,0)),ISERROR(MATCH(RC[-3],R2C2:R[-1]C[-3],0))),RC[-4],10^99)
C;X7;K9;ESMALL(R3C5:R12C5,RC[-6])
C;X8;K"fff";EIF(RC7>10^98,0,OFFSET(R2C1,RC7,R14C))
C;X9;K99;EIF(RC7>10^98,0,OFFSET(R2C1,RC7,R14C))
C;Y8;X1;K6;ER[-1]C+1
C;X2;K"b"
C;X3;K666
C;X5;K6;EIF(AND(ISERROR(MATCH(RC[-3],R[+1]C[-3]:R13C2,0)),ISERROR(MATCH(RC[-3],R2C2:R[-1]C[-3],0))),RC[-4],10^99)
C;X7;K10;ESMALL(R3C5:R12C5,RC[-6])
C;X8;K"h";EIF(RC7>10^98,0,OFFSET(R2C1,RC7,R14C))
C;X9;K55;EIF(RC7>10^98,0,OFFSET(R2C1,RC7,R14C))
C;Y9;X1;K7;ER[-1]C+1
C;X2;K"d"
C;X3;K77
C;X5;K1E+99;EIF(AND(ISERROR(MATCH(RC[-3],R[+1]C[-3]:R13C2,0)),ISERROR(MATCH(RC[-3],R2C2:R[-1]C[-3],0))),RC[-4],10^99)
C;X7;K1E+99;ESMALL(R3C5:R12C5,RC[-6])
C;X8;K0;EIF(RC7>10^98,0,OFFSET(R2C1,RC7,R14C))
C;X9;K0;EIF(RC7>10^98,0,OFFSET(R2C1,RC7,R14C))
C;Y10;X1;K8;ER[-1]C+1
C;X2;K"a"
C;X3;K88
C;X5;K1E+99;EIF(AND(ISERROR(MATCH(RC[-3],R[+1]C[-3]:R13C2,0)),ISERROR(MATCH(RC[-3],R2C2:R[-1]C[-3],0))),RC[-4],10^99)
C;X7;K1E+99;ESMALL(R3C5:R12C5,RC[-6])
C;X8;K0;EIF(RC7>10^98,0,OFFSET(R2C1,RC7,R14C))
C;X9;K0;EIF(RC7>10^98,0,OFFSET(R2C1,RC7,R14C))
C;Y11;X1;K9;ER[-1]C+1
C;X2;K"fff"
C;X3;K99
C;X5;K9;EIF(AND(ISERROR(MATCH(RC[-3],R[+1]C[-3]:R13C2,0)),ISERROR(MATCH(RC[-3],R2C2:R[-1]C[-3],0))),RC[-4],10^99)
C;X7;K1E+99;ESMALL(R3C5:R12C5,RC[-6])
C;X8;K0;EIF(RC7>10^98,0,OFFSET(R2C1,RC7,R14C))
C;X9;K0;EIF(RC7>10^98,0,OFFSET(R2C1,RC7,R14C))
C;Y12;X1;K10;ER[-1]C+1
C;X2;K"h"
C;X3;K55
C;X5;K10;EIF(AND(ISERROR(MATCH(RC[-3],R[+1]C[-3]:R13C2,0)),ISERROR(MATCH(RC[-3],R2C2:R[-1]C[-3],0))),RC[-4],10^99)
C;X7;K1E+99;ESMALL(R3C5:R12C5,RC[-6])
C;X8;K0;EIF(RC7>10^98,0,OFFSET(R2C1,RC7,R14C))
C;X9;K0;EIF(RC7>10^98,0,OFFSET(R2C1,RC7,R14C))
C;Y14;X6;K"列オフセット"
C;X7;K0
C;X8;K1;ERC[-1]+1
C;X9;K2;ERC[-1]+1
E
*** 終了 ***

===補足===
返信&Bestを頂き、有難うございました。色々と工夫をしながら弄ってみれば更に要求に応じた巧い改造も出来るかと思いますので頑張ってみてください。

この回答の満足度
  
とても参考になり、非常に満足しました。回答ありがとうございました。
お礼コメント

わざわざプログラムまで作ってもらってありがとうございます。
試してみます。

並び替え:

http://www.eurus.dti.ne.jp/~yoneyama/Excel2007/excel2007-filter2.html

ここの説明が一番判りやすいですね。

あと、この手の質問の時は「2003」なのか「2007」なのかを書かれた方がいいですよ。
少しですが機能が変わってますからね・・・

  • 回答者:PP (質問から5分後)
  • 0
この回答の満足度
  
参考になりました。回答ありがとうございました。
お礼コメント

ありがとうございます。私の説明がわかりにくいようです。
重複するデータは、残さないようにしたいのです。一つ目のデータ(a,b,c、d)二つ目のデータ(a、c)の場合に、b、dだけが抽出されるようにしたいのです。
ちなみに2007を使用しております。

Vlookup関数を利用して見るのはどうでしょうか。データがなければエラーがかえってくるので、エラーで抽出して削除すれば良さそう、と思ったのですが。
Sheet1のA列にデータがあり、Sheet2のA列に無いデータを抽出したいときは、例えば、Sheet1のB列にB1から以下のように書きます。

=Vlookup(A1,Sheet2!A:A,1,false)

以下、コピー&ペーストで繰り返すとSheet2に対象データがないときはエラーになります。

  • 回答者:ビギナーズ (質問から9時間後)
  • 0
この回答の満足度
  
参考になり、満足しました。回答ありがとうございました。
お礼コメント

ありがとうございました。
試してみます

関連する質問・相談

Sooda!からのお知らせ

一覧を見る