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 ではない)
