Excel VBA | 超初心者(Excel操作+マクロ体験):基本文法 - Mid

Excel VBA VBA
スポンサーリンク

Mid は「文字列の真ん中を、好きな位置から好きな長さだけ切り出すハサミ」

Left/Right は「端っこ担当」でした。
Mid は「真ん中担当」――文字列の“途中”から、指定した長さだけ切り出す関数です。

人間の言葉にすると、

「○文字目から、△文字ぶんちょうだい」

と頼むイメージです。
端からではなく「何文字目から」と言えるのが、Mid の一番の特徴です。


Mid の基本構文と「何文字目から」の感覚

基本構文

Mid の基本形はこうです。

Mid(文字列, 開始位置, 取り出す文字数)
VB

開始位置は「左から数えて何文字目か」です。
VBAは 1 文字目が 1、2文字目が 2…という数え方をします。

いちばんシンプルな例

Sub SampleMidBasic()

    Dim s As String
    Dim r As String

    s = "ABCDEFG"

    r = Mid(s, 3, 2)   ' 3文字目から2文字 → "CD"

    MsgBox r

End Sub
VB

ここでの動きを言葉で追うと、

  • s は “ABCDEFG”
  • 1文字目:A
  • 2文字目:B
  • 3文字目:C
  • 4文字目:D

なので、「3文字目から2文字」=「C と D」→ “CD” になります。

「開始位置は“左から数えて何文字目か”」
ここをしっかり体に入れておくと、Mid は一気に扱いやすくなります。


第3引数を省略した形:「そこから最後まで全部」

2引数版 Mid

Mid には、取り出す文字数を省略する書き方もあります。

Mid(文字列, 開始位置)
VB

この場合は、「開始位置から最後まで全部」が返ってきます。

Sub SampleMidToEnd()

    Dim s As String
    Dim r As String

    s = "ABCDEFG"

    r = Mid(s, 4)   ' 4文字目から最後まで → "DEFG"

    MsgBox r

End Sub
VB

「○文字目以降を全部ほしい」という場面では、この2引数版がスッキリ書けます。


日付文字列やコードから「真ん中の部分」を抜き出す

日付文字列 “2026/02/23” から「月」を取り出す

Left/Right だけだと「端っこ」しか取れませんが、
Mid を使うと「真ん中の“月”だけ」を簡単に取れます。

Sub SampleMidDate()

    Dim s As String
    Dim mm As String

    s = "2026/02/23"

    mm = Mid(s, 6, 2)   ' 6文字目から2文字 → "02"

    MsgBox mm

End Sub
VB

文字を数えてみると、

  • 1: 2
  • 2: 0
  • 3: 2
  • 4: 6
  • 5: /
  • 6: 0
  • 7: 2
  • 8: /
  • 9: 2
  • 10: 3

なので、「6文字目から2文字」= “02” です。

ここで大事なのは、

「“どこから”を自分で決められるから、真ん中だけを狙って切れる」

という Mid の強みです。

商品コード “AB-123-XYZ” から「真ん中の数字部分」だけ取りたい

Sub SampleMidCode()

    Dim code As String
    Dim middle As String

    code = "AB-123-XYZ"

    middle = Mid(code, 4, 3)   ' 4文字目から3文字 → "123"

    MsgBox middle

End Sub
VB

文字位置は、

  • 1: A
  • 2: B
  • 3: –
  • 4: 1
  • 5: 2
  • 6: 3
  • 7: –
  • 8: X
  • 9: Y
  • 10: Z

なので、「4文字目から3文字」= “123” になります。


InStr と組み合わせると「区切り文字の間」を抜くのが得意になる

「@ と . の間の文字」を取り出すメールアドレス例

例えば、メールアドレス "yamada@example.com" から、
「@ と . の間の部分(example)」だけ取りたいとします。

Sub SampleMidBetween()

    Dim mail As String
    Dim posAt As Long
    Dim posDot As Long
    Dim domain As String

    mail = "yamada@example.com"

    posAt = InStr(mail, "@")      ' @ の位置
    posDot = InStr(posAt + 1, mail, ".")   ' @ の後ろから . を探す

    domain = Mid(mail, posAt + 1, posDot - posAt - 1)

    MsgBox domain   ' → "example"

End Sub
VB

ここでやっていることを丁寧に言葉にすると、

  • InStr(mail, “@”) で「@ が何文字目か」を調べる
  • その1つ後ろ(posAt + 1)から InStr して、「. がどこか」を探す
  • 「@ の次の文字」から「. の1つ手前」までを Mid で切り出す

という流れです。

Mid の第2引数(開始位置)と第3引数(長さ)を、
InStr の結果から計算してあげると、
「区切り文字と区切り文字の間」をきれいに抜き出せます。

ここが、Mid が“実務で本当に強い”ポイントです。


Len と組み合わせて「後ろから数えた位置」を Mid に変換する

「右から3文字目から2文字」を Mid で書く

文字列の長さが毎回違う場合、
「右から3文字目から2文字」といった指定をしたくなることがあります。

そのときは、Len で「左から何文字目か」に変換してから Mid を使います。

Sub SampleMidFromRight()

    Dim s As String
    Dim startPos As Long
    Dim part As String

    s = "ABCDEFG"

    ' 右から3文字目 → 全体の長さ - 3 + 1
    startPos = Len(s) - 3 + 1

    part = Mid(s, startPos, 2)

    MsgBox part   ' → "EF"

End Sub
VB

ここでの計算は、

  • Len(s) = 7
  • 右から3文字目 → 7 – 3 + 1 = 5
  • 5文字目から2文字 → “EF”

という流れです。

「右から○文字目」→「左から何文字目か」に変換して Mid に渡す
このパターンを覚えておくと、Mid の応用力が一気に上がります。


Mid を使うときに意識してほしい重要ポイント

開始位置は「1から始まる」ことを忘れない

VBAの文字位置は 0 ではなく 1 から始まります。

  • 1文字目 → 1
  • 2文字目 → 2

ここを 0 と勘違いすると、
「1文字ずれて切れてしまう」バグがよく起きます。

「人間が数えるのと同じ。1文字目は1」
と覚えておくと混乱しにくいです。

「開始位置+長さ」が文字列の長さを超えてもエラーにはならない

例えば、7文字の文字列に対して、

Mid(s, 6, 5)
VB

のように「6文字目から5文字」と指定しても、
VBAは「あるところまで(6,7文字目)だけ返す」動きをします。
エラーにはなりません。

ただし、「開始位置そのものが文字列の長さを超えている」ときは、
空文字列(””)が返ってきます。

Mid("ABC", 5, 2)   ' → ""
VB

この挙動も、頭の片隅に置いておくと安心です。


まとめ:Mid は「位置を指定して真ん中を切る」ための精密ハサミ

Mid の本質は、

「文字列の“途中”から、“指定した長さだけ”切り出す」

という一点です。

押さえておきたいポイントをギュッとまとめると、

  • Mid(文字列, 開始位置, 長さ):開始位置は「左から数えて何文字目か」
  • 第3引数を省略すると「開始位置から最後まで全部」
  • InStr と組み合わせると「区切り文字の間」を抜くのが得意
  • Len と組み合わせると「右から数えた位置」も Mid で扱える
  • 位置は 1 から始まる(0 ではない)

タイトルとURLをコピーしました