Excelの関数を用いて、特定の条件のデータを詰めて表示する。

概要

関数のみを用いて、特定の条件のデータを抽出する。

画像1

このデータをもとにして、

画像2

こんな感じにまとめる。
(当然、分類のところを切り替えると、抽出結果が自動で変わるようにする)

模範解答

抽出するセルに以下の数式を入力しCtrl+Shift+Enterで確定する。

=IFERROR(
    INDEX(
        テーブル1[名前],
        SMALL(IF(テーブル1[分類]=$H$2,ROW(テーブル1[名前])-1),ROW()-1)
    ),
    ""
 )

抽出するセルは元データと同じ高さのテーブルに設定している。
※見やすさを考慮して改行したが、実際のセル入力は改行の必要はない。
※H2は分類("〇","×","△”)が入力されたセル。
※テーブル設定しない場合は、式を下にコピーすればよい。

解説

上の回答に至るまでの道筋を、順序だてて説明する。
まずは、作業列を使いながら、

画像9

このような抽出をすることを目指し、この抽出操作を説明する。

最終的なゴールの抽出操作で使う関数は、INDEX関数である。
INDEX関数の詳細は延べないが、ここでは、
INDEX( 1列の配列 , n )
という使い方で、その配列のn番目の要素を抽出する。
『1列の配列』として入力しているのは、『テーブル1[名前]』であり、これから、名前を抽出表示することから考えても、理解できると思う。

画像3

このようになっており、抽出結果として、

画像4

この形を目指すということは、抽出結果の1つ目の項目(すなわち『毛利』)では、INDEX(テーブル1[名前],4)のようになっていればよい。
(元データのテーブルで『毛利』が4番目であることを確認せよ)
続いて『工藤』は8番目、鈴木は11番目、服部は12番目、遠山は13番目である。つまり、INDEXの第二引数である『n』としては、4,8,11,12,13と切り替わっていくような式を入力することになる。

nの数列{4,8,11,12,13}とはすなわち、分類が"×"である要素が、何番目にあるかを抽出した結果だ。すなわち、

画像5

このように×のところの『何番目?』だけ抽出した形である。
この、4,8,11,12,13のみが表示された列を作るのは非常に簡単で、単に
=IF([@分類]="×",ROW([@名前])-1,"")
とだけすればよい。つまり、条件を満たすところのみ、『行番号-1』を返している。(タイトル行があるので、行番号は[名前]の対応する番号より1大きくなる)
さて、ここで、最終目標である、毛利、工藤、鈴木、服部、遠山、と今みた数列4,8,11,12,13の関係を改めて確認しよう。4,8,11,12,13という数字がINDEXを用いるときに必要な数列であることを思い出して、対応をとった表を示すと、

画像6

このようになる。
この4,8,11,12,13という数列はINDEXの2番目の引数であり、この数字があれば、
"毛利" = INDEX(テーブル1[名前],4)
"工藤" = INDEX(テーブル1[名前],8)
"鈴木" = INDEX(テーブル1[名前],11)
"服部" = INDEX(テーブル1[名前],12)
"遠山" = INDEX(テーブル1[名前],13)
のように抽出できる。
上の『抽出n』とした配列の入力式は
=SMALL(テーブル1[n],ROW()-1)
となっている。SMALL関数は「小さいほうから何番目」の数字を抜き出してくれる。INDEXが条件を満たす名前を抽出する操作を担当しているとするなら、SMALL関数は抽出された名前を詰めて表示する部分を担当しているといえる。
抽出nの列まで作れれば、あとは簡単だ。INDEXの第二引数(n)を抽出nの番号にすれば、結果を抽出できるわけだから、
=INDEX(テーブル1[名前],[@抽出n])
とすることで、抽出完了である。
結果と全体像を示すと、

画像7

このような形である。さて、#NUM!が気に入らない人は、IFERROR関数で対応する。抽出結果を
=IFERROR(INDEX(テーブル1[名前],[@抽出n]),"")
と書き換えれば、#NUM!エラーが消えて、

画像8

このように抽出結果がきれいに表示される。
さて、一番最初に示した、『回答』

=IFERROR(
    INDEX(
        テーブル1[名前],
        SMALL(IF(テーブル1[分類]=$H$2,ROW(テーブル1[名前])-1),ROW()-1)
    ),
    ""
 )

は何だったのかというと、いまここまで示してきた作業セルの内容をすべて一つのセルに入力したものになっている。つまり、
=IFERROR(INDEX(テーブル1[名前],[@抽出n]),"")
の[@抽出n]のところに、抽出nの式である、
SMALL(テーブル1[n],ROW()-1)
を入力する。さらに、ここでテーブル1[n]の部分に
IF([@分類]=$H$2,ROW([@名前])-1,"")
を代入する。(ただし、ここで@は外す)
@を外すのは、このIF文の中身をすべて配列として処理するためである。
最後に、これを配列数式として確定させるために、Ctrl+Shift+Enterで入力すれば、抽出操作を作業列なしで行い、下の結果が得られる。

画像10

補足

抽出操作をするような数式だと、工夫次第でいろいろな方法が考えられる場合が多い。各自いろいろ試してみてほしい。今回紹介したのは、私が思いついた中でシンプルなものだが、他にも、

=IFERROR(
    INDEX(
        テーブル1[名前],
        MATCH(
            SMALL(
                IF(
                    テーブル1[分類]=$H$2,
                    ROW(テーブル1[名前]),
                    ""),
                ROW()-1
            ),
            ROW(テーブル1[名前])
            ,0
        )
    ),
    ""
)

とか

=IFERROR(
    INDEX(
        テーブル1[名前],
        MATCH(
            AGGREGATE(
                15,
                6,
                ROW(テーブル1[名前])/(テーブル1[分類]=$H$2),
                ROW()-1
            ),
            ROW(テーブル1[名前]),
            0
        )
    ),
 "")

のような式も考えられると思う。
読み取りは各自で頑張ってみてほしい。

この記事が気に入ったらサポートをしてみませんか?