いきなり答える備忘録

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

(Excel)テキスト中の複数種類の文字列を一括削除する

 Excelで、テキスト中の複数種類の文字列をすべて削除する方法です。
 置換と同様にSUBSTITUTE関数を使う方法と、TEXTSPLIT関数を使った方法を紹介します。

SUBSTITUTE関数をネスト(入れ子)する方法

 単純ですが削除対象となる文字列が多いと手間がかかる方法です。
 次の画像ではB3:B5の範囲に削除対象となる3種の文字列が入力されています。
 E3セルにSUBSTITUTE関数を使った式を入力し、D3セルのテキストから3種の文字列を削除した結果を取得しています。 

 E3セル

=SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(D3,B3,""),B4,""),B5,"")

 SUBSTITUTE関数の置換先文字列(第3引数)を「""」とすることで結果的に文字列の削除を行っています。
 また、SUBSTITUTE関数ネスト(入れ子)にすることで内側の削除結果(テキスト)を外側の関数に渡し、複数種類の文字列削除を行っています。
 削除対象が2,3種ならまだいいものの、4種とか5種になると式が長くなり見づらくなるのが欠点です。


 
 次の画像では、上記の式中の「D3」を「D3:D7」に置き換えることで5つのテキストに対する一括削除を行っています(スピル)。
 1つの削除対象文字列が複数含まれている場合もすべて削除されます(D4→E4セルの例)。これは以下の方法でも同じ結果になります。

 E3セル

=SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(D3:D7,B3,""),B4,""),B5,"")

SUBSTITUTE関数とREDUCE/LAMBDA関数を使う方法

 式のネストと同様の効果が得られるREDUCE/LAMBDA関数を使う方法です。
 次の画像ではE3セルにSUBSTITUTE関数とREDUCE/LAMBDA関数を使った式を入力して、3種の文字列を削除した結果を得ています。

 E3セル

=REDUCE(D3,B3:B5,LAMBDA(a,b,SUBSTITUTE(a,b,"")))

 ちょっと複雑な式ですが、D3セルをaと名付け、B3:B5セルの範囲をbと名付けています。そしてbの1つ1つのセルをSUBSTITUTE関数の置換(削除)対象として実行することで3種の文字列を削除した結果を得ています。SUBSTITUTE関数の実行結果が次のSUBSTITUTE関数の実行の際にaとして参照されることがポイントで、これによりネストと同じ結果が得られます。
 REDUCE/LAMBDA関数の機能を理解するのが難しいものの、削除対象が増えても参照範囲を変えるだけで済むので式が長くなりません。



 次の画像では上記の式の「D3」を「D3:D7」に変えて5つの結果を一括取得しています。
 上記の式より先にこの式を見ると、さすがに何をやっているのかわかりにくいかもしれません。

 E3セル

=REDUCE(D3:D7,B3:B5,LAMBDA(a,b,SUBSTITUTE(a,b,"")))

TEXTSPLIT関数を使う方法

 比較的新しい関数であるTEXTSPLIT関数を使った方法です。
 意表を突くやり方ですが、わかりやすくて式が短く済むのがメリットです。

 E3セル

=CONCAT(TEXTSPLIT(D3,B3:B5))

 TEXTSPLIT関数は区切り文字を指定してテキストを分割する関数ですが、区切り文字を複数種類指定することができます。これを利用してB3:B5セルの3種の文字列を区切り文字として分割することで、3種の文字列を削除しています。
 あとは分割されたテキストをCONCAT関数で再度結合してしまえば文字列を削除した結果だけが得られるというわけです。



 ただし他の方法のように「D3」を「D3:D7」に置き換えても結果の一括取得ができず、おかしな結果になります。
 これはTEXTSPLIT関数が完全にはスピルに対応していないことと、CONCAT関数が全体(5行)のテキストを結合してしまうことが原因です。



 これには絶対参照を使って対応するのが無難です。

 E3セル(下方にコピー)

=CONCAT(TEXTSPLIT(D3,B$3:B$5))

 

 なお、上記のようにスピルさせようとした結果がおかしくなる理由については次の記事で触れています。
 どうしても1つの式で一括取得したい場合にも参考になるかもしれません。

www.officeisyours.com



 ところで、このTEXTSPLIT関数を使う方法にはちょっとした特徴があります。
 次の画像では「東京」と「東京都」という2種類の文字を削除対象にしています。
 上記例のようにSUBSTITUTE関数を使う方法の場合、先に「東京」を削除してから「東京都」を削除しようとするので「都」の字が残ってしまうのですが、TEXTSPLIT関数を使う方法だとそのような順序が存在しないため「都」が残るということがありません。
 つまり削除する文字列どうしの包含を気にせず対象として指定することができます。

 


 もちろん削除対象文字列の順序を変えても結果は同じです。