更新日:、 作成日:

VBA Left 関数:文字列の先頭から抽出する

はじめに

Excel VBA マクロの Left 関数から文字列の先頭から抽出する方法を紹介します。

Left 関数は、文字列の先頭から指定した文字数分の文字列を取得します。

123456 から 123 などを返します。

最初の数文字だけ切り出したいときに使用します。

文字列をバイトデータとして扱うには LeftB 関数を使用します。
文字列の途中から抽出するには「Mid 関数」を使用します。
文字列の最後から抽出するには「Right 関数」を使用します。
文字列を抽出するには「文字列を抽出する」をご覧ください。

Left 関数の引数と戻り値

Left(文字列, 文字数)
文字列の左から指定した文字数を抽出します。

引数「文字列」抽出元の文字列を指定します。
引数「文字数」抽出する文字数を指定します。
戻り値の型文字列型 (String)

解説

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

引数「文字数」が 1 なら、先頭から 1 文字を返します。

引数「文字数」が引数「文字列」を超えるときは、引数「文字列」をそのまま返します。

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

文字列の文字数を取得するには「Len 関数」を使用します。

使用例

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

文字列の先頭から抽出する

文字列の先頭から抽出します。

Dim s As String
s = Left("123456", 0)
Debug.Print(s) ' ""

s = Left("123456", 3)
Debug.Print(s) ' 123

s = Left("123456", 10)
Debug.Print(s) ' 123456

文字列を抽出する

Mid 関数」や「Right 関数」を使用して、途中や最後から抽出できます。

Dim s As String

s = Left("123456", 3)   ' 左から 3 文字
Debug.Print(s) ' 123

s = Mid("123456", 2, 3) ' 2 文字目から 3 文字
Debug.Print(s) ' 234

s = Right("123456", 3)  ' 右から 3 文字
Debug.Print(s) ' 456

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

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

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

    Range("A1").Value = Left(s, 3)          ' 12?、サロゲートペア文字の 1 文字だけ抽出するので文字化け
    Range("B1").Value = LeftSurrogate(s, 3) ' 12𩸽

    Range("A2").Value = Left(s, 4)          ' 12𩸽
    Range("B2").Value = LeftSurrogate(s, 4) ' 12𩸽5
End Sub

' サロゲートペア文字を 1 文字として先頭から文字を抽出します。  
Function LeftSurrogate(ByVal text As String, ByVal length As Long) As String
    LeftSurrogate = MidSurrogate(text, 1, length)
End Function

' サロゲートペア文字を 1 文字として文字を抽出します。
Function MidSurrogate(ByVal text As String, ByVal start As Long, Optional ByVal length As Long = 2147483647) As String

    Dim s As String ' 抽出した文字
    Dim char As String
    Dim index As Long ' 開始位置
    Dim midCount As Long ' 抽出した文字数

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

        ' 開始位置
        If index >= start Then
            char = Mid(text, i, 1)

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

            s = s & char

            ' 抽出文字数に達した
            midCount = midCount + 1
            If midCount >= length Then
                MidSurrogate = s
                Exit Function
            End If

        End If

    Next

    MidSurrogate = s
End Function