Excelで、指定した文字(文字列)を含む行を抽出する各種の方法についてです。
いずれの方法でも、部分一致(~を含む)、前方一致(~で始まる)、後方一致(~で終わる)による抽出ができます。
対象データと抽出内容
画像のような、2つの列からなる表を用います。
この表から、「県」の列の文字列が「山」の字を含んでいる行を(2列とも)抽出するものとします。
結果的に「岡山県」の行と「山口県」の2つの行が抽出されることとなります。
抽出方法
フィルタにより抽出する
条件に該当しない行を一時的に非表示にする機能である、フィルタのメニューを使った抽出例です。
まずは表内のどこか(ここではB2セル)を選択し、メニューから「データ」タブ→「フィルター」を選択します(「ホーム」タブ→「並べ替えとフィルター」→「フィルター」と進む方法もあります)。
すると見出し(表内の最も上の行)に▼ボタンが現れます。
抽出の条件となる「県」の列の▼ボタンをクリックします。
メニューが展開されますので「テキストフィルター」→「指定の値を含む」と選択します。
※「指定の値で始まる」を選択すれば前方一致の、「指定の値で終わる」を選択すれば後方一致の検索ができます。
するとダイアログが現れます。
上の方のテキストボックスに、検索文字列である「山」を入力してOKボタンをクリックします。
※画像からわかるように、ここで部分/前方/後方一致の設定を変えることもできますし、ワイルドカードを使うこともできます。2段目以降の検索欄を使ってAND/OR検索も可能です。
以上で完了です。
見えなくなった行は消えたのではなく非表示になっているだけなので、フィルタを解除したり条件を変えることで再度表示させることができます。
FILTER関数とCOUNTIFS関数により抽出する
ここからは関数を用いる抽出例です。元のデータとは離れた位置に必要なデータだけを取り出すことができ、元データの変更も即座に反映されます。
頼みの綱はFILTER関数ですが、条件に工夫が必要です。特に部分一致/前方一致/後方一致を使い分けられると便利なので、ワイルドカードを利用できる関数をうまく活用することがポイントになります。
まずはFILTER関数に、条件としてCOUNTIFS関数を組み合わせる例です。
式は簡潔ではあるものの、動作が理解しにくいのが難点です。
E3セル
=FILTER(B3:C8,COUNTIFS(B3:B8,B3:B8,B3:B8,"*山*"))
「*山*」の部分は部分一致(「山」を含む)を表すワイルドカードです。これを「山*」に置き換えれば前方一致(「山」で始まる)に、「*山」に置き換えれば後方一致(「山」で終わる)になります(以下の例でも同様)。
式の説明ですが、素直に考えれば「=FILTER(B3:C8,COUNTIF(B3:B8,"*山*"))」としたくなるものの、これだとCOUNTIF関数が1つの数値(B3:B8の範囲内で「*山*」にマッチするセルの数、つまり2)しか返さないためエラーになります。
しかしCOUNTIFS関数を使い第1引数(1番目の検索範囲)と第2引数(1番目の条件)をともに「B3:B8」とすることにより、結果的に1つのセルごとにカウントしています。要は「COUNTIFS(B3:B8,"岡山県",B3:B8,"*山*")」から「COUNTIFS(B3:B8,"島根県",B3:B8,"*山*")」まで6つのカウントが実行されるので、最終的に配列「{1;0;1;0;0;0}」が得られます。これをFILTER関数の第2引数とすることで、1(0以外)はTRUEとして、0はFALSEとみなされるため「山」を含む行だけが抽出されます。
ちなみに検索対象(B列)に同じ値が存在する場合の結果が気になるかもしれませんが、画像のようにきちんと抽出できます(もちろん次以降の方法でもうまくいきます)。
ただしこの場合、COUNTIFS関数は{0;1;1;0;1;0}ではなく{0;3;3;0;3;0}を返しています。
FILTER関数とMAP/LAMBDA/COUNTIF関数により抽出する
条件としてMAP/LAMDA/COUNTIF関数を使い、1セルごとにCOUNTIF関数を適用するという方法です。
E3セル
=FILTER(B3:C8, MAP(B3:B8,LAMBDA(x,COUNTIF(x,"*山*"))) )
MAP/LAMBDA関数によりB3:B8の範囲にxという名前を付け、それらの1セルごとにCOUNTIF関数を適用しています。つまり、「山」を含むかどうかを1セルごとにカウントしています。
これにより配列「{1;0;1;0;0;0}」が得られますので、これをFILTER関数の第2引数として利用することで画像の結果が得られます。
COUNTIFS関数を使う例と比べると技術的に正統派な感じですが、やはりMAP/LAMBDAの部分を理解するまでが難しいことが難点です。
なお、MAP関数の機能と使用例については次の記事でいくつか紹介しています。