データが重複していて、そこから重複のないデータリストを作りたい。
そんな場面に,出会ったことはないでしょうか?
このことは,実は,エクセルの機能の中に『重複の削除』というのがあるので,それを使うと簡単にできてしまいます。(^_^;)
しかし,あえて、『関数でやってしまおう!』というのが,ここで紹介する方法です。
関数を使う利点を,しいて言えば,『データが変わっても,リアルタイムで,いつも正しい結果が出る』ということでしょうか。
ここでは,【A】MATCH関数を使う方法,【B】配列数式を使う方法 の2つを紹介します。
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列で求めた行位置にあるデータを表示させて,完成です。
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を応用したものです。
以上,読んでくださって,ありがとうございました。