Excel VBAで文字列を切り出しする方法をお探しですね。

広告

Excel VBAで文字列を切り出す!Left・Mid・Right関数を使いこなそう

Excel VBAでセルの値やファイル名、電話番号、商品コードなんかを扱っていると、「最初の数文字だけ取り出したい」「末尾の拡張子だけほしい」「真ん中の決まった位置から切り出したい」といった場面がよく出てきます。

こういう文字列の抽出には、**Left関数**、**Mid関数**、**Right関数**を使うのが基本中の基本です。

この記事では、3つの関数の違いと使い方、実務でよく使う組み合わせワザ、エラーを避けるためのコツまで、初心者の方にも分かりやすく解説していきます。

Left・Mid・Right関数ってどう違うの?使い分けのポイント

Excel VBAで文字列を切り出すとき、まず覚えておきたいのが**Left関数**、**Mid関数**、**Right関数**の3つです。

– **Left**は文字列の左端、つまり**先頭から**指定した文字数を取り出します
– **Right**は逆に、文字列の右端、つまり**末尾から**指定した文字数を取り出します
– **Mid**は開始位置を自分で決められるので、**途中から**必要な部分だけを切り出せます

それぞれの基本的な書き方は、こんな感じです。

LeftとRightは「どっち側から何文字取るか」を指定して、Midは「何文字目から何文字取るか」を指定します。

“`vb
Left(文字列, 文字数)
Right(文字列, 文字数)
Mid(文字列, 開始位置, 文字数)
“`

ちなみにVBAでは文字の位置を**1から数える**ので、先頭文字は0番目じゃなくて1番目です。

他のプログラミング言語に慣れている人ほど、ここでつまずきやすいので注意してくださいね。

たとえば「ExcelVBA」という文字列から「Excel」を取り出すなら、先頭から5文字なので**Left**を使います。

「VBA」を取り出すなら、末尾から3文字なので**Right**です。

「xce」だけがほしいときは、2文字目から3文字取るので**Mid**を使います。

取り出したい部分が先頭・末尾・途中のどこにあるかで関数を選ぶと、コードが読みやすくなりますよ。

“`vb
Sub SampleBasic()
Dim text As String
text = “ExcelVBA”

Debug.Print Left(text, 5) ‘ Excel
Debug.Print Right(text, 3) ‘ VBA
Debug.Print Mid(text, 2, 3) ‘ xce
End Sub
“`

あと大事なポイントとして、Left、Mid、Rightはどれも**戻り値が文字列**です。

郵便番号や電話番号みたいに数字っぽく見えるものを切り出すときも、先頭の0を残したいなら文字列として扱うのが安全です。

「03」や「090」みたいな値は、数値として扱うと先頭の0が消えちゃう可能性があります。

文字列処理では、見た目の数字と計算用の数値を分けて考えるのがコツです。

Left関数とRight関数で先頭・末尾から切り出す

**Left関数**は、文字列の先頭に意味のある情報があるときに便利です。

たとえば商品コード「PRD-2025-ABC」から先頭3文字の「PRD」を取り出して、製品コードかどうかを判定する、なんて使い方ができます。

日付文字列「2025-10-20」から年だけを取り出すときも、先頭4文字を取れば「2025」が手に入ります。

形式が決まっている文字列なら、Left関数だけでシンプルに処理できます。

“`vb
Sub SampleLeft()
Dim code As String
Dim prefix As String

code = “PRD-2025-ABC”
prefix = Left(code, 3)

If prefix = “PRD” Then
Debug.Print “製品コードです”
End If
End Sub
“`

**Right関数**は、文字列の末尾に必要な情報があるときに使います。

よくあるのは、電話番号の下4桁やファイル名の拡張子を取得するケースです。

ただし、拡張子の文字数は「xls」「xlsx」「csv」みたいに一定じゃないので、単純に`Right(fileName, 4)`って書くと、ドットを含むか含まないかとか、文字数の違いで想定外の結果になることがあります。

注意しましょう。

“`vb
Sub SampleRight()
Dim phone As String
Dim last4 As String

phone = “090-1234-5678”
phone = Replace(phone, “-“, “”) ‘ ハイフンを消す
last4 = Right(phone, 4)

Debug.Print last4 ‘ 5678
End Sub
“`

Left関数とRight関数は、指定した文字数が元の文字列より長くても、基本的には文字列全体を返してくれます。

たとえば`Left(“ABC”, 10)`なら「ABC」が返ってきます。

でも、文字数にマイナスの値を指定するとエラーになります。

ユーザーが入力した数値やセルの値を文字数として使うときは、事前に0以上かどうかを確認しておくと安心です。

それから、全角文字と半角文字はどちらも**1文字としてカウント**されます。

「東京都千代田区」に対して`Left(text, 3)`を実行すると「東京都」が返ってきます。

バイト数で処理したいときはLeftBやRightBっていう関数もありますけど、普通にExcel VBAで住所や氏名、コードを扱う範囲では、まずLeft、Rightを使えば大丈夫です。

文字数とバイト数を混同しないことが、文字化けや想定外の切り出しを防ぐポイントですね。

Mid関数で好きな位置から文字列を抽出する

**Mid関数**は、文字列の途中から一部を切り出したいときに使います。

書き方は`Mid(文字列, 開始位置, 文字数)`で、開始位置は1から数えます。

たとえば「2025-10-20」っていう文字列から月を取り出すなら、6文字目から2文字を取ればいいので、`Mid(text, 6, 2)`と書きます。

長さが決まっているデータや、日付・コードみたいに桁位置が固定されている文字列では特に使いやすい関数です。

“`vb
Sub SampleMid()
Dim dateText As String
Dim yearText As String
Dim monthText As String
Dim dayText As String

dateText = “2025-10-20”

yearText = Mid(dateText, 1, 4) ‘ 年
monthText = Mid(dateText, 6, 2) ‘ 月
dayText = Mid(dateText, 9, 2) ‘ 日

Debug.Print yearText
Debug.Print monthText
Debug.Print dayText
End Sub
“`

Mid関数の第3引数(文字数)は**省略できます**。

省略すると、開始位置から末尾までの文字列が返ってきます。

たとえば`Mid(“ExcelVBA”, 6)`って書くと、6文字目から最後までの「VBA」が取れます。

末尾まで全部ほしいときは、無理にLen関数で残り文字数を計算するより、文字数を省略した方が読みやすいコードになりますよ。

“`vb
Sub SampleMidOmitLength()
Dim text As String
text = “ExcelVBA”

Debug.Print Mid(text, 6) ‘ VBA
End Sub
“`

ただし、Mid関数は開始位置を間違えると結果がずれやすいので気をつけましょう。

VBAの文字位置は**1始まり**なので、2文字目から取りたいなら`Mid(text, 2, 3)`です。

0を指定する感覚で書くとエラーの元になります。

あと、開始位置や文字数にセルの値を使う場合は、空欄やマイナス値が入ってないか確認しておくと安全です。

Mid関数は「何文字目から切り出すか」が分かっているときには超便利ですが、氏名の区切り位置や拡張子の位置みたいに、データごとに開始位置が変わる場合は単体じゃ足りません。

そういうときは、**InStr関数**や**InStrRev関数**で区切り文字の位置を調べて、その結果をMid関数に渡すと柔軟に処理できます。

固定位置ならMid、可変位置なら検索関数と組み合わせる、っていう判断が実務では大事です。

InStrやLenと組み合わせた実務向けの切り出しワザと注意点

実務で扱う文字列って、必ずしも文字数が固定されてるとは限りませんよね。

たとえば「山田 太郎」「佐藤 花子」みたいに姓と名がスペースで区切られている場合、姓の文字数は人によって違います。

こういうときは、区切り文字であるスペースの位置を**InStr関数**で調べて、その位置を基準にLeftやMidで切り出します。

InStrは、指定した文字列が何文字目にあるかを教えてくれる関数です。

“`vb
Sub SplitName()
Dim fullName As String
Dim spacePos As Long
Dim lastName As String
Dim firstName As String

fullName = “山田 太郎”
spacePos = InStr(fullName, ” “) ‘ スペースの位置を探す

If spacePos > 0 Then
lastName = Left(fullName, spacePos – 1) ‘ 姓
firstName = Mid(fullName, spacePos + 1) ‘ 名

Debug.Print lastName ‘ 山田
Debug.Print firstName ‘ 太郎
End If
End Sub
“`

ファイル名から拡張子を取得する場合も、検索関数との組み合わせが効果的です。

ただし、「report.xlsx」みたいにドットが1つだけならInStrでもOKですが、「data.backup.xlsx」みたいに複数のドットが含まれる場合は、**最後のドット**を基準にする必要があります。

そんなときは、末尾側から検索する**InStrRev関数**を使うと安全です。

最後のドットの位置が分かれば、Midでその次の文字から末尾まで取得できます。

“`vb
Sub GetFileExtension()
Dim fileName As String
Dim dotPos As Long
Dim ext As String

fileName = “data.backup.xlsx”
dotPos = InStrRev(fileName, “.”) ‘ 最後のドットの位置を探す

If dotPos > 0 Then
ext = Mid(fileName, dotPos + 1) ‘ ドットの次から末尾まで
Else
ext = “”
End If

Debug.Print ext ‘ xlsx
End Sub
“`

**Len関数**は、文字列の長さを取得する関数です。

Right関数と組み合わせると、特定の位置より後ろを末尾側から取り出す処理にも使えます。

ただ、拡張子みたいに「指定位置以降を全部取得する」処理なら、`Mid(fileName, dotPos + 1)`の方がシンプルな場合もあります。

関数を組み合わせるときは、ちゃんと動くことだけじゃなくて、後から読んだ人が意図を理解しやすいかも意識するといいですよ。

文字列抽出でよくある失敗が、**区切り文字が存在しないケースを想定してない**ことです。

InStrで検索文字が見つからないと0が返ってきます。

そのまま`Left(text, InStr(text, ” “) – 1)`みたいに書くと、文字数に-1が指定されてエラーになっちゃいます。

実務では、必ず**If文で位置が0より大きいか確認**してから切り出すのが安全です。

“`vb
Sub SafeExtract()
Dim text As String
Dim pos As Long

text = “山田太郎” ‘ スペースなし
pos = InStr(text, ” “)

If pos > 0 Then
Debug.Print Left(text, pos – 1)
Else
Debug.Print “区切り文字が見つかりません”
End If
End Sub
“`

まとめ:文字列の切り出しはLeft・Mid・Rightが基本!

Excel VBAで文字列を切り出す処理は、**Left、Mid、Right**の3つを理解すれば、ほとんどのケースに対応できます。

先頭から取るならLeft、末尾から取るならRight、途中から取るならMidを使えばOKです。

さらに、区切り文字の位置を調べる**InStr**や**InStrRev**、文字数を調べる**Len**、不要な記号を消す**Replace**なんかを組み合わせることで、氏名分割、電話番号整形、ファイル拡張子取得、商品コード判定といった実務的な処理に発展できます。

まずは固定位置の切り出しから練習して、次に区切り文字を使った可変位置の抽出へ進むと、VBAの文字列操作を無理なく身につけられますよ。

ぜひこの記事を参考に、実際のコードで試してみてくださいね!

広告