きどたかのブログ

いつか誰かがこのブログからトラブルを解決しますように。

Excel関数のみで右から検索

たぶん世の中にそんな方法は一杯出回ってるんだろうな。


=RIGHT(A1,LEN(A1)-FIND(CHAR(9), SUBSTITUTE(A1,"\",CHAR(9),SUM(LEN(A1),-1*LEN(SUBSTITUTE(A1,"\",""))))))


A1セルに、フルパス表記なファイルパスがあり、
そこからファイル名のみを取り出すようなことをする。


RIGHT関数を最終的には使いたい。
しかし、最後のファイルセパレータの位置を調べる方法がない。
FIND関数では右から検索できないからだ。


まず、ファイルセパレータの個数をカウントする。
SUM(LEN(A1), -1*LEN(SUBSTITUTE(A1,"\","")))


これはファイルセパレータを空文字に置換した文字数を、
元の文字の文字数から引くことでファイルセパレータの数を導いている。


この数は、最後のファイルセパレータが、先頭から何回目に出現するかを表している。


次にこの最後のファイルセパレータを何か別の文字に置換する。
今回はCHAR(9) 水平タブに変換している。
つまり、SUBSTITUTE関数の最後のオプションの「置換対象」に何個目のファイルセパレータかを指定している。


お目当ての文字を、特殊な制御文字に置換しおえたら、
ふつうにFIND関数でその位置を導き、元の文字のLENGTHから引くことで、
RIGHT関数に渡したい文字数が導出される。


この制御文字への置換を用いることが可能であれば、
後ろから何回目に出現した指定文字であるとか、
先頭から何回目に出現した指定文字であるとかを処理できる。
もちろん、出現しなかったら何かしらエラーになるだろう。