Excel 特定の文字列以降・より後ろを抽出する方法|新関数TEXTAFTERとRIGHT関数の活用
Excelでの文字列操作は、日々の業務で頻繁に発生する作業です。
例えば、「特定の文字より後ろの情報を抜き出したい」といったデータ処理は、手作業で行うと非効率的で、膨大な時間と労力を要します。
この記事では、そのようなExcelの文字列抽出を効率化するための方法を網羅的に解説します。
特にLEFT、RIGHT、MIDといった従来の関数に加えて、2022年9月に追加されたTEXTBEFORE関数とTEXTAFTER関数を利用することで、より簡潔な数式で目的の処理を実現できます。
これらのテクニックを習得することで、複雑に見えるデータ処理も簡潔かつ正確に行うことが可能になり、業務の効率化に貢献します。
特定の文字列以降を抽出する
特定の文字列をキーとして、その文字列より後の部分を抽出する方法を解説します。
TEXTAFTER関数を利用する場合
2022年9月にMicrosoft 365に追加されたTEXTAFTER関数を使用すると、簡潔な数式で文字列を抽出できます。
数式:
=TEXTAFTER(抽出元の文字列,キーとなる文字列)
TEXTAFTER関数は、指定したキーとなる文字列の「後」にあるすべての文字列を抽出します。

RIGHT関数とFIND関数を利用する場合
TEXTAFTER関数が利用できない環境では、RIGHT関数とFIND関数を組み合わせて抽出します。
数式:
=RIGHT(抽出元の文字列,LEN(抽出元の文字列)-FIND(キーとなる文字列,抽出元の文字列)-LEN(キーとなる文字列)+1)
この数式は、キーとなる文字列が複数回出現した場合、最初に出現した位置から後ろを抽出します。
キーとなる文字列がない場合は#VALUE!エラーになります。

この数式は、以下のステップで機能します。
FIND(キーとなる文字列,抽出元の文字列): 抽出元文字列の中で、キーとなる文字列が何文字目から始まるかを特定します。例えば、「東京都千代田区」から「千代田区」を抽出する場合、キーとなる「千代田区」の開始位置は4文字目になります。LEN(抽出元の文字列): 抽出元文字列全体の文字数を数えます。LEN(キーとなる文字列): キーとなる文字列自体の文字数を数えます。LEN(抽出元の文字列)-FIND(...) - LEN(...) + 1: 抽出元の文字列の全体の長さから、キーとなる文字列とその前の部分の長さを引くことで、抽出したい部分の文字数を正確に計算します。RIGHT(抽出元の文字列, 計算結果): 計算された文字数分、抽出元文字列の右側から文字を抜き出します。
具体的な使用例と挙動
| B列: 抽出元の文字列 | C列: キーとなる文字列 | D列: 結果 (RIGHT関数) | E列: 結果 (TEXTAFTER関数) | 解説 |
|---|---|---|---|---|
| 東京都千代田区 | 都 | 千代田区 | 千代田区 | 「都」以降の「千代田区」が抽出されます。 |
| 東京都中央区 | 京 | 都中央区 | 都中央区 | FIND関数は最初に見つかった「京」の位置を返すため、「都中央区」が抽出されます。 |
| 東京都港区 | 京都港 | 区 | 区 | キーとなる文字列「京都港」以降の「区」が抽出されます。 |
| 東京都台東区 | 台 | 東区 | 東区 | キーとなる文字列「台」以降の「東区」が抽出されます。 |
| 東京都台東区 | 北海道 | #VALUE! | #N/A | キーとなる文字列が見つからないため、エラーが返されます。 |
| AABBCCDDDEEEFFF | DDD | EEEFFF | EEEFFF | RIGHT関数は最初に見つかった「DDD」以降の文字列を返します。 |
特定の文字列以前を抽出する
特定の文字列をキーとして、その文字列より前の部分を抽出する方法を解説します。
TEXTBEFORE関数を利用する場合
TEXTBEFORE関数を利用すると、簡潔な数式で実現可能です。
数式:
=TEXTBEFORE(抽出元の文字列,キーとなる文字列)

TEXTBEFORE関数は、指定したキーとなる文字列の「前」にあるすべての文字列を抽出します。
LEFT関数とFIND関数を利用する場合
LEFT関数とFIND関数を組み合わせて、特定の文字列より前の部分を抽出します。
数式:
=LEFT(抽出元の文字列,FIND(キーとなる文字列, 抽出元の文字列)-1)
この数式は、キーとなる文字列が先頭にある場合は空白に、該当しない場合は#VALUE!エラーになります。

〇〇と△△の間を抽出する
2つの特定の文字列の間にある部分を抽出する方法を解説します。
TEXTBEFOREとTEXTAFTER関数を利用する場合
2022年9月に追加されたTEXTBEFORE関数とTEXTAFTER関数を利用すると、簡潔な数式で実現可能です。
数式:
=TEXTAFTER(TEXTBEFORE(抽出元の文字列,後:キーとなる文字列),前:キーとなる文字列)

MID関数とFIND関数、LEN関数を利用する場合
MID関数とFIND関数、LEN関数を組み合わせて抽出します。
数式:
=MID(抽出元の文字列,
FIND(前:キーとなる文字列,抽出元の文字列)+LEN(前:キーとなる文字列),
FIND(後:キーとなる文字列,抽出元の文字列)-FIND(前:キーとなる文字列,抽出元の文字列)-LEN(前:キーとなる文字列))
この数式は、該当しない場合に#VALUE!エラーになります。

数式の効率化(LET関数の活用)
Microsoft 365では、LET関数を利用することで、冗長な数式を効率化できます。
TEXTBEFORE関数やTEXTAFTER関数を使用する場合は元々簡潔なため、メリットは大きくありませんが、MID関数とFIND関数、LEN関数を利用する場合のようなケースでは特に有効です。
LET関数は、一定の数式に任意の名前を付けて再利用可能にする機能で、プログラミングにおける変数のようなものです。
〇〇と△△の間の抽出での活用例
MID関数を使った数式では、FIND関数やLEN関数が重複して記述されています。LET関数を使ってこれらの部分に名前を付けることで、数式を簡潔にできます。
元の数式:
=MID(抽出元の文字列,
FIND(C3,B3)+LEN(C3),
FIND(D3,B3)-FIND(C3,B3)-LEN(C3))
改善後の数式:
=LET( 前文字の開始位置,FIND(C3,B3),
前文字数,LEN(C3),
MID(B3,前文字の開始位置+前文字数,FIND(D3,B3)-前文字の開始位置-前文字数))
メリット:
- 数式の重複(冗長)がなくなり、変更が容易になります。
- 意味のある名前を付けられるため、数式の意図を把握しやすくなります。
- 数式の実行回数が減るため、Excelの計算が早くなります。
- この効果は、数式を使うセルが多い場合に特に大きくなります。

重複だけでなく、意味のある数式の固まり全てに名前を付けるのも有効です。
数式自体は長くなりますが、何を意図した数式なのかを読み取りやすくなります。
=LET( 前文字の開始位置,FIND(C3,B3),
前文字数,LEN(C3),
切り出しの開始位置,前文字の開始位置+前文字数,
切り出しの終了位置,FIND(D3,B3)-前文字の開始位置-前文字数,
MID(B3,切り出しの開始位置,切り出しの終了位置)
)

Officeスクリプトを利用した文字列の抽出
Excelの関数に加え、Microsoft 365環境ではOfficeスクリプトを利用して文字列の抽出を自動化することも可能です。これはExcelの操作を自動化するためのプログラム言語で、繰り返し行う作業などを手軽に実行できます。
簡単な記録と実行方法はこちらの記事をご確認ください。
特定の文字列以降を抽出する
indexOf()メソッドでキーとなる文字列の位置を特定し、substring()メソッドでその位置以降を抽出します。
「設定範囲(5~7行目)」のセル範囲を変更して実行してください。このスクリプトはアクティブシートを対象とします。
function main(workbook: ExcelScript.Workbook) {
let sheet = workbook.getActiveWorksheet();
// ★設定範囲★
let textRange = sheet.getRange("A2:A7"); // 抽出元の文字列
let keyRange = sheet.getRange("B2:B7"); // キーとなる文字列
let outputRange = sheet.getRange("C2:C7"); // 結果
// ★ここまで★
let textValues = textRange.getValues() as string[][];
let keyValues = keyRange.getValues() as string[][];
let results = textValues.map((row, index) => {
let text = row[0];
let key = keyValues[index][0];
let startIndex = text.indexOf(key);
if (startIndex !== -1) {
return [text.substring(startIndex + key.length)];
} else {
return [""];
}
});
outputRange.setValues(results);
}
特定の文字列以前を抽出する
indexOf()メソッドでキーとなる文字列の位置を特定し、substring()メソッドでその位置以前を抽出します。
「設定範囲(5~7行目)」のセル範囲を変更して実行してください。このスクリプトはアクティブシートを対象とします。
function main(workbook: ExcelScript.Workbook) {
let sheet = workbook.getActiveWorksheet();
// ★設定範囲★
let textRange = sheet.getRange("A2:A7"); // 抽出元の文字列
let keyRange = sheet.getRange("B2:B7"); // キーとなる文字列
let outputRange = sheet.getRange("C2:C7"); // 結果
// ★ここまで★
let textValues = textRange.getValues() as string[][];
let keyValues = keyRange.getValues() as string[][];
let results = textValues.map((row, index) => {
let text = row[0];
let key = keyValues[index][0];
let endIndex = text.indexOf(key);
if (endIndex !== -1) {
return [text.substring(0, endIndex)];
} else {
return [""];
}
});
outputRange.setValues(results);
}
〇〇と△△の間を抽出する
2つのキーの位置をindexOf()メソッドで特定し、その間の部分をsubstring()メソッドで抽出します。
「設定範囲(5~8行目)」のセル範囲を変更して実行してください。このスクリプトはアクティブシートを対象とします。
function main(workbook: ExcelScript.Workbook) {
let sheet = workbook.getActiveWorksheet();
// ★設定範囲★
let textRange = sheet.getRange("A2:A6"); // 抽出元の文字列
let startKeyRange = sheet.getRange("B2:B6"); // 前:キーとなる文字列
let endKeyRange = sheet.getRange("C2:C6"); // 後:キーとなる文字列
let outputRange = sheet.getRange("D2:D6"); // 結果
// ★ここまで★
let textValues = textRange.getValues() as string[][];
let startKeyValues = startKeyRange.getValues() as string[][];
let endKeyValues = endKeyRange.getValues() as string[][];
let results = textValues.map((row, index) => {
let text = row[0];
let startKey = startKeyValues[index][0];
let endKey = endKeyValues[index][0];
let startIndex = text.indexOf(startKey);
let endIndex = text.indexOf(endKey);
if (startIndex !== -1 && endIndex !== -1 && startIndex < endIndex) {
return [text.substring(startIndex + startKey.length, endIndex)];
} else {
return [""];
}
});
outputRange.setValues(results);
}
FAQ:よくある質問と応用例
Q1. キーとなる文字列が複数ある場合、2つ目以降の文字列から抽出したいのですが?
TEXTAFTER関数とFIND関数は、それぞれ異なるアプローチでこの課題を解決できます。
TEXTAFTER関数を利用する場合
TEXTAFTER関数は、第3引数にインスタンス番号(何番目のキーから)を指定することで、複数回出現するキーとなる文字列のn番目以降を抽出できます 。
例: 「商品番号-A101-B202」から2つ目のハイフン以降を抽出したい場合(結果はB202)
数式:
=TEXTAFTER(抽出元の文字列,"-",2)

FIND関数を利用する場合
FIND関数は、指定した文字列が最初に出現する位置を返します 。2つ目以降の文字列から抽出したい場合は、
FIND関数数の第3引数に最初の文字列以降の開始位置を指定して計算する必要があります。
例: 「商品番号-A101-B202」から2つ目のハイフン以降を抽出したい場合(結果はB202)
数式:
=RIGHT(抽出元の文字列,LEN(抽出元の文字列)-FIND("-",抽出元の文字列,FIND("-",抽出元の文字列)+1))

Q2. 右側から数えて最初の特定の文字から抽出したいのですが?
TEXTAFTER関数は、第3引数に-1を指定することで、文字列の右側から検索できます。
- 例: 「A101-B202-C303」から右側で最初に出現するハイフン以降を抽出したい場合。
=TEXTAFTER("A101-B202-C303","-",-1)
この数式は、右側から数えて最初に出現する-以降の文字列「C303」を抽出します。

Q3. キーとなる文字列自体も含めて抽出したいのですが?
提示した数式はキーとなる文字列を除いて抽出しますが、これを含めるには数式を一部変更します。
RIGHT関数とFIND関数の組み合わせの場合:
LEN(キーとなる文字列)の部分を削除します。
数式:
=RIGHT(抽出元の文字列,LEN(抽出元の文字列)-FIND(キーとなる文字列,
抽出元の文字列)+1)

TEXTAFTER関数の場合:
TEXTAFTER関数では、キーとなる文字列が自動的に除外されるため、キーとなる文字列を先頭に結合することで、キーを含めた結果を得られます。
=キーとなる文字列&TEXTAFTER(抽出元の文字列,キーとなる文字列)
