バイト単位で文字列の長さや一部を取得するには
VBAのLen関数は「文字数」をカウントするため、Shift_JISで言う全角と半角の区別を行いません。”Abc”(Aのみ全角)の場合にShift-JIS換算での4バイトという結果が欲しくても3を返してきます。
同様に、Mid関数、Left関数、Right関数も文字数で処理されます。バイト単位で処理するための関数がLenB、MidB、LeftB、RightBとして用意されているのですが、想定した動きをしません。例えば、先に挙げた”Abc”(Aのみ全角)をLenBでバイト数を算出しようとしても、4を期待するのに6が返ってきます。
原因は日本語圏でのVBAの文字コードは全角を2バイト、半角を1バイトと計算するShift-JISではなく、全ての文字を2バイトとするDBCSコード体系のため、バイト数として計算するLenB関数を通すとどんな文字も2バイトとして扱われることにより、3文字×2バイト=6バイトとして返されます。
そこで、期待通りの「バイト数」を返す関数を紹介します。それぞれの関数の引数は、各LenB等と同じです。
バイト数取得用のLen関数
1 2 3 4 5 6 7 8 |
Function LenByte(ByVal a_sValue As String) As Long If (a_sValue = "") Then LenByte = 0 Exit Function End If LenByte = LenB(StrConv(a_sValue, vbFromUnicode)) End Function |
バイト数取得用のMid関数
1 2 3 4 5 6 7 8 |
Function MidByte(ByVal a_sValue As String, a_lStart, a_lLength) As String If (a_sValue = "") Then MidByte = "" Exit Function End If MidByte = StrConv(MidB$(StrConv(a_sValue, vbFromUnicode), a_lStart, a_lLength), vbUnicode) End Function |
バイト数取得用のLeft関数
1 2 3 4 5 6 7 8 |
Function LeftByte(ByVal a_sValue As String, a_lLength) As String If (a_sValue = "") Then LeftByte = "" Exit Function End If LeftByte = StrConv(LeftB$(StrConv(a_sValue, vbFromUnicode), a_lLength), vbUnicode) End Function |
バイト数取得用のRight関数
1 2 3 4 5 6 7 8 |
Function RightByte(ByVal a_sValue As String, a_lLength) As String If (a_sValue = "") Then RightByte = "" Exit Function End If RightByte = StrConv(RightB$(StrConv(a_sValue, vbFromUnicode), a_lLength), vbUnicode) End Function |
バイト数取得用の各関数の使用例
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
Sub bytelentest() Dim a Dim b a = "AbcdE" b = LenByte(a) Debug.Print b b = MidByte(a, 3, 2) Debug.Print b b = LeftByte(a, 4) Debug.Print b b = RightByte(a, 3) Debug.Print b End Sub |