Mid、MidB
Mid関数とMidB関数は文字列の指定位置から指定文字数の文字列を取得します。
Mid関数とMidB関数の違いは第三引数に指定する値の考え方が異なる点です。第一引数と第二引数の考え方は同じです。
詳細は後述しますが、日本語圏のMidB関数はそのままではほとんど使い物になりません。
Shift-JISとしての全角を2バイト、半角を1バイトとして処理したい場合は「VBAでバイト単位でのLenとMidとLeftとRight」にShift-JISの感覚で使えるMid関数を紹介していますので参考にしてください。
MidB関数はバイト単位という説明は間違い
MidB関数はバイト数を指定する、という説明が多いですが、日本語圏での説明としては不十分です。
実際にはバイト数ではなく、第三引数の文字数には文字数×2を指定することになります。
これはMidB関数がShift-JIS換算のバイト数ではなく、2バイト言語ともいわれるDBCS言語のバイト数換算になっていることが原因です。
このことについては「VBAのByte単位用関数の問題点」に詳しく書いています。あなたがファイルや電文などをShift-JIS換算で判定しなければならないような場合は読んでみてください。
構文
1 2 3 4 |
Function Mid(String, Start As Long, [Length]) As Variant Function Mid$(String As String, Start As Long, [Length]) As String Function MidB(String, Start As Long, [Length]) As Variant Function MidB$(String As String, Start As Long, [Length]) As String |
String | 取り出す元の文字列を指定します。 |
Start As Long | 取り出す文字列の開始文字位置を文字数単位の数値で指定します。一番左端を開始位置とする場合は1になります。一番右端を開始位置とする場合は元の文字列の文字列長(Len(元の文字列)と書いた場合)と同じになります。0以下を指定した場合はエラーになります。 |
Length As Long | Mid関数の場合は文字数、MidB関数の場合は文字数×2を指定します。0未満を指定するとエラーになります。指定した値が元の文字列の文字数を超えた場合はエラーにはならず、開始位置から一番右端までの文字列を取得します。 |
戻り値 | 内部処理形式がStringのVariantの値を返します。 |
$ありと$なしの関数の両方を書いていますが通常は$なしで問題ありません。$ありなしの違いについては「VBA関数の$ドルマークの意味」を参照ください。
ワークシート関数のMidB関数との違い
ワークシート関数にもMidB関数がありますが、こちらは半角文字を1バイト、全角文字を2バイトとしてShift-JISコード体系の扱いになっています。
VBA関数のMidB関数のDBCSコード体系とは異なりますので注意が必要です。
サンプルコード
Mid関数とMidB関数の第三引数である取得文字数に偶数の4と奇数の3を指定した場合のサンプルです。MidB関数の第三引数に奇数を指定すると正しく取得できないことが分かります。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 |
Sub MidTest() Dim s Dim b b = "abあ1い2う3え" '// Mid関数 s = Mid(b, 3, 4) Debug.Print "[" & s & "] " & LenB(s) & " " & Len(s) & " " & LenB(StrConv(s, vbFromUnicode)) '// MidB関数 s = MidB(b, 3, 4) Debug.Print "[" & s & "] " & LenB(s) & " " & Len(s) & " " & LenB(StrConv(s, vbFromUnicode)) '// Shift-JISのバイト数換算のMid関数 s = StrConv(MidB(StrConv(b, vbFromUnicode), 3, 4), vbUnicode) Debug.Print "[" & s & "] " & LenB(s) & " " & Len(s) & " " & LenB(StrConv(s, vbFromUnicode)) '// Mid関数 s = Mid(b, 3, 3) Debug.Print "[" & s & "] " & LenB(s) & " " & Len(s) & " " & LenB(StrConv(s, vbFromUnicode)) '// --誤ったサイズ指定-- '// MidB関数 s = MidB(b, 3, 3) Debug.Print "[" & s & "] " & LenB(s) & " " & Len(s) & " " & LenB(StrConv(s, vbFromUnicode)) '// Shift-JISのバイト数換算のMid関数 s = StrConv(MidB(StrConv(b, vbFromUnicode), 3, 3), vbUnicode) Debug.Print "[" & s & "] " & LenB(s) & " " & Len(s) & " " & LenB(StrConv(s, vbFromUnicode)) End Sub |
実行結果
1 2 3 4 5 6 |
[あ1い2] 8 4 6 [bあ] 4 2 3 [あ1・] 6 3 5 [あ1い] 6 3 5 [b嵂???????? [あ1] 4 2 3 |
誤ったサイズ指定以降の行でMidB関数の第三引数の取得文字数に対して3という数字を渡していますが、MidB関数では文字は2バイトとして扱うため第三引数に3を指定された場合は”abあ1い2う3え”の4文字目”1″の半分までしか対象にならないため、実行結果が文字化けしています。