(Excel)UNIQUE関数の代用となる関数の例

 UNIQUE関数が使えない旧バージョンのExcelにおいて、他の関数を組み合わせて同様の結果を得る方法です。
 実際のところなかなか難しいですので、関数の扱いに慣れていない場合はさらに数式を細分して実行するなど試してみてください。もちろんメニューの「重複の削除」を使うのも一つの方法です。
 (※動作はExcel2010で確認していますが、記事中の画面はMicrosoft 365で実行したものです)

手順

 式の内容が少し異なる2つの方法に分けて紹介します。


 1つ目の方法です。
 内容としては、B3:B9セルの範囲内に入力されている値について、重複を除いた結果を得るものとします(以下の例でも同様)。
 はじめにD3セルに次のような数式を入力します。

 D3セル

=IF(COUNTIF(B$3:B3,B3)=1,ROW(),"")

 B列の値に応じて、その行の行番号か空白("")を返すという式ですが、このセルだと意味が分かりにくいので以下で改めて解説します。
 いずれ絶対参照の記号($)を忘れないように注意してください。



 この数式をフィルコピー(D3セル右下の緑の四角をD9セルまでドラッグ)します。
 そのセルの行番号の数値または空白のどちらかが返っているのがわかります。

 


 ここでD6セルを選択して数式を見てみます。

 「=IF(COUNTIF(B$3:B6,B6)=1,ROW(),"")」となっているのがわかります。フィルコピーによりD3セルの数式から少し変化(「B3」のうち2か所が「B6」に変化)している点に注意してください。
 この数式は「B3からB6セルまでの間にB6セルと同じ値がいくつあるかカウントし、1だったら行番号(6。ただし数式が入っているD6セルの行番号)を返し、1でなければ空白("")を返す」という式です。言い換えると「同じ行のB列の値(ここでは「まぐろ」)が初めて出現する値なら行番号を、そうでなければ空白を返す」という式です。
 上記のD3セルにおいては(B3セルの値は当然初めて出現する値なので)絶対に空白になることはなく行番号の「3」が得られますが、D4セル以降ではそうなるとは限らず、B列の値が初めて出現するものなら行番号が、そうでなければ空白が表示されます。



 あとはB列のうちそれぞれの行番号にある値を取得できれば欲しい結果になることがわかります。
 そこで隣の列のE3セルに次の数式を入力します。

 E3セル

=INDEX(B:B,SMALL(D$3:D$9,ROW(A1)))

 INDEX関数を使いB列全体のうち上から〇番目を取得するという式ですが、第2引数の「SMALL(D$3:D$9,ROW(A1)」がポイントです。
 これは「D3セルからD9セルまでの数値のうち、1(=ROW(A1))番目に小さい、つまり最も小さい数値を得る」というもので、結果的に「3」が得られます。
 これをINDEX関数の第2引数(〇番目のセル)とすることで、B列全体のうち上から3番目にあるセル、つまりB3セルの「いか」が得られます。



 この式を下方にフィルコピーすれば一応の完成です。
 重複を除いた4つの値が得られていることがわかります。

 E4セルにおいては上記の数式のSMALL関数の部分が「SMALL(D$3:D$9,ROW(A2))」となるので数値のうち2番目に小さい「4」が取得され、INDEX関数との組み合わせによりB4セルの値「サーモン」が得られます。E5セルでは同様に「6」→「まぐろ」が、E5セルでは「9」→「ほたて」が得られています。
 このようにROW関数を連番生成に利用するというのがよく用いられる手法です。ただしこの状態からA列や1行目を削除してしまうと「#REF!」エラーが発生するので、値に変換(コピー→値を貼り付け)しておいた方が無難です。



 なお、E7セル以降で「#NUM!」のエラーが出ているのが気になるかもしれませんが、その場合はIFERROR関数を併用して次のようにすればエラーを表示させないことができます(以下の例でも同様)。

 E3セル(下方にフィルコピー)

=IFERROR(INDEX(B:B,SMALL(D$3:D$9,ROW(A1))),"")

 


 続いて2つ目の方法です。セル位置の取得方法がわずかに異なるだけなので説明は手短にします。
 D3セルに次の数式を入力します。

 D3セル

=IF(COUNTIF(B$3:B3,B3)=1,MATCH(B3,B$3:B$9,0),"")

 同じ行にあるB列の値が初めて出現するものだったらB3:B9の範囲内におけるその位置(B3セルから数えて〇番目)を、そうでなければ空白を返すという式です。



 数式をD9セルまでフィルコピーします。

 


 あとはB3:B9の範囲内におけるそれぞれの位置(〇番目)の値を取得できれば欲しい結果になることがわかります。
 そこで隣の列のE3セルに次の数式を入力し、E9までフィルコピーすれば完成です。

 E3セル(下方にフィルコピー)

=INDEX(B$3:B$9,SMALL(D$3:D$9,ROW(A1)))

 SMALL関数を使いD列の数値のうち最も小さいもの(1)を取得し、さらにINDEX関数と組み合わせることでB3:B9の範囲内における1番目のセルの値(いか)を取得します。
 E4セルにおいてはROW関数の部分が「ROW(A2)」となるのでSMALL関数の結果は(D列のうち2番目に小さい)「2」となり、さらにINDEX関数と組み合わせによりB3:B9の範囲内における2番目のセルの値(サーモン)を取得します。以下も同様に「まぐろ」「ほたて」が取得されます。