更新日:、 作成日:

VBA Right 関数:文字列の最後から抽出する

はじめに

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

Right 関数は、文字列の最後から指定した文字数分の文字列を取得します。

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

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

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

Right 関数の引数と戻り値

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

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

解説

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

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

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

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

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

使用例

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

文字列の最後から抽出する

文字列の最後から抽出します。

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

s = Right("123456", 3)
Debug.Print(s) ' 456

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

文字列を抽出する

Left 関数」や「Mid 関数」を使用して、先頭や途中から抽出できます。

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 文字として取得するために、RightSurrogate 関数を作成して抽出しています。

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

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

    Range("A2").Value = Right(s, 4)          ' 𩸽56
    Range("B2").Value = RightSurrogate(s, 4) ' 2𩸽56
End Sub

' サロゲートペア文字を 1 文字として最後から文字を抽出します。
Function RightSurrogate(ByVal text As String, ByVal length As Long) As String

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

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

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

        ' 抽出文字数に達した
        count = count + 1
        If count >= length Then
            RightSurrogate = Mid(text, i)
            Exit Function
        End If

    Next

    RightSurrogate = text
End Function