こんにちは。ヒトツメです。
半年ほど前、Excelの新関数がいくつか発表され、配列の解説とともにこのブログでも紹介をしました。8月からこれらの関数も一般公開され、普通に使えるようになっていますが、今日は、その際に導入されたTEXTAFTER関数とTEXTBEFORE関数について取り上げたいと思います。
わかりやすいのは苗字と名前
TEXTAFTER関数とTEXTBEFORE関数は、引数にとる文字列に関して、特定の文字が発生する前と後の文字列を抜き出すことができるという関数です。
これだけ言うとイメージがつきにくいかもしれませんが、一番わかりやすいのが、フルネーム表記を苗字と名前に分けるというものです。
たとえばA1セルに「山田 太郎」と入っている場合、「=TEXTBEFORE(A1,” ”)」と入力すれば苗字を抜き出すことができ、「=TEXTAFTER(A1,” ”)」と入力すれば名前を抜き出すことができます。
これは、「山田 太郎」という文字列に関して、苗字と名前の間に「 」(スペース)が入っているため、その前後をそれぞれ抜き出せば苗字と名前に分けることができる、ということです。
非常に単純ですが、まとめて処理をする場合には意外と重宝すると思います。
MID関数とFIND関数
とhいえ、新関数の例に漏れず、この関数も既存の関数の組み合わせで簡単に代用することができます。
それが、文字列に関して途中の場所からを抜き出すMID関数と、文字列の中で指定した文字が現れる場所を返却するFIND関数です。
上の例で行けば、「=FIND(A1,” ”)」と入れれば、スペースが入っている3文字目、つまり3という結果が返却されます。この3という部分を使って苗字と名前を抜き出そうとすれば、それぞれ次のように表記することになります。
- 苗字:MID(A1, 1, 3-1) ※LEFT(A1, 3-1)でも同じ
- 名前:MID(A1, 3+1, LEN(A1))
したがって、ここに出てくる3を「=FIND(A1,” ”)」に置き換えれば、次のようになります。
- 苗字:MID(A1, 1, FIND(A1,” ”)-1) ※LEFT(A1, FIND(A1,” ”)-1)でも同じ
- 名前:MID(A1, FIND(A1,” ”)+1, LEN(A1))
ちなみに、名前の場合にMID関数の第三引数をA1の長さにしているのは、どれだけ名前が長くなってもA1の長さを超えることはないからです。MID関数の第三引数は、第二引数の場所以降の長さより長い数字を指定した場合、自動で残りの長さになるように設定されるので、この書き方が一番シンプルで確実になります。
三つ以上に分ける場合
ただ、このようなMID関数とFIND関数の組み合わせは、三つ以上に分ける場合少しややこしいです。FIND関数では開始位置の指定ができるので、一番最初に指定の文字列が出てきた場所のすぐ左を開始位置として二つ目の指定の文字列の出現場所を検索することができますが、ちょっと処理が面倒でややこしいです。
TEXTAFTER関数とTEXTBEFORE関数では、この処理が、想像より非常に楽にできます。イメージとしては、三つ分割の場合、「前半」「後半の前半」「後半の後半」という考え方で分割します。
試しに電話番号を分けてみると、次のようになります。
- 一つ目:TEXTBEFORE(A3,”-“)
- 二つ目:TEXTBEFORE(TEXTAFTER(A3,”-“),”-“)
- 三つ目:TEXTAFTER(TEXTAFTER(A3,”-“),”-“)
最後だけ少し関数を変形させる必要はありますが、これを応用すればいくつでも分割が可能です。これが四つの分割になれば、「前半」「後半の前半」「後半の後半の前半」「後半の後半の後半」という分け方をすればよいということになります。
さいごに
配列のような特殊なものを扱う場合以外は、どうしてもExcelの新関数は従前の関数の組み合わせでできるものになってしまいがちです。
通常の文字列などを扱う限りにおいて、新しい概念が現れるのは非常にまれだからです。
だからこそ、新しい関数は、少ない関数で分かりやすく処理することができ、非常に便利です。
リーダブルな処理をするうえでも、新関数は積極的に覚えて使えるようになった方がよいと思います。
コメント