更新日:、 作成日:

VBA Len 関数:文字数を取得する

はじめに

Excel VBA マクロの Len 関数から文字数を取得する方法を紹介します。

Len 関数は、文字列の文字数を返します。または構造体など型のバイト数を返します。

LenB 関数は、文字列のバイト数を返します。

ABC なら、Len 関数は 3 を返します。LenB 関数は 6 を返します。

Integer 型の変数なら 2 を返します。

文字列の文字数をカウントしたいときに使用します。

文字列を抽出するには「文字列を抽出する」をご覧ください。

Len 関数、LenB 関数の引数と戻り値

Len(文字列)
文字列の文字数を取得します。

Len()
のサイズを取得します。

引数「文字列」文字列を指定します。
引数「型」構造体や Integer 型の変数を指定します。
戻り値の型数値型 (Long)

LenB(文字列)
文字列のバイト数を取得します。

引数「文字列」文字列を指定します。
戻り値の型数値型 (Long)

解説

Len 関数

引数に String 型を指定すると文字数を、それ以外の型を指定するとその型のバイト数を返します。

引数「文字列」が空文字 "" なら 0 を返します。

引数「型」が Byte 型なら 1 を、Integer 型なら 2 を、Long 型なら 4 を返します。

Unicode のサロゲートペア文字 𩸽😃 は 2 文字として扱います。これを 1 文字として取得したいときは、関数を作成します。

LenB 関数

文字列のバイト数を取得できます。

VBA の文字コードは Unicode (UTF-16) です。1 文字 2 バイトで ABC は 6 バイトになります。これを半角文字だけ 1 バイトとするには「StrConv 関数」を使用して、文字コードを Shift_JIS に変換します。

文字コードを変換するには「文字コードを変換や判定する」をご覧ください。

使用例

Len 関数の使用例を紹介します。

文字数を取得する

文字列の文字数を取得します。

Dim i As Integer
i = Len("123456")
Debug.Print(i) ' 6

i = Len("あいう")
Debug.Print(i) ' 3

i = Len("")
Debug.Print(i) ' 0

i = Len("ABC")  ' 文字数
Debug.Print(i) ' 3

i = LenB("ABC") ' バイト数、1 文字 2 バイト
Debug.Print(i) ' 6

半角文字を 1 バイトとして取得する

StrConv 関数」を使用して、Shift_JIS に変換して半角文字を 1 バイトとして取得できます。

Dim i As Integer
i = LenB(StrConv("ABC", vbFromUnicode)) ' Shift_JIS に変換 
Debug.Print(i) ' 3

i = LenB(StrConv("ABC", vbFromUnicode))
Debug.Print(i) ' 6

i = LenB(StrConv("アイウ", vbFromUnicode))
Debug.Print(i) ' 3

i = LenB(StrConv("アイウ", vbFromUnicode))
Debug.Print(i) ' 6

変数のバイト数を取得する

変数の型のバイト数を取得します。

Dim b As Byte
Dim i As Integer
Dim l As Long

i = Len(b)
Debug.Print(i) ' 1

i = Len(i)
Debug.Print(i) ' 2

i = Len(l)
Debug.Print(i) ' 4

1 文字ずつループする

Mid 関数」を使用して、1 文字ずつすべての文字を抽出できます。

Dim s As String
s = "123456789"

Dim i As Integer
For i = 1 To Len(s)
    ' 処理
    Debug.Print(Mid(s, i, 1)) ' 1 2 3 4 5 6 7 8 9
Next

サロゲートペア文字を 1 文字として取得する

サロゲートペア文字を 1 文字として取得するために、LenSurrogate 関数を作成して文字数を取得しています。

サロゲートペア文字を判定する IsSurrogate 関数を使用しています。詳しくは「文字コードを変換や判定する」をご覧ください。
Sub 実行()
    Dim s As String
    s = WorksheetFunction.Unichar(171581) ' 𩸽
    Debug.Print(Len(s))          ' 2
    Debug.Print(LenSurrogate(s)) ' 1
End Sub

' サロゲートペア文字を 1 文字として文字数を取得します。
Function LenSurrogate(ByVal text As String) As Long

    Dim count As Long ' サロゲートペアを 1 文字とした文字数

    ' 文字数を数える
    Dim i As Long
    For i = 1 To Len(text)

        If IsSurrogate(Mid(text, i)) Then
            ' サロゲートペア文字
            i = i + 1
        End If

        count = count + 1
    Next

    LenSurrogate = count
End Function