Excel。SUBSTITUTE関数は文字列中の特定の文字を別の文字に置換する
<関数辞典:SUBSTITUTE関数>
SUBSTITUTE関数
読み方: サブスティチュート
分類: 文字列操作
SUBSTITUTE(文字列,検索文字列,置換文字列,[置換対象])
文字列中の特定の文字を別の文字に置換する
【Excel・Word・PowerPoint・Access】あなたの「困った」を解決!10年以上の経験が詰まった、現場の疑問から生まれた実践テクニック集。作業効率を劇的に上げるOffice活用術をお届けします。
SUBSTITUTE関数
読み方: サブスティチュート
分類: 文字列操作
SUBSTITUTE(文字列,検索文字列,置換文字列,[置換対象])
文字列中の特定の文字を別の文字に置換する
表のB列には、会議参加者の氏名が入力されています。
そして、氏名は、「,(カンマ)」で区切られています。
その氏名の人数を、C列に求めたい場合、どのようにしたら、手早く求めることができるのでしょうか。
COUNTIF関数は、セル対象であり、セル内の文字数を求めることは出来ないからです。
そこで、全体の文字数から「,」を除いた文字数を減算すれば、「,」の数を求めることができます。
その値に「+1」すれば、「,」で区切られた文字列数を求めることができます。
=LEN(B2)-LEN(SUBSTITUTE(B2,",",""))+1
これで、「,」で区切られた文字列数を求めることができました。
では、この数式の仕組みを確認しましょう。
=LEN(B2)-LEN(SUBSTITUTE(B2,",",""))+1
LEN関数は、セル内の文字数を求めることができる関数です。
最初に、セル内の文字列数を求めました。
SUBSTITUTE(B2,",","")
SUBSTITUTE関数は、置換してくれる関数です。
「,」を「””(空白)」に置換します。
そして、LEN関数をつかうことで、「,」を除いた文字数を求めることができます。
全体の文字数から「,」を除いた文字数を減算すれば、「,」の数を求めることができるというわけです。
そして、文字列と文字列の間に「,」がありますので、「+1」することで、「,」で区切られた文字列数を求めることができるというわけです。
セル内の余計な空白を削除するには、TRIM関数という便利な関数が用意されていますが、それだけでは、対応することができません。
TRIM関数は、前後の余計な空白と、文字内の連続している空白を1つだけにします。
C2には、
=TRIM(A2)
と数式を設定して、オートフィルで数式をコピーします。
どのデータも前後の空白は削除されていますし、文字内の空白にも対応しています。
ですが、よくみると、C3やC5は、半角空白にならず、全角空白になっています。
TRIM関数では、半角文字を全角文字にするまでは、やってくれません。
そこで、文字を置換することができるSUBSTITUTE関数を合わせてつかうことで、対応することができます。
=TRIM(SUBSTITUTE(A2," "," "))
あとは、オートフィルで数式をコピーすれば完成です。
SUBSTITUTE(A2," "," ") の説明をします。
最初の引数は、文字列。A2を選択します。
2番目の引数は、検索文字列。” “と全角空白を設定します。
3番目の引数は、置換文字列。” “と半角空白を設定します。
資料を作ろうとしても、データがガタガタだと作成することができませんので、綺麗に整えるスキルを知っておくのもいいかもしれませんね。
今回は、STEYX関数~SUBTOTAL関数までをご紹介しております。
STEYX関数
読み方: スタンダードエラーワイエックス
STEYX(既知のy,既知のx)
回帰直線の標準誤差を算出する
STOCKHISTORY関数
読み方: ストックヒストリー
STOCKHISTORY(stock,start_date,[end_date],[interval],[headers],[properties1],…)
指定された銘柄と日付範囲の過去の相場データの配列を返す
SUBSTITUTE関数
読み方: サブスティチュート
SUBSTITUTE(文字列,検索文字列,置換文字列,[置換対象])
文字列中の特定の文字を別の文字に置換する
SUBTOTAL関数
読み方: サブトータル
SUBTOTAL(集計方法,参照1,…)
11種類の集計方法で小計を算出します
データを読み込んでみたら、そのあとの作業がスムーズにできないで困るケースがあります。
例えば、年月日がセルごとにわかれているのですが、それぞれに、年・月・日という文字も含まれているために、DATE関数をつかって、手早く日付にすることができません。
「2023年」のように「年」が含まれていると、文字型になってしまいます。
左揃えになっていることからも、文字型になっていることがわかります。
当然、DATE(a2,b2,c2)としても、エラーが表示されてしまうだけで、日付にすることができません。
置換処理で、「年」とかの文字を空白にしてもいいですが、少し面倒です。
そこで、置換することができる関数であるSUBSTITUTE関数をDATE関数と組み合わせてつかうことで、解決することができます。
D2に次の数式を設定します。
=DATE(SUBSTITUTE(A2,"年",""),SUBSTITUTE(B2,"月",""),SUBSTITUTE(C2,"日",""))
オートフィルで数式をコピーしています。
「SUBSTITUTE(A2,"年","")」を説明します。
SUBSTITUTE関数の最初の引数は、文字列なので、A2を設定します。
2つ目の引数は、検索文字列。年という文字を削除したいので、「”年”」と設定します。
3つ目の引数は、置換文字列。年を削除したいので「””」とすることで、年を消すことができます。
これを、「月」と「日」にも同じように設定してきます。
セルに入力されているデータによっては、簡単に日付にすることができないこともありますので、すんなり日付にできない時には、文字型になっていないかを確認するところから始めてみるといいかもしれませんね。
テキストファイルなどをインポートして、データを読み込んでみたら、セル内に余計な空白がアチラコチラ入っている。
その空白も、全角や半角が混じっているし、文字と文字の間は半角空白を一つだけで揃えたいといった場合、どのようにしたら、手早く、データを綺麗にすることができるのでしょうか。
サンプルの表をつくってみました。
=TRIM(SUBSTITUTE(B1," "," "))
という数式を設定しました。
その数式をオートフィルで数式をコピーしてD2まで設定しています。
TRIM関数は、セルの前後にある空白を削除してくれます。
これで、B1のようなパターンでは、前後の空白を削除してくれます。
そして、このTRIM関数は、文字と文字の間の空白が複数ある場合は1つだけ残して削除してくれる便利機能も付いているので、B1のように、全角空白2文字の場合は、全角空白1文字にしてくれます。
なお、半角空白と全角空白の組み合わせでも、空白1文字残してくれます。
空白を削除するだけならば、TRIM関数だけでいいのですが、半角空白で揃えたいので、SUBSTITUTE関数をつかって、半角空白に揃えていきます。
SUBSTITUTE関数は、指定した文字に置換してくれる関数です。
文字と文字の間の空白は、半角空白にしたいので、全角空白を半角空白に置換するように引数を設定してあげるだけで、文字の前後の空白と、文字と文字の間の空白を半角空白にすることができました。
データを読み込んでみたら、次のようになっていました。
区切る場所がわからないので、簡単にわけることができません。
データタブの「フラッシュフィル」をつかったところで、区切るポイントがExcel側としても判断できないので、処理はできません。
Excel VBAでプログラムならばと考えても、区切る位置がわからないので、自動的に区切ることができません。
要するに、このようなデータを分割するには、区切りになる場所は、自分自身で用意しなければいけないわけです。
そこで、氏名フィールドのデータに区切り位置を表す、半角や全角のスペースを入力し修正するのは、面倒です。
そこで、別の列。
今回は、F列に、区切り位置の数値を用意します。
C2には、
=LEFT(A2,F2)
と数式を設定したら、オートフィル機能をつかって、数式をコピーします。
続いて、名フィールドの算出方法ですが、SUBSTITUTE関数をつかうと、別の列に色々算出しないで、スマートに名フィールドに、名前を算出することができます。
D2に次の数式を設定します。
=SUBSTITUTE(A2,C2,"")
数式をコピーします。
SUBSTITUTE関数をつかうと、なぜ、名前を抽出することができたのかを確認していきます。
SUBSTITUTE関数は、指定した文字列を置換することができる関数です。
SUBSTITUTE関数の引数は、
SUBSTITUTE(文字列,検索文字列,置換文字列,[置換対象])
となっています。
文字列には、A2。「伊藤博文」という文字が対象です。
検索文字列には、C2。先程算出した、苗字を検索するわけです。
置換文字列には、「””」。「””」は空白という意味なので、苗字のところを空白に置換することができます。
苗字が空白になるので、残ったのが名前という仕組みです。
SUBSTITUTE関数は、色々使える重宝な関数です。
また、手順は増えてしまいますが、SUBSTITUTE関数を使う方法以外にも、RIGHT関数を使う方法もあります。
氏名フィールドの文字数をLEN関数で算出して、その数値を、F列の区切り位置の数値を減算すると、名前の文字数が算出できます。
あとは、算出結果をつかってRIGHT関数で名前を抽出する方法もあります。
Excelのデータは、分割よりも結合するほうが、簡単なので、できれば、最初から、姓と名を分けておくことをおススメします。
Microsoft TeamsやOutlookなどでスタッフ全員の会議参加日時をみつけることが、比較的容易に出来るようになりましたが、これをExcelでやりたい場合はどのようにしたらいいのでしょうか?
スタッフさん個人個人のシートが用意されています。
今回は、3人分のシートですが、人数が増えるとか、項目がもっと細かく区分けされていたら、目視で確認するのは、とても大変な作業だといえます。
これからご紹介する数式をつかうと、このような結果が表示されます。
では、どのような数式をつくったのか、B4の数式をみてみましょう。
=IF(LEN(SUBSTITUTE(CONCAT(内藤:北沢!B4),"×",""))=3,"OK","")
ちょっと長い数式ですが、関数ごとに確認していきましょう。
数式の内側から確認していきます。
最初の登場する関数は、「CONCAT関数」。
文字結合する関数です。
CONCATENATE関数の進化系ですね。
CONCAT関数のところだけを算出してみます。
B4に、
=CONCAT(内藤:北沢!B4)
という数式を設定しました。
CONCAT関数が便利なところは、シート間で対応できるのと、範囲選択するだけで、文字結合できる点です。
スタッフごとのシートのB4の文字を結合させた結果が表示されています。
「○」が3個あれば、全員参加というのがわかるのですが、人数が多いと「○×」だらけで見つけるのも大変です。
そこで、「SUBSTITUTE関数」をつかって、「×」を消す作業をします。
そうすれば、「○」だけ残るので、見やすくなります。
B4の数式を
=SUBSTITUTE(CONCAT(内藤:北沢!B4),"×","")
と変更します。
SUBSTITUTE関数は、置換する関数です。
「×」を空白に置換するように数式を変更してみましょう。
「×」が消えて「○」だけが残りました。
「○」だけ残ったのですが、「○」が3個あれば、「OK」と表示するように修正すれば、もっとわかりやすくなります。
そこで、次のように修正します。
=IF(LEN(SUBSTITUTE(CONCAT(内藤:北沢!B4),"×",""))=3,"OK","")
LEN関数は、文字の数を算出する関数です。
「○」の数を算出します。
最後に、
IF関数をつかって、
LEN関数の結果が3(文字)だったら、「OK」と表示する
というように設定すれば、完成というわけですね。
新しく加わった関数をつかうことで、今までは算出するのに苦労していたことが改善できるかもしれませんので、数式を見直してみるのもいいのかもしれませんね。
月ごとに集計されているシートがあります。
今回のケースは、サンプルなので、2枚のシートですんでいますが、年間となれば12枚のシートですし、もっと多くのシートからデータをコピーする必要があるとすれば、面倒な作業となってきます。
Excel VBAでプログラムをつくってもいいのですが、数式レベルで、効率よくコピーする方法はないのでしょうか?
このような場合、どのようなパターンがあるのか、ないのかを見つけるところから考えていくといいですね。
集計先のシートのB2に、セル参照の数式を設定してみましょう。
となっています。
横方向に、オートフィルで数式をコピーすれば、
='1月'!C5
='1月'!D5
と、横方向は、うまく参照結果が表示されていますが、縦方向にオートフィルで数式をコピーしても、当たり前ですが、うまくいきません。
理由は、シート名が違うからです。
シート名を変更する”だけ”かもしれませんが、とても面倒な作業です。
よくみると、シート名と、A列のデータが同じになっています。
シート名をA列に入力されている値そのものを使うことができれば、上手くいきそうです。
そこで、登場するのが、「INDIRECT関数」です。
B2にINDIRECT関数をつかって、次のような数式に変更してみましょう。
=INDIRECT($A2&"!b5")
この関数は、
='1月'!B5
という数式をどうやったらつくれるのかをイメージして作る関数です。
A2に1月という文字があるので、それをつかいたいわけです。
オートフィルで数式をコピーすることを前提としていますので、列固定の複合参照にしています。
そして、「&(アンパサンド)」で「"!b5"」という文字を結合させています。
縦方向に、オートフィルで数式をコピーすると、きちんと参照してくれたのですが、横方向にオートフィルで数式をコピーしたら、うまくいきません。
原因は、「"!b5"」。
文字になってしまっているので、オートフィルで数式をコピーしても「b」が「C」に自動的に変わってくれることはありません。
本当は、変わってくれれば、いいのですが…
そこで、どうやったら、「b」を「c」に出来るのかを考えて、B2の数式を次のように修正しました。
=INDIRECT($A2&"!"&SUBSTITUTE(LEFT(CELL("address",B1),2),"$","")&5)
なんか、長くなっちゃいましたが、この数式を、縦方向。
横方向にオートフィルで数式をコピーすると、綺麗に、参照することができました。
では、この長くなった数式の説明をしてきます。「b」を「c」にするための数式が、
SUBSTITUTE(LEFT(CELL("address",B1),2),"$","")
です。
内側から説明しないと、わからないので、最初は、CELL("address",B1)
CELL関数は、セルの情報を算出してくれる関数で、引数にaddressをつかうと、絶対参照がついたセル番地を文字として、算出してくれます。
B1のセル情報なので、「$B$1」という文字が算出されます。
LEFT(CELL("address",B1),2)
は、LEFT(“$B$1”,2)ということなので、LEFT関数をつかって、左から2文字分を抽出します。
これで、「$B」という文字が算出されています。
「$AA$1」だったら3文字分を抽出する必要があります。
SUBSTITUTE($B,"$","") という状態になっていることがわかります。
SUBSTITUTE関数は、置換することが出来る関数なので、「$」を空白に置換させます。
これで、「B」だけを抽出することができるます。
ということで、シート名を参照できるセルをつくることで、INDIRECT関数をつかうことで、別シートから必要なデータを参照することができます。
ある商品の評価結果の資料があります。
これでは、Aが何件、Bが何件と数えたい場合、目視で確認するしか方法はないのでしょうか?
左から1文字目は、A。
2文字目はBとセルに文字をいれる数式をつくってから、数えるという考え方もありますし、あるいは、Excel VBAでマクロをつくるという方法もあるとは思いますが、LEN関数・SUBSTITUTE関数をつかうだけで、簡単に、セル内に同じ文字がいくつあるのか算出することができるのです。
LEN関数・SUBSTITUTE関数をつかった数式をつかうことで、次のように集計することができます。
C2につくった数式は、
=LEN($B2)-LEN(SUBSTITUTE($B2,C$1,""))
この数式を、オートフィルで数式をコピーすれば、セル内の同じ文字がいくつあるのかを簡単に算出することができます。
この数式を説明しておきましょう。
LEN($B2)は、B2のセル内の文字数を算出しています。
LEN関数はセル内の文字を数える関数ですね。
セル内の文字数から、LEN(SUBSTITUTE($B2,C$1,""))を減算しています。
LEN(SUBSTITUTE($B2,C$1,""))を見ていきましょう。
最初のLEN関数は、文字を数える関数でした。
何を数えているのかというと、SUBSTITUTE($B2,C$1,"")
SUBSTITUTE関数は、指定した文字を置換する関数です。
B2の中にある、C1=「A」を、「””」=空白に置換させています。
H2に、
=SUBSTITUTE(B2,"A","")
の結果を見ると、何をやっているのかがわかります。
この文字数を数えて、Aも含めた最初のLEN関数で算出したあたいから、減算すれば、「A」がいくつあったのかがわかるという仕組みです。
発想としては、どうしても「A」を残すように考えてしまいますが、Aだけを残すというのが、難しいので、逆転の発想で、算出させてみました。
今回のように、全体の数から減算するというのは、よくある方法ですので、覚えておくと、いざという時にいいのかもしれませんね。
なお、同じようなパターンとしては、「○」「×」で、「○」の数はいくつなのかということもできます。
2種類の場合は、一つ算出できれば、おのずと、もう一つも算出されるので、今回のケースよりも、もっと簡単に算出することもできます。
ある商品の評価結果の資料があります。
これでは、Aが何件、Bが何件と数えたい場合、目視で確認するしか方法はないのでしょうか?
左から1文字目は、A。
2文字目はBとセルに文字をいれる数式をつくってから、数えるという考え方もありますし、あるいは、Excel VBAでマクロをつくるという方法もあるとは思いますが、LEN関数・SUBSTITUTE関数をつかうだけで、簡単に、セル内に同じ文字がいくつあるのか算出することができるのです。
LEN関数・SUBSTITUTE関数をつかった数式をつかうことで、次のように集計することができます。
どのような数式をつくるといいのかを確認していきましょう。
C2につくった数式は、
=LEN($B2)-LEN(SUBSTITUTE($B2,C$1,""))
この数式を、オートフィルで数式をコピーすれば、セル内の同じ文字がいくつあるのかを簡単に算出することができます。
この数式を説明しておきましょう。
LEN($B2)は、B2のセル内の文字数を算出しています。
LEN関数はセル内の文字を数える関数ですね。
セル内の文字数から、LEN(SUBSTITUTE($B2,C$1,""))を減算しています。
LEN(SUBSTITUTE($B2,C$1,""))を見ていきましょう。
最初のLEN関数は、文字を数える関数でした。
何を数えているのかというと、
SUBSTITUTE($B2,C$1,"")
SUBSTITUTE関数は、指定した文字を置換する関数です。
B2の中にある、C1=「A」を、「””」=空白に置換させています。
H2に、
=SUBSTITUTE(B2,"A","")
の結果を見ると、何をやっているのかがわかります。
この文字数を数えて、Aも含めた最初のLEN関数で算出したあたいから、減算すれば、「A」がいくつあったのかがわかるという仕組みです。
発想としては、どうしても「A」を残すように考えてしまいますが、Aだけを残すというのが、難しいので、逆転の発想で、算出させてみました。
今回のように、全体の数から減算するというのは、よくある方法ですので、覚えておくと、いざという時にいいのかもしれませんね。
なお、同じようなパターンとしては、「○」「×」で、「○」の数はいくつなのかということもできます。
2種類の場合は、一つ算出できれば、おのずと、もう一つも算出されるので、今回のケースよりも、もっと簡単に算出することもできます。
やりたいことは簡単でも、それをどうやって「数式化」したらいいのか、悩むケースがあります。
例えば、テキストファイルなどデータが送られてきて開いてみたら、セル内に○×の結果が詰まっていたというのが次の表。
そのデータに○がいくつ含まれているのか?
×はいくつ含まれているのか?ということを知りたい場合、目視で数えるというのは、大変以外の何物でもありません。
Excel VBAでマクロを作成するとか、あるいは、一文字ごと、セルひとつずつに、○や×を入力し直すというのも大変ですし、MID関数とか使うのも面倒です。
今回のような場合、LEN関数とSUBSTITUTE関数のコンビネーションで、比較的簡単に問題を解決することができるのです。
とりあえず、D2にLEN+SUBSTITUTE関数のネストの数式を作ってみましょう。
D2に作る数式は、
=LEN(SUBSTITUTE(B2,"×",""))
E2の数式は、D2でつくった数式と異なります。
E2の数式は、
=LEN(B2)-D2
あとは、オートフィルで数式をコピーしてみましょう。
仮に、○×▲のような3つであっても、作り方としては、同じです。
それでは、数式を確認していくことにしましょう。
D2に設定した数式。
=LEN(SUBSTITUTE(B2,"×",""))
LEN関数は、セル内の文字数を算出する関数です。
単純に=LEN(B2)とすれば、10と返してくれるわけです。
では、引数でつかっている、
SUBSTITUTE(B2,"×","")
を確認していきます。
SUBSTITUTE関数は、検索した文字を、希望する文字に置換してくれる関数です。
今回は、「×」を「””」つまり空白に置換させているわけです。
考え方のポイントとして、「○」だけ数えるには、「×」がなければいいわけです。
文字数を数えてくれる関数は、LEN関数というのがあるわけですから、「○」だけにしたい。
だったら、「×」を消しちゃえばいいのでは、という発想したわけです。
だから、「×」を「空白」にするために、SUBSTITUTE関数をつかったというわけです。
B2のセルは、×が3個あるので、それが3個の空白に置換されるわけですから、残った文字数を数えれば算出されるというわけです。
「○」の数がわかれば、あとは、全体から「○」の数を減算すれば、「×」の数を算出することができるわけですから、E2の数式は、
=LEN(B2)-D2
となるわけですね。
文字関係は、色々なアイディアで、算出したり、変えたりすることができますので、文字列関係の関数を知っておくといいのかもしれませんね。