これまで(Excel2016登場以前)は、値によって処理結果や表示結果を分岐させたい意図を持った数式を書く為には、IF文を多量にネスト(入れ子)させて、力ずく感のある長々とした数式を書いて表現せざるを得ない状況が続いていましたが、Excel2016から導入されたSWITCH関数を用いれば一層簡単に、数式もスマートに分岐表現を単関数の数式で描くことが出来る様になりました。
本記事ではVLOOKUP関数やCOUNTIF関数などと同様に、ワイルドカード指定による値分岐がSWITCH関数でも可能なのか?を検証することを目的としています。
なお「Excel2016以降使用できる関数」ではありますが、Excel2016についてはOffice365版でないと利用できないようですので一応ご注意ください。
目次
SWITCH関数でワイルドカード指定は出来る?
検証の結果、結論としてはSWITCH関数ではワイルドカードの指定は出来ませんでした。
SWITCH関数は「完全に一致するもの」に対する処理分岐がなされるようで、上記サンプルで各拡張子に対する関連ファイルの導出を試みたところ、全て「不明」に落ち、前方一致指定での分岐が実現できませんでした。
例えばC3セルに埋め込んだ数式では、B3セルの「".doc"」がSWITCH関数を用いた数式上で「".do*"」の部分に合致するか否かという分岐に入り、"合致する"に落ちて欲しい想いがありましたが、見事に"不明"に流れていることが確認出来ます。当検証からも、"*"がパターンマッチ文字を指すワイルドカードの意という認識はなされず、"*"という1つの文字として認識されている事が分かります。
他関数と組み合わせてみる
あまりスマートではありませんが、多少手間を加えればワイルドカードが使える場面もありそうです。もっとも、SWITCH関数単独でワイルドカードを用いるという行為はどのみち実現不可なので、他関数の協力を仰ぎながら進める事となります。サンプルとして、先と同様に「各拡張子に対する関連ファイルの導出」を行います。
取り急ぎの完成形です。上記を紐解いて解説していきます。
ワイルドカード付きの検索文字列を横軸(表ヘッダー)に指定し、各行にて合致すれば当該セルにヘッダー部の文字列を表示するようC~E列に数式を埋め込んでいます。COUNTIF関数はワイルドカードが指定可能なため、「.do*」といった前方一致検索でヒットさせることが可能です。
「.doc」の行を横に見ると、COUNTIF関数によるワイルドカード指定で数式導出結果が1となるのは「.do*」のみとなります。「.xl*」「.p*」については前方不一致となる為、IF文のELSE部(合致しない場合の記述)に指定した空白("")が表示されています。なお、一致しない場合に空白としているのには理由があるので後述します。
また、冒頭で触れましたがExcel関数にはワイルドカードが指定可能な関数がいくつか存在し、COUNTIF関数の他にも有名どころの関数では、VLOOKUP関数やMATCH関数がワイルドカード指定可能な関数です。別途、ワイルドカードが指定可能な関数をまとめられている方が居られたのでリンクを貼っておきます。
この時点で"xx関連ファイル"を表示してあげればいいのですが、それではSWITCH関数の出番がなくなってしまうのでご容赦ください。。。加えてCOUNTIF関数の使い方もかなり雑です。ごめんなさい。
「各行にて合致すれば表ヘッダー部(".do*" etc...)の文字列を表示」していましたが、C~E列の各セルに表示させたヘッダー文字列を元に、更に追加でSWITCH関数を用いた数式をF列に組みこんでいます。
「検索文字列はいずれか1つにのみ一致している。」という前提付きになってしまっているのがなんとも気になるところですが、SWTICH関数による分岐が曲がりなりにも動作しています。
先ほど「一致しない場合は空白」としていたのは、CONCAT関数(こちらもExcel2016にて追加)を使用(紹介)したかっただけなのですが、この関数も大変便利なものとなっています。
CONCAT関数が登場する以前の文字列結合操作は「C4&D4&E4といった"&"で繋ぐ方法」か、「=CONCATENATE(C4,D4,E4)といった関数を用いる方法」の2択が基本でしたが、範囲選択で文字列が結合できるようになったのは大変ありがたいことです。
該当なしの場合もしっかり「不明」に落ちている事が確認できます。
まとめ
SWITCH関数は文字列の完全一致を元に分岐を行う関数となっているため、ワイルドカードの指定は出来ない。"出来るよ!"を期待して訪問された方には何とも申し訳ない気持ちでいっぱいです。
また、部分一致でSWITCHさせたい場合は、
- ワイルドカードが指定可能な関数を組み合わせる
- MID関数を用いて文字列を一部切り出して、前方一致/後方一致さながらに条件分岐させる
- FIND関数とISERROR関数を組み合わせて文字列中の部分一致に存在する/しないを判定させた上で処理する
等々、他の関数との組み合わせで数式を組み立てる必要がありそうです。