いきなり答える備忘録

Google Workspace・Microsoft 365・LibreOfficeなどに関するメモ

(Excel)特定の文字までを抽出する方法

 Excelで、文字列中の特定の文字まで(特定の文字を含む)、あるいは特定の文字より前の部分を抽出する方法についてです。
 いくつかのパターンについて、LEFT/FIND関数を使う方法とTEXTBEFORE関数を使う方法をそれぞれ紹介します。

特定の文字までを抽出する

 「特定の文字のうち最初のもの」までの部分を抽出するケースです。
 はじめにLEFT/FIND関数を使う方法です。
 次の画像ではB3:B6セルに対象となる文字列が記録されています。C3セルにLEFT/FIND関数を使った式を入力しC6までフィルコピーし、最初の"特定の文字"である「☆」までを抽出しています。

 C3セル(下方にフィルコピー)

=LEFT(B3,FIND("☆",B3))

 LEFT関数の第2引数(抽出文字数)を「FIND("☆",B3)」としています。これはで文字列中の最初の「☆」の位置(○文字目)を取得できるので、「☆」までを抽出できます。
 特定の文字「☆」が含まれない場合はエラーとなります。



 続いて次の画像ではTEXTBEFORE関数を使って同じ抽出をしています。

 C3セル(下方にフィルコピー)

=TEXTBEFORE(B3,"☆")&"☆"

 TEXTBEFORE関数を用いて、第1引数に対象文字列(B3)を、第2引数に「"☆"」を指定しています。
 ただしこれで抽出されるのは指定した文字より前の部分だけなので後に「&"☆"」をつけて結果的に「☆」以降を抽出したのと同じ結果を得ています。
 TEXTBEFORE関数は新しい関数で使えるバージョンが限られるものの、簡単に抽出ができるのでおすすめです。
 なお「☆」が含まれない場合はエラーとなります。

特定の文字より前を抽出する

 「特定の文字のうち最初のもの」より前の部分を抽出する例です。
 まずはLEFT/FIND関数を使う方法です。

 C3セル(下方にフィルコピー)

=LEFT(B3,FIND("☆",B3)-1)

 基本的には一番最初の例と同様ですが、抽出文字数が「『☆』の1つ前の位置」となるのでLEFT関数の第2引数は「FIND("☆",B3)-1」となります。
 「☆」が文字列の先頭にある場合は空文字列(長さ0の文字列)が返ります。


 続いてTEXTBEFORE関数を用いる方法です。

 C3セル(下方にフィルコピー)

=TEXTBEFORE(B3,"☆")

 このように対象となる文字列と特定の文字を指定するだけで抽出ができます。
 なお「☆」が文字列の先頭にある場合は空文字列が返ります。

n番目のものまでを抽出する

 次の画像では、LEFT/FIND関数を使って、2番目の「☆」までを抽出しています。
 2番目の「☆」が存在しない場合はエラーとなります。

 C3セル(下方にフィルコピー)

=LEFT(B3,FIND("☆",B3,FIND("☆",B3)+1))

 LEFT関数の第2引数(抽出文字数)を「FIND("☆",B3,FIND("☆",B3)+1)」としています。これで2番目の「☆」の位置が求められます。
 これはFIND関数の第3引数として「検索開始位置」を指定することができ、ここを「FIND("☆",B3)+1」とすることで最初の「☆」の次の位置から検索を開始できるからです。
 ただし関数の入れ子(ネスト)となるため3番目、4番目となるにつれ式がどんどん長くなっていくのが難点です。
 なお、3番目以降を抽出する場合は「=LEFT(B3,FIND("☆",B3,FIND("☆",B3,FIND("☆",B3)+1)+1))」となります。



 次にTEXTBEFORE関数を使う方法です。

 C3セル(下方にフィルコピー)

=TEXTBEFORE(B3,"☆",2)&"☆"

 第3引数として「2」と指定するだけで、指定した特定の文字「☆」のうち2番目より前の部分を抽出できます。もちろん3番目以降も同様で、とても簡単です。
 ただしn番目の「☆」は抽出に含まれないので「&"☆"」でつなげています。

n番目のものより前を抽出する

 次の画像ではLEFT/FIND関数を使って、2番目の「☆」より前の部分を抽出しています。

 C3セル(下方にフィルコピー)

=LEFT(B3,FIND("☆",B3,FIND("☆",B3)+1)-1)

 LEFT関数の第2引数(抽出文字数)を「FIND("☆",B3,FIND("☆",B3)+1)-1」つまり「2番目『☆』の位置の1つ前」としています。詳細は上記の「n番目のものまでを抽出する」の例と同様ですのでそちらをご覧ください。
 やはり3番目、4番目とするにつれて式がどんどん長く複雑になるのが難点です。



 続いてTEXTBEFORE関数の例です。

 C3セル(下方にフィルコピー)

=TEXTBEFORE(B3,"☆",2)

 同様に3番目以降の指定が可能で、式が長くなることもありません。

最後のものまでを抽出する

 「特定の文字のうち最後のもの」までを抽出する例です。
 まずはLEFT/FIND関数を使う方法です。

 C3セル(下方にフィルコピー)

=LEFT(B3,FIND("★",SUBSTITUTE(B3,"☆","★",LEN(B3)-LEN(SUBSTITUTE(B3,"☆","")))))

 ここが難しいところです。
 LEFT関数の第2引数(抽出文字数)が非常に長くなっています。これは次のようにして「☆」のうち最後のものの位置を求めます。

  1. 文字列中の「☆」の数(この数をnとする)を求める。
  2. 文字列中の「☆」のうちn番目(つまり最後のもの)だけを「★」に置き換える。
  3. FIND関数で「★」の位置を求める。
 さらに置換先の文字である「★」が元の文字列に含まれていると意図しない結果になりますので、この置換先文字は元の文字列に含まれないものを選ぶ必要があります。



 続いてTEXTBEFORE関数の例です。

 C3セル(下方にフィルコピー)

=TEXTBEFORE(B3,"☆",-1)&"☆"

 第3引数を「-1」とすることで「最後のもの」の位置を指定できます。
 同様に「-2」とすれば最後から2番目を指定でき、「-3」とすれば最後から3番目を指定できます。

最後のものより前を抽出する

 まずはLEFT/FIND関数を使う方法です。

 C3セル(下方にフィルコピー)

=LEFT(B3,FIND("★",SUBSTITUTE(B3,"☆","★",LEN(B3)-LEN(SUBSTITUTE(B3,"☆",""))))-1)

 これもやはり式が長くなります。
 詳しくは上記の「最後のものまでを抽出する」と同様で、第2引数の最後に「-1」が加わっていることだけが異なる点です。



 最後にTEXTBEFORE関数のケースです。

 C3セル(下方にフィルコピー)

=TEXTBEFORE(B3,"☆",-1)