目次
このチュートリアルでは、Excelで数式と抽出ツールを使って、さまざまなテキスト文字列から数値を抽出する方法を紹介します。
Excelには、文字列の一部を抽出するための3つの関数(左、右、中央)が用意されています。 しかし、英数字の文字列から数字を抽出する場合、Microsoft Excelは何も提供しません。
Excelで文字列から数値を得るには、ちょっとした工夫と忍耐が必要です。 また、抽出ツールを実行すれば、マウスをクリックするだけで作業が完了します。 以下では、両方の方法について詳しく説明します。
文字列の末尾から数字を抽出する方法
英数字の文字列で、テキストの後に数字が来る列がある場合、次の式で求めることができます。
RIGHT( セル , LEN( セル ) - 最大値(if(isnumber(mid( セル , ROW(INDIRECT("1:"&LEN()。 セル )), 1) *1)=FALSE, ROW(INDIRECT("1:"&LEN( セル ))), 0)))この式のロジックについては後ほど詳しく説明しますが、ここでは単純に セル を元の文字列のあるセル(この例ではA2)を参照して、同じ行の任意の空のセル(例えばB2)に数式を入力します。
=RIGHT(A2, LEN(A2) - MAX(IF(ISNUMBER(MID(A2, ROW(INDIRECT("1:"&LEN(A2))), 1) *1)=FALSE, ROW(INDIRECT("1:"&LEN(A2)))), 0)))
この式は、末尾からしか数字を取得しません。 文字列の先頭や途中にも数字がある場合、それらは無視されます。
抽出は,Text 関数のカテゴリに属する RIGHT 関数で行う。 この関数の出力は常に テキスト この場合、結果は 数値部分文字列 というのは、Excelで言えば、数字ではなくテキストでもある。
という結果が必要な場合は 番号 (次の計算で使える) 式を VALUE 関数で囲むか、結果を変えない算術演算、たとえば 1 をかけたり 0 を加えたりします。 単一の数値を含まない文字列のエラーを検出するには、IFERROR 関数を使用します。 たとえば
=IFERROR(VALUE(RIGHT(A2, LEN(A2) - MAX(IF(ISNUMBER(MID(A2, ROW(INDIRECT("1:"&LEN(A2))), 1)*1)=FALSE, ROW(INDIRECT("1:"&LEN(A2))), 0))), "")
または
=IFERROR(RIGHT(A2, LEN(A2) - MAX(IF(ISNUMBER(MID(A2, ROW(INDIRECT("1:"&LEN(A2))), 1) *1)=FALSE, ROW(INDIRECT("1:"&LEN(A2))), 0))) +0, "")
注)動的配列Excel(Office 365、2021)では、通常の方法でEnterキーで数式を入力します。 Excel 2019以前では、配列数式としてしか機能しないので、Ctrl + Shift + Enterキーで完了させることを忘れないでください。
この処方の仕組み
英数字の文字列から数字を取り出すには、まず、どこから取り出すかを知る必要があります。 文字列中の最後の非数字の位置は、このトリッキーな式の助けによって決定されます。
MAX(IF(ISNUMBER(MID(A2, ROW(INDIRECT("1:"&LEN(A2))), 1)*1)=FALSE, ROW(INDIRECT("1:"&LEN(A2)))), 0))
そのロジックを理解するために、内側から調査してみよう。
ROW(INDIRECT("1:"&LEN(A2))) の組み合わせで、ソース文字列(A2)の文字数の合計に対応する数字の列を作り、この連番を開始番号としてMIDに提供するのです。
mid(a2, {1;2;3;4;5;6;7;8}, 1)
MID関数は、A2から個々の文字を取り出し、配列として返します。
{"0";"5";"-";"E";"C";"-";"0";"1"}
MIDはテキスト関数なので、その出力は常にテキストです(お気づきのように、すべての文字は引用符で囲まれています)。 数字の1を数字に変えるには、配列を1倍します(二重否定 --MID()も同じ効果です)。 この操作の結果は、数字の配列と数字以外の文字を表す#VALUE! エラーになります。
isnumber({0;5;#value!;#value!;#value!;#value!;0;1})
ISNUMBER関数は、配列の各要素を評価し、その結果をブール値(数値の場合はTRUE、それ以外の場合はFALSE)で示します。
{true;true;false;false;false;true;true} です。
この配列はIF関数の論理テストに送られ、配列の各要素がFALSEと比較されます。
IF({TRUE;TRUE;FALSE;FALSE;FALSE;TRUE;TRUE}=FALSE, ROW(INDIRECT("1:"&LEN(A2)))), 0)
FALSE(非数値)に対しては、別のROW(INDIRECT())関数で、文字列内の相対位置を返す。 TRUE(数値)に対しては、0を返す。 結果の配列は次のようになる。
{0;0;3;4;5;6;0;0}
MAX関数は、上記の配列の中で最も大きな数値、つまり文字列中の最後の非数値(この例では6)の位置を求めます。 LENが返す文字列の全長からその位置を引き、その結果をRIGHTに渡して文字列の右側から抽出する文字数を知らせればいいだけです。
右(a2, len(a2) - 6)
完了!
文字列の先頭から数字を抽出する方法
数字の後にテキストが表示されるレコードを扱う場合、この一般的な数式を使用すると、文字列の先頭から数字を抽出することができます。
左側( セル , match(false, isnumber(mid() セル , ROW(INDIRECT("1:"&LEN()。 セル )+1)), 1) *1), 0) -1)A2に元の文字列を入れ、以下の計算式で数値を求めます。
=LEFT(A2, MATCH(FALSE, ISNUMBER(MID(A2, ROW(INDIRECT("1:"&LEN(A2)+1)), 1) *1), 0) -1)
途中や末尾に何桁の数字があっても、開始番号だけを抽出する。
注)Excel 365とExcel 2021では、動的配列のサポートにより、通常の数式で問題ありません。 Excel 2019以前では、Ctrl + Shift + Enterキーを押して、明示的に 配列式 .
この処方の仕組み
ここでもROW、INDIRECT、LEN関数を組み合わせて、ソース文字列の文字数の合計に1を加えた数値の列を作成しています(この追加文字の役割は後で少し明らかになります)。
ROW(INDIRECT("1:"&LEN(A2)+1))の場合
MIDとISNUMBERは前の例と同じ働きをします。 MIDは個々の文字を取り出し、ISNUMBERはそれを論理値に変換します。 結果としてのTRUEとFALSEの配列は、ルックアップ配列としてMATCH関数に送られます。
match(false, {true;true;false;false;false;false;true;false}, 0)
MATCHは、最初のFALSEの相対位置を計算し、文字列中の最初の非数字の位置(A2の3)を与える。 直前の数字を抽出するために、最初のテキスト文字の位置から1を引き、その差を、A2の3に与える。 num_chars の引数は、LEFT 関数です。
LEFT(A2, 3-1)
さて、ROW(INDIRECT()+1))で生成されたシーケンスにある「余分な」文字に戻ります。 すでにご存知のように、このシーケンスはMID関数の開始点を提供します。 +1なしでは、MIDは元の文字列にあるのと同じ数の文字を抽出します。 文字列に数字だけが含まれている場合、ISNUMBERは真だけを返し、MATCHには少なくとも一つの偽を必要とします。 それを確実にするには、1つ追加します。を追加すると、MID関数は空文字列に変換します。 例えば、B7では、MIDは次のような配列を返します。
{"1"; "2"; "3"; "4";""}
注)RIGHT関数と同様に、LEFTでも 数値部分文字列 結果を数値文字列ではなく数値として得るには、VALUE関数の中で式を入れ子にするか、最初の例のように結果を1倍してください。
文字列の任意の位置から数値を取得する方法
文字列の任意の位置から数値を抽出する場合、MrExcelフォーラムで公開されている次のような気の遠くなるような数式を利用することができます。
=SUMPRODUCT(MID(0&A2, LARGE(INDEX(ISNUMBER(--MID(A2, ROW(INDIRECT("1:"&LEN(A2))), 1) * ROW(INDIRECT("1:"&LEN(A2))), 0), ROW(INDIRECT("1:"&LEN(A2))) +1, 1) * 10^ROW(INDIRECT("1:"&LEN(A2)))/10))
ここで、A2 は元のテキスト文字列である。
この数式を詳しく説明するには別の記事が必要なので、ワークシートにコピーして本当に機能するのか確認してみてください :)
ソース文字列に数字が含まれていない場合、数式は上のスクリーンショットの6行目のように0を返します。 これを解決するには、数式をIF文で囲み、ソース文字列に数字が含まれているかどうかを論理テストでチェックします。 もし含まれていれば数式はその数字を抽出し、そうでなければ、空のの文字列を表示します。
=IF(SUM(LEN(A2)-LEN(SUBSTITUTE(A2, {"0","1","2","3","4","5","6","7","8","9"}, "")))>0, SUMPRODUCT(MID(0&A2, LARGE(INDEX(ISNUMBER(--MID(A2,ROW(INDIRECT("$1:$"&LEN(A2))),1))* ROW(INDIRECT("$1:$"&LEN(A2))),0), ROW(INDIRECT("$1:$"&LEN(A2))))+1,1) * 10^ROW(INDIRECT("$1:$"&LEN(A2)))/10),"")
下のスクリーンショットに示すように、改良された数式は見事に動作します(この改良を行ったExcelの第一人者であるAlexに敬意を表します)。
これまでのすべての例と異なり、この式の結果は 番号 B列の値が右寄せになり、先頭の0が切り捨てられることに注目すれば、このことが確認できる。
ヒント Excel 365 - Excel 2019では、TEXTJOIN関数の助けを借りて、よりシンプルな解決策があります。 テキストを削除して数字を残す方法」をご覧ください。
Ultimate Suiteで文字列から番号を抽出する
このように、Excelには文字列から数値を取得する簡単な数式はありません。 数式を理解したり、データセットに合わせて数式を調整するのが難しい場合は、Excelで文字列から数値を取得するこの簡単な方法をお勧めします。
Excelのリボンに追加されたUltimate Suiteを使えば、どんな英数字の文字列からでも、素早く数字を取り出すことができます。
- に行ってみてください。 エイブルビットのデータ tab> テキスト をクリックします。 抜粋 :
- ソース文字列を含むすべてのセルを選択します。
- 抽出ツールのペイン上で 抽出番号 ラジオボタン
- 結果を数式にするか値にするかで 数式として挿入する ボックスを選択するか、非選択のままにしておきます(デフォルト)。
私のアドバイスとしては、ソース文字列に変更があったときに、抽出した数値を自動的に更新させたい場合は、このボックスを選択します。 結果を元の文字列に依存させたくない場合(たとえば、後の時点でソースデータを削除する予定の場合など)は、このボックスを選択しないでください。
- をクリックします。 挿入実績 ボタンを押す 完了
先ほどの例と同様に、抽出した結果は 計数 つまり、数える、合計する、平均する、その他の計算を自由に行うことができます。
この例では、結果を次のように挿入することにしました。 価値観 そして、そのアドインは、要求されたことを忠実に実行してくれました。
もし 数式として挿入する のチェックボックスが選択されている場合、そのチェックボックスが表示されます。 式 Ultimate Suiteの試用版をダウンロードしてお確かめください。)
ダウンロード可能なもの
Excel 抽出番号 - サンプルワークブック (.xlsx ファイル)
Ultimate Suite - 体験版 (.exeファイル)