いきなり答える備忘録

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

(Gスプレッドシート)FIND関数で複数の位置、n番目の位置、最後の位置を取得する

 GoogleスプレッドシートのFIND関数は、検索文字(列)が出現する最初の位置を返します。
 これを応用して、検索文字(列)が複数回出現する場合でもすべての位置を取得する方法を紹介します。
 さらにn番目の(n回目に出現する)位置や、最後に出現する位置を取得する方法も紹介します。

  • FIND関数の第3引数(開始位置)にSEQUENCE関数を使用することで、検索文字(列)が複数ある場合でもすべての位置を取得できます。
  • さらにINDEX関数やMAX関数と組み合わせることでn番目の(n回目に出現する)位置や、最後に出現する位置を取得することもできます。

手順

すべての出現位置を取得する方法

 画像中のB3セルに入力されている文字列から「☆」がある位置をすべて取得するため、D3セルに次のように入力します。

f:id:accs2014:20200531144150p:plain:right:w780

=UNIQUE(ARRAYFORMULA(IFERROR(FIND("☆",B3,SEQUENCE(LEN(B3))),"")))

 まずFIND関数の第3引数(検索開始位置)を「SEQUENCE(LEN(B3))」とすることで、「1文字目から検索した結果」「2文字目から検索した結果」……「最後の文字から検索した結果」のすべての結果を取得します。これで「☆」が出現するすべての位置を取得できますが、値の重複も発生するためUNIQUE関数で重複を取り除いています。
 なお、最後の文字が「☆」でない場合はFIND関数の戻り値の一部がエラーになるためIFERROR関数で空文字に変換しています。よって最後の文字が「☆」でない場合には数字の後(この例の場合は次の画像のD7セル)に空文字が返されますので注意してください。
 

f:id:accs2014:20200531144154p:plain:right:w550

 結果はこうなります。

n番目の出現位置を取得する方法

f:id:accs2014:20200531144158p:plain:right:w600

 ここではD3セルに次のように入力することで、「☆」が3番目に出現する位置を取得しています。

=INDEX(UNIQUE(ARRAYFORMULA(IFERROR(FIND("☆",B3,SEQUENCE(LEN(B3))),""))),3)

 基本的に上記の例と同じですが、さらにINDEX関数を重ねることで3番目の値を取得しています。
 最後の「3」をnに変えればn番目の出現位置を取得できます。

最後の出現位置を取得する方法

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

 ここではD3セルに次のように入力することで、「☆」が最後に出現する位置を取得しています。

=MAX(ARRAYFORMULA(IFERROR(FIND("☆",B3,SEQUENCE(LEN(B3))),"")))

 これも上記の例とほぼ同じで、MAX関数を重ねることで最後の出現位置を取得しています。最大値さえ取得できればいいのでUNIQUE関数は省略でき、若干短くなっています。