いきなり答える備忘録

G Suite・Microsoft 365・LibreOfficeなどに関するメモと日々の実験

(Gスプレッドシート)FIND関数で複数条件を指定する

 GoogleスプレッドシートでのFIND関数で、検索の文字列(検索条件)を複数指定して最初に出現する位置を取得する方法です。
 例としては、文字列に含まれる「@」と「#」のうち先に出現するものの位置を取得することができます。

  • FIND関数の第2引数(検索文字列)で配列を指定すれば、複数の検索結果を得ることができます(ARRAYFORMULA関数を併用)。さらにMIN関数と組み合わせればそれらのうち最初の出現位置を取得できます。

手順

f:id:accs2014:20200919100615p:plain:right:w500

 いきなりですが結果です。
 B3:B6の範囲に文字列が入力されており、文字列には「@」と「#」がいくつか含まれています。
 これに対しC3セルに次のような式を入力して下方にフィルコピーしています。
 C5,C6セルの結果からわかるように「@」と「#」のうち最初に出現するものの位置が得られていることがわかります。


 C3セル

=MIN(IFERROR(ARRAYFORMULA(FIND({"@","#"},B3)),""))

 FIND関数の第1引数を「{"@","#"}」とすることで、「@」と「#」の両方を検索文字列に指定しています。これによりそれぞれの文字を検索した結果(B5セルの文字列に対してはここでは4と7)が返されますので、あとはMIN関数で小さい方(最初に出現する方の位置)を取得しています。
 なおC7セルの結果からわかるように、いずれの文字も含まれない場合は0となります。FIND関数で含まれない文字がある場合はエラーが返されますが、複数の文字列を検索して1つでもエラーになるとMIN関数の結果までエラーになってしまい必要な結果が得られなくなります。そこでエラーが出た場合はIFERROR関数で空文字に変換しているため、このような結果になります。
 

f:id:accs2014:20200919100619p:plain:right:w500

 いずれの文字も含まれない場合に「#VALUE!」エラーを返す場合は、次のような式にするのが一つの方法です。


 C3セル

=SORTN(ARRAYFORMULA(FIND({"@";"#"},B3)),1,0,1,TRUE)

 IFERROR関数を使わずエラーをそのままにし、SORTN関数を使うことで最も小さい数値(最初の位置)を取得しています。これならFIND関数の結果にエラーが含まれていても数値だけを取得することができますし、すべてがエラーならエラーが取得できます。
 FIND関数の第1引数内の区切り文字が「,」ではなく「;」であることに注意してください。こうしないとFIND関数の結果が横に並んでしまうため、並べ替えが無意味となり狙った結果が得られません。