ExcelのLEFT・RIGHT・MID関数|文字列を自在に抽出する使い方

セルの文字列から「先頭3文字だけ」「末尾の拡張子だけ」「途中のドメインだけ」を取り出したいと思ったことはありませんか?LEFT・RIGHT・MID関数をマスターすれば、文字列の切り出しが自在にできるようになります!
- LEFT・RIGHT・MID関数それぞれの構文と使い分け
- FIND・LEN関数と組み合わせた可変長データの抽出テクニック
- 住所・氏名・メールアドレス・電話番号の実務的な分割方法
- TEXTSPLIT関数(Microsoft 365)との比較と使い分け
- VBAのLeft・Right・Mid関数と正規表現による一括抽出コード
A列のセルをクリックすると、LEFT・MID・RIGHT関数の抽出結果がリアルタイムで変わります。
| A | B (LEFT) | C (MID) | D (RIGHT) | |
|---|---|---|---|---|
| 1 | 元データ | LEFT結果 | MID結果 | RIGHT結果 |
| 2 | –150 | –0002 | –0002 | |
| 3 | –ABC | –123 | –123 | |
| 4 | –EXCEL | –2024 | –2024 | |
| 5 | –tanaka | –example.com | –FIND併用 |
LEFT・RIGHT・MID関数とは?文字列抽出の基本
Excelで文字列を操作する場面は非常に多くあります。「住所から都道府県だけ抜き出したい」「メールアドレスからドメインを取得したい」「商品コードからカテゴリ部分だけ切り出したい」。こうしたニーズに応えるのがLEFT関数・RIGHT関数・MID関数の3つです。
この3つの関数は、それぞれ「先頭から」「末尾から」「任意の位置から」文字を抽出するという役割があります。FIND関数やLEN関数と組み合わせることで、区切り文字の位置を自動判定して可変長のデータにも対応できます。
文字列の結合(CONCATENATE・&演算子)と合わせて覚えておくと、Excelでのデータ加工力が格段にアップします。
3関数の構文と違い(比較表)
まず、3つの関数の構文を比較してみましょう。
| 関数 | 構文 | 抽出位置 | 引数 |
|---|---|---|---|
| LEFT | =LEFT(文字列, 文字数) | 先頭(左端)から | 文字数を省略すると1文字 |
| RIGHT | =RIGHT(文字列, 文字数) | 末尾(右端)から | 文字数を省略すると1文字 |
| MID | =MID(文字列, 開始位置, 文字数) | 任意の位置から | 開始位置は1始まり |
LEFT関数とRIGHT関数は引数が2つ(文字列と文字数)ですが、MID関数だけ「開始位置」が加わり引数が3つになります。開始位置は1から始まる点に注意してください。
抽出位置のイメージ図解
文字列「EXCEL2024」を例に、それぞれの関数がどの位置から文字を取り出すかを見てみましょう。
このように、LEFT関数は先頭から5文字、RIGHT関数は末尾から4文字、MID関数は3文字目から4文字を取り出します。どの関数を使うかは「取り出したい位置がどこか」で決まります。
LEFT関数|先頭から文字を抽出
LEFT関数の基本的な使い方
LEFT関数は、文字列の先頭(左端)から指定した文字数分を取り出します。
=LEFT(文字列, [文字数])
' 使用例
=LEFT("東京都渋谷区", 3) → "東京都"
=LEFT("ABC-123", 3) → "ABC"
=LEFT(A1) → A1の先頭1文字
第2引数の「文字数」を省略すると、先頭の1文字だけが返されます。全角文字も半角文字も1文字としてカウントされるため、日本語データでも安心して使えます。
郵便番号の上3桁を取得
郵便番号(例: 150-0002)から地域を示す上3桁を抽出するには、LEFT関数が最適です。
' A1に "150-0002" が入っている場合
=LEFT(A1, 3) → "150"
' 数値として使いたい場合はVALUE関数で変換
=VALUE(LEFT(A1, 3)) → 150
郵便番号がハイフンなしで「1500002」のように入力されている場合も、=LEFT(A1, 3)で同様に上3桁を取得できます。抽出結果は文字列型になるため、計算に使用する場合はVALUE関数で数値に変換してください。
LEFT × FIND で区切り文字の前を抽出
区切り文字の位置が固定でない場合は、FIND関数で区切り文字の位置を検索し、LEFT関数と組み合わせます。
' A1に "田中太郎@example.com" が入っている場合
' "@"の前の部分(ユーザー名)を取得
=LEFT(A1, FIND("@", A1) - 1) → "田中太郎"
' 解説:
' FIND("@", A1) → 5(@の位置)
' FIND("@", A1) - 1 → 4(@の1つ前まで)
' LEFT(A1, 4) → "田中太郎"
FIND関数は検索文字が見つからないと#VALUE!エラーを返します。エラーが心配な場合はIFERROR関数で囲んで対処しましょう。
' エラー対策版
=IFERROR(LEFT(A1, FIND("@", A1) - 1), A1)
Q: LEFT関数で日本語(全角文字)を抽出すると文字化けしませんか?
A: LEFT関数は「文字数」単位で動作するため、全角・半角に関係なく正しく抽出できます。バイト数で切り出すLEFTB関数と混同しないよう注意しましょう。日本語データではLEFTを使えば問題ありません。
RIGHT関数|末尾から文字を抽出
RIGHT関数の基本的な使い方
RIGHT関数は、文字列の末尾(右端)から指定した文字数分を取り出します。
=RIGHT(文字列, [文字数])
' 使用例
=RIGHT("2024年3月", 2) → "3月"
=RIGHT("ABC-123", 3) → "123"
=RIGHT(A1) → A1の末尾1文字
LEFT関数と同様に、第2引数を省略すると末尾の1文字が返されます。末尾から固定文字数を取り出すシンプルな処理に向いています。
拡張子の抽出
ファイル名から拡張子を取り出すのはRIGHT関数の定番テクニックです。ただし、拡張子の文字数は「.xlsx」「.csv」「.pdf」など様々なので、FIND関数やLEN関数を組み合わせて可変長に対応する必要があります。
' A1に "売上レポート.xlsx" が入っている場合
' ドット以降の拡張子を取得
=RIGHT(A1, LEN(A1) - FIND(".", A1)) → "xlsx"
' 解説:
' LEN(A1) → 10(全体の文字数)
' FIND(".", A1) → 7(ドットの位置)
' LEN(A1) - FIND(".", A1) → 3(ドット以降の文字数)
' RIGHT(A1, 3) → "xlsx"
ドットが複数ある場合(例: “report.2024.xlsx”)は、最初のドットで切れてしまいます。その場合はSUBSTITUTE関数でドットを置換してから処理する方法があります。
RIGHT × LEN で可変長データに対応
「先頭が固定長で、残りの部分を取り出したい」というパターンでは、LEN関数で全体の長さを測り、固定部分を引いた残りをRIGHT関数で取得します。
' A1に "東京都渋谷区道玄坂1-2-3" が入っている場合
' 先頭3文字(都道府県)を除いた残りを取得
=RIGHT(A1, LEN(A1) - 3) → "渋谷区道玄坂1-2-3"
' A1に "CAT-A1234" が入っている場合
' 先頭4文字(カテゴリ+ハイフン)を除いた残り
=RIGHT(A1, LEN(A1) - 4) → "A1234"
この「LEN – 固定長」のパターンは非常に汎用性が高いので、ぜひ覚えておきましょう。
Excel歴10年の経験上、RIGHT関数を単体で使う場面は意外と少なく、ほぼ毎回LEN関数とセットで使います。特にファイル名から拡張子を取り出す「=RIGHT(A1,LEN(A1)-FIND(“.”,A1))」は、ファイル管理台帳を作るときに月1回は使うパターンです。この数式をユーザー定義関数としてPersonal.xlsbに登録しておくと、どのブックでもすぐ呼び出せて便利ですよ。
MID関数|任意の位置から文字を抽出
MID関数の基本的な使い方
MID関数は、文字列の任意の位置から指定した文字数分を取り出します。LEFT関数・RIGHT関数では対応できない「中間部分の抽出」に使います。
=MID(文字列, 開始位置, 文字数)
' 使用例
=MID("EXCEL2024", 6, 4) → "2024"
=MID("150-0002", 5, 4) → "0002"
=MID("東京都渋谷区", 4, 3) → "渋谷区"
開始位置は1から始まります(0ではありません)。開始位置が文字列の長さを超えると空文字””が返され、文字数が残りの文字数より多い場合は残りすべてが返されます。
メールアドレスからドメインを抽出
メールアドレスの「@」以降のドメイン部分を取り出すには、MID関数とFIND関数を組み合わせます。
' A1に "tanaka@example.com" が入っている場合
=MID(A1, FIND("@", A1) + 1, LEN(A1)) → "example.com"
' 解説:
' FIND("@", A1) → 7(@の位置)
' FIND("@", A1) + 1 → 8(@の次の文字 = 開始位置)
' LEN(A1) → 18(文字数を大きめに指定)
' MID(A1, 8, 18) → "example.com"
MID関数の第3引数(文字数)にLEN(A1)を指定するのがポイントです。実際の残り文字数より大きくてもエラーにならず、残りの文字がすべて返されます。これは「末尾まで全部取り出す」常套テクニックです。
MID × FIND × LEN の組み合わせ技
2つの区切り文字に挟まれた部分を抽出するには、FIND関数を2回使って「開始位置」と「文字数」を動的に算出します。
' A1に "東京都-渋谷区-道玄坂" が入っている場合
' 1つ目と2つ目の"-"に挟まれた部分を取得
=MID(A1, FIND("-",A1)+1, FIND("-",A1,FIND("-",A1)+1)-FIND("-",A1)-1)
→ "渋谷区"
' 解説:
' FIND("-", A1) → 4(1つ目の"-"の位置)
' FIND("-", A1, FIND("-",A1)+1) → 8(2つ目の"-"の位置)
' 開始位置 = 4 + 1 = 5
' 文字数 = 8 - 4 - 1 = 3
' MID(A1, 5, 3) → "渋谷区"
FIND関数の第3引数(開始位置)を活用して、「N番目の区切り文字」を見つけるのがこのテクニックの要です。数式が長くなるため、複雑な場合はSUBSTITUTE関数で区切り文字を統一するか、後述のTEXTSPLIT関数やVBAを検討しましょう。
Q: MID関数の「文字数」引数に大きすぎる数値を指定するとエラーになりますか?
A: エラーにはなりません。MID関数は指定位置から文字列末尾までしか返さないため、文字数を多めに指定しても安全です。実務では「=MID(A1,5,100)」のように余裕を持った数値を指定するテクニックがよく使われます。
実践編|業務で使える文字列抽出テクニック
ここからは、実際の業務でよくある文字列抽出のシナリオを、LEFT・RIGHT・MID関数で解決する方法を紹介します。
住所から都道府県を分離
都道府県名は「東京都」「神奈川県」「北海道」「京都府」のように2〜4文字で変動します。これをLEFT関数だけで処理するには、IF関数を組み合わせて都道府県名の文字数を判定します。
' A1に "神奈川県横浜市中区" が入っている場合
' 都道府県の抽出(3文字 or 4文字を判定)
=IF(MID(A1,3,1)="県", LEFT(A1,3),
IF(MID(A1,3,1)="都", LEFT(A1,3),
IF(MID(A1,3,1)="府", LEFT(A1,3),
IF(MID(A1,4,1)="県", LEFT(A1,4),
LEFT(A1,3)))))
→ "神奈川県"
' 都道府県以降の住所
=MID(A1, LEN(都道府県セル)+1, LEN(A1)) → "横浜市中区"
都道府県名の文字数パターンは限られているため、3文字目が「都」「道」「府」「県」ならば3文字、4文字目が「県」ならば4文字というロジックで判定できます。
氏名を姓と名に分割
「姓 名」のように全角スペースで区切られた氏名を分割する定番パターンです。
' A1に "田中 太郎" が入っている場合(全角スペース区切り)
' 姓の抽出
=LEFT(A1, FIND(" ", A1) - 1) → "田中"
' 名の抽出
=MID(A1, FIND(" ", A1) + 1, LEN(A1)) → "太郎"
' 半角スペース区切りの場合は " " に変更
=LEFT(A1, FIND(" ", A1) - 1) → 姓
=MID(A1, FIND(" ", A1) + 1, LEN(A1)) → 名
スペースの全角・半角が混在するデータでは、まずSUBSTITUTE関数で半角スペースに統一してから処理すると確実です。
電話番号のハイフン除去と再フォーマット
電話番号のハイフンを除去したり、逆にハイフンを挿入して再フォーマットしたりする方法です。
' A1に "03-1234-5678" が入っている場合
' ハイフン除去(SUBSTITUTE関数を使用)
=SUBSTITUTE(A1, "-", "") → "0312345678"
' ハイフンなし "0312345678" から再フォーマット
' B1に "0312345678" が入っている場合
=LEFT(B1,2) & "-" & MID(B1,3,4) & "-" & RIGHT(B1,4)
→ "03-1234-5678"
' 携帯番号 "09012345678" の場合
=LEFT(B1,3) & "-" & MID(B1,4,4) & "-" & RIGHT(B1,4)
→ "090-1234-5678"
固定電話と携帯電話で市外局番の桁数が異なるため、IF関数で先頭の数字を判定して分岐させると汎用的な数式になります。
商品コードからカテゴリ・連番を分解
「CAT-A-001234」のような構造化された商品コードを各パーツに分解します。
' A1に "CAT-A-001234" が入っている場合
' カテゴリ部分(1つ目のハイフンの前)
=LEFT(A1, FIND("-", A1) - 1) → "CAT"
' サブカテゴリ(1つ目と2つ目のハイフンの間)
=MID(A1, FIND("-",A1)+1, FIND("-",A1,FIND("-",A1)+1)-FIND("-",A1)-1)
→ "A"
' 連番部分(2つ目のハイフンの後)
=MID(A1, FIND("-",A1,FIND("-",A1)+1)+1, LEN(A1))
→ "001234"
' 連番を数値に変換
=VALUE(MID(A1, FIND("-",A1,FIND("-",A1)+1)+1, LEN(A1)))
→ 1234
このように複数の区切り文字で構成されたコードを分解する場合、FIND関数のネストが深くなりがちです。VLOOKUP関数で商品マスターと照合する前処理として、このテクニックは頻繁に使われます。
住所の都道府県分離は、実務で最もよく依頼される文字列処理の一つです。筆者が過去に担当した顧客データ10万件の名寄せプロジェクトでは、LEFT+MID+FIND関数の組み合わせで都道府県・市区町村・番地の3分割を行い、約2時間で完了しました。ポイントは「神奈川県」「鹿児島県」など3文字・4文字が混在する都道府県名をIF関数で場合分けすること。MID(A1,2,1)=”県”なら3文字県、そうでなければ4文字県と判定するパターンが最も確実です。
TEXTSPLIT関数との比較(Microsoft 365)
Microsoft 365(またはExcel for the web)では、2022年に追加されたTEXTSPLIT関数を使うことで、区切り文字によるデータ分割がもっとシンプルに書けます。
TEXTSPLITの基本的な使い方
=TEXTSPLIT(文字列, 列区切り, [行区切り], [空白無視], [一致モード], [パディング])
' 基本例: カンマ区切りを分割
=TEXTSPLIT("りんご,みかん,ぶどう", ",")
→ りんご | みかん | ぶどう(3つのセルにスピル)
' ハイフン区切りの電話番号を分割
=TEXTSPLIT("03-1234-5678", "-")
→ 03 | 1234 | 5678(3つのセルにスピル)
' 特定の要素だけ取得(INDEX関数と組み合わせ)
=INDEX(TEXTSPLIT("CAT-A-001234", "-"), 1, 2)
→ "A"(2番目の要素)
TEXTSPLIT関数は結果を複数セルに「スピル」して展開します。1つのセルに結果をまとめたい場合は、INDEX関数と組み合わせて特定の要素だけを取り出してください。
LEFT/RIGHT/MID vs TEXTSPLIT 使い分け
| 比較項目 | LEFT/RIGHT/MID | TEXTSPLIT |
|---|---|---|
| 対応バージョン | Excel 2007以降すべて | Microsoft 365 / Excel for the web |
| 区切り文字での分割 | FIND+LENの組み合わせが必要 | 1つの関数で完結 |
| 固定位置での抽出 | シンプルに書ける | 不向き |
| 複数区切り文字 | FIND関数のネストが深くなる | 配列で複数指定可能 |
| 互換性 | ほぼすべての環境で動作 | 365以外では#NAME?エラー |
| 学習コスト | 基礎的な関数で習得しやすい | スピルの概念理解が必要 |
結論: 固定位置の抽出や旧バージョンとの互換性が求められる場面ではLEFT/RIGHT/MID関数を使い、区切り文字で柔軟に分割したい場面ではTEXTSPLIT関数を使いましょう。両方を使えるようになっておくのがベストです。
VBAで文字列抽出を自動化
大量のデータに対して文字列抽出を行う場合や、複雑なパターンマッチングが必要な場合は、VBAで自動化するのが効率的です。
VBAのLeft・Right・Mid関数
VBAにもLeft関数・Right関数・Mid関数が用意されており、Excelのワークシート関数とほぼ同じ感覚で使えます。
Sub BasicStringExtraction()
Dim src As String
src = "EXCEL2024-PRO"
' Left関数: 先頭から5文字
Debug.Print Left(src, 5) ' → "EXCEL"
' Right関数: 末尾から3文字
Debug.Print Right(src, 3) ' → "PRO"
' Mid関数: 6文字目から4文字
Debug.Print Mid(src, 6, 4) ' → "2024"
' InStr関数(FIND関数のVBA版)
Dim pos As Long
pos = InStr(src, "-") ' → 10
' ハイフンの前を取得
Debug.Print Left(src, pos - 1) ' → "EXCEL2024"
' ハイフンの後を取得
Debug.Print Mid(src, pos + 1) ' → "PRO"
End Sub
VBAのMid関数は第3引数(文字数)を省略すると、開始位置から末尾までのすべての文字が返されます。ワークシート関数のMIDでは文字数の省略ができない点が異なります。
大量データの一括抽出マクロ
A列に入ったメールアドレスから、B列にユーザー名、C列にドメインを一括で書き出すマクロです。
Sub SplitEmailAddresses()
Dim ws As Worksheet
Set ws = ActiveSheet
Dim lastRow As Long
lastRow = ws.Cells(ws.Rows.Count, "A").End(xlUp).Row
Dim i As Long
Dim email As String
Dim atPos As Long
' ヘッダー行の設定
ws.Range("B1").Value = "ユーザー名"
ws.Range("C1").Value = "ドメイン"
For i = 2 To lastRow
email = Trim(ws.Cells(i, "A").Value)
' 空セルをスキップ
If email = "" Then GoTo NextRow
' @の位置を検索
atPos = InStr(email, "@")
If atPos > 0 Then
' ユーザー名(@の前)
ws.Cells(i, "B").Value = Left(email, atPos - 1)
' ドメイン(@の後)
ws.Cells(i, "C").Value = Mid(email, atPos + 1)
Else
' @がない場合はエラー表示
ws.Cells(i, "B").Value = "形式エラー"
ws.Cells(i, "C").Value = ""
End If
NextRow:
Next i
MsgBox lastRow - 1 & " 件のメールアドレスを処理しました。", vbInformation
End Sub
1,000件以上のデータを処理する場合は、Application.ScreenUpdating = Falseを追加すると処理速度が大幅に向上します。
正規表現(RegExp)による高度な抽出
複雑なパターンマッチングが必要な場合は、VBAの正規表現オブジェクト(VBScript.RegExp)を使います。郵便番号・電話番号・メールアドレスなどの定型パターンを高精度で抽出できます。
Sub ExtractWithRegex()
' 参照設定: Microsoft VBScript Regular Expressions 5.5
' または CreateObject で遅延バインディング
Dim re As Object
Set re = CreateObject("VBScript.RegExp")
Dim ws As Worksheet
Set ws = ActiveSheet
Dim lastRow As Long
lastRow = ws.Cells(ws.Rows.Count, "A").End(xlUp).Row
' ヘッダー
ws.Range("B1").Value = "郵便番号"
ws.Range("C1").Value = "電話番号"
ws.Range("D1").Value = "メール"
Dim i As Long
Dim src As String
For i = 2 To lastRow
src = ws.Cells(i, "A").Value
' 郵便番号の抽出(〒XXX-XXXX または XXX-XXXX)
re.Pattern = "\d{3}-\d{4}"
re.Global = False
If re.Test(src) Then
ws.Cells(i, "B").Value = re.Execute(src)(0).Value
End If
' 電話番号の抽出(XX-XXXX-XXXX または XXX-XXXX-XXXX)
re.Pattern = "\d{2,4}-\d{2,4}-\d{4}"
If re.Test(src) Then
ws.Cells(i, "C").Value = re.Execute(src)(0).Value
End If
' メールアドレスの抽出
re.Pattern = "[a-zA-Z0-9._%+\-]+@[a-zA-Z0-9.\-]+\.[a-zA-Z]{2,}"
If re.Test(src) Then
ws.Cells(i, "D").Value = re.Execute(src)(0).Value
End If
Next i
Set re = Nothing
MsgBox "正規表現による抽出が完了しました。", vbInformation
End Sub
正規表現はLeft/Right/Mid関数では対応しきれない複雑なパターンに威力を発揮します。ただし、正規表現の構文に慣れるまでは学習コストがかかるため、まずはLeft/Right/Mid + FIND/LENで対応できないか検討し、それでも難しい場合に正規表現を使うのがおすすめです。
よくある質問(FAQ)
Q. LEFT/RIGHT/MID関数で数値が返される場合の対処法は?
LEFT/RIGHT/MID関数の結果は常にテキスト型です。数値として使いたい場合はVALUE関数で変換してください(例: =VALUE(LEFT(A1,3)))。逆に、数値セルからLEFT関数で抽出しようとすると予期しない結果になることがあります。その場合は=LEFT(TEXT(A1,"0"), 3)のようにTEXT関数で書式を指定してから抽出しましょう。
Q. 全角文字と半角文字が混在する場合はどうする?
LEFT/RIGHT/MID関数は文字数単位で処理するため、全角・半角の区別なく使えます。「東京都」も「ABC」も、どちらも3文字としてカウントされます。バイト数で処理したい場合はLEFTB/RIGHTB/MIDB関数を使ってください。
Q. LEFTB/RIGHTB/MIDB関数との違いは?
LEFT/RIGHT/MID関数は文字数単位、LEFTB/RIGHTB/MIDB関数はバイト数単位で処理します。日本語環境では全角文字が2バイトとしてカウントされます。たとえば「東京都」はLEFT関数では3文字ですが、LEFTBでは6バイトです。固定長レコードの処理など、バイト数での切り出しが必要な場面で使います。
Q. 複数の区切り文字で分割したい場合は?
SUBSTITUTE関数で区切り文字を統一してからLEFT/MID/RIGHT+FINDで抽出するか、TEXTSPLITまたはVBAの正規表現を使ってください。たとえばカンマとスペースが混在する場合は、=SUBSTITUTE(A1, " ", ",")でスペースをカンマに統一してから処理します。
Q. スプレッドシートでもLEFT/RIGHT/MID関数は使えますか?
はい、GoogleスプレッドシートでもLEFT/RIGHT/MID関数はExcelと同じ構文で使えます。スプレッドシート固有のREGEXEXTRACT関数も併用すると便利です。=REGEXEXTRACT(A1, "(.+)@")のように正規表現で直接パターンマッチングができるため、FIND関数を多段ネストするよりシンプルに書ける場合があります。
VBA開発・GAS連携・Webアプリ化まで、
業務に合わせた最適な自動化をご提案します。
LINEでExcelを気軽に学べる
