重複したデータから,リストを作成したい

データが重複していて、そこから重複のないデータリストを作りたい。
そんな場面に,出会ったことはないでしょうか?

このことは,実は,エクセルの機能の中に『重複の削除』というのがあるので,それを使うと簡単にできてしまいます。(^_^;)
しかし,あえて、『関数でやってしまおう!』というのが,ここで紹介する方法です。
関数を使う利点を,しいて言えば,『データが変わっても,リアルタイムで,いつも正しい結果が出る』ということでしょうか。

ここでは,【A】MATCH関数を使う方法,【B】配列数式を使う方法 の2つを紹介します。


【A】MATCH関数と行番号で求める方法

  A列 => 元データ


B列 => 作業列

C列 => 作業列

D列 => 作業列


E列 => リスト(結果)


(1)B列: A列の中で,各くだものが何行目に出てくるのか,調べます。

  B3に,=MATCH(A3,$A$1:$A$17,0) と入力します。
  そして,これをB17まで,コピーします。

  【関数の説明】 MATCH( 検索値 , 範囲 , 検索の型 ) => 範囲の中で,検索値が何番目にあるか返します。
                                             検索の型は,完全一致で探したいので,ここでは0にします。

  ここでは,MTACH関数で返す位置が,行番号になるように,範囲をA1からA17までにしています。
  これは,のちのち,行番号で処理していくからです。

  MATCH関数は,範囲の中で最初に見つかった位置を返します。
  ※B3の「りんご」の値とB4の「りんご」の値が同じなのは,A4の「りんご」で検索しても,やはりA3の「りんご」の方が最初に見つかるからです。


(2)C列: MATCH関数で求めた位置と,行番号が一致したものだけを,表示させます。

  C3に,=IF(B3=ROW(),ROW(),"") と入力します。
  そして,これをC17まで,コピーします。

  【関数の説明】 ROW() => この関数の入っているセルの行番号を求めます。

  ※MATCH関数で求めた位置と行番号が一致したら,初めて出てきたデータなので,その行番号を表示させます。


(3)D列: 行番号を前に詰めます。

  D3に,=SMALL($C$3:$C$17,ROW(A1)) と入力しjます。
  そして,これをK17まで,コピーします。
  
  【関数の説明】 SMALL( 範囲 , 順位 ) => 範囲の中で,○番目に小さい数を求めます。
                                  例えば,順位が1なら,1番小さい数を求めることになります。
  【関数の説明】 ROW(A1) => A1の行番号を求めます。

  順位の中で,ROW関数を使っています。
  SMALL関数の順位は,基本は数字で示します。(1・2・3・4・・・のように)
  しかし,これだと,コピーしたあと,順位の部分を2,3,4,・・と打ち直さないと,2番目,3番目,4番目・・・のデータが得られません。
  それで,ROW関数を使って,数字が変わるようにしてあります。
  コピーした数式を見てみると,D4では,ROW(A2)となって2番目を指し,D5では,ROW(A3)となって3番目を指しています。  


(4)E列: 重複のないリストを表示させます。

  E3に,=INDIRECT("A"&D3) と入力します。
 そして,E17まで,コピーします。

  【関数の説明】 INDIRECT( 参照文字列 ) => 参照するアドレスを文字で指定します。例えば,ここを"A1"とすると,A1の内容を表示します。

  A列の中から,D列で求めた行位置にあるデータを表示させて,完成です。


【B】配列数式

  Aの方法では,作業列を3つ使って求めました。

しかし,作業列を使いたくない時や,そのスペースを確保できないときは,
配列数式を使って,結果を求めます。
1つの列の中で全部計算するので,数式はかなり長くなります。

配列数式は,配列数式のしくみ自体を理解してないと使えないので
敷居は高いですが,知っていると非常に便利です。

(1)B列: 配列数式を打ち込みます。

  B3からB17を範囲指定し,以下の数式を打ち込みます。
  =INDEX(A1:A17,SMALL(IF(MATCH(A3:A17,A1:A17,0)=ROW(A3:A17),ROW(A3:A17),""),ROW(A1:A17)))
  そして,Shift + Ctrl + Enterキーを押します。
  すると,式の前後に { } が付いて,
  {=INDEX(A1:A17,SMALL(IF(MATCH(A3:A17,A1:A17,0)=ROW(A3:A17),ROW(A3:A17),""),ROW(A1:A17)))}
  となりました。

  これで,配列数式が入力されました。(配列数式の詳細は,ネットで調べてください。)

※この方法は,方法Aを応用したものです。



以上,読んでくださって,ありがとうございました。