末尾の数文字を取得する【Right関数】

今回の目標

「文字列の末尾から何文字かを取得できないの?」と疑問を持ったあなたへ。
この記事では、Right関数の使い方から、Right関数を素早く使用する方法、エラーの対処方法まで、まとめて丁寧に解説します! 基本的なだけでなく、実務で使える6つの具体例つきです。

目標リスト

  • 文字列の末尾から、数文字を抽出できるようになる
  • Right関数の処理速度を早くする方法を知る
  • Right関数で発生するエラーと対処方法を知る

説明

Right関数とは?

Right関数は、文字列の末尾(右)から指定した数の文字列を返します。
例えば、「1234567」から、4文字取得して「4567」を取り出す処理をします。
指定した文字数が、文字の長さを超えていた時は文字列全てが返ります。
(例:「123」から5文字を抽出 → 「123」が返ります。)
特殊なケースですが、「Null」の場合は、Nullが返ります。

Right関数の構文と引数一覧

Right関数の構文と引数一覧です。

Right関数の構文
Right(string, length)

Right関数の引数一覧

引数省略説明
string不可文字列を返す元となる文字列。
length不可返す文字数を入力。

一部、Microsoft社のリファレンス【Right関数】を参照しています。
【Microsoft公式】
Right 関数 (Visual Basic for Applications) | Microsoft Learn

使用サンプル

1.文字列の末尾3文字を抽出する

本ページの主役「Right関数」を使用します。

Sub SampleRight1()
    ' DEF と表示される
    MsgBox Right("ABCDEF", 3)
End Sub
2.郵便番号の下4桁を抽出

郵便番号の下四桁を抽出するため、郵便番号の末尾から4文字を抽出します。

Sub SampleRight2()
    Dim zipCode As String   ' 郵便番号7桁
    Dim showDat As String   ' 郵便番号の下4桁
    
    zipCode = "012-3456"
    ' 郵便番号の下4桁を抽出する
    showDat = Right(zipCode, 4)
    ' 3456 と表示される
    MsgBox showDat
End Sub
3.電話番号の加入者番号

文字数を取得するため、Len関数を使用します。
"-"の位置を取得するため、InStrRev関数を使用します。
電話番号は「市外局番-市内局番-加入者番号」で構成されており、市外局番は2桁~5桁、加入者番号は『原則』4文字らしいです。

Sub SampleRight3()
    Dim telNumFull As String
    Dim telNumKany As String
    Dim kanyNum As Long ' 加入者番号の桁数
    Dim sepPos As Long
    
    telNumFull = "00-1122-3344"
    ' 市内局番と市外局番を分ける "-" の位置を取得
    sepPos = InStrRev(telNumFull, "-")
    ' 加入者番号の桁数の取得
    kanyNum = Len(telNumFull) - sepPos
    ' 加入者番号を抽出
    telNumKany = Right(telNumFull, kanyNum)
    ' 3344 と表示される
    MsgBox telNumKany
End Sub
4.メールアドレスのドメイン部を抽出する

ローカル部とドメイン部を分ける@が何文字目かを取得するため、Instr関数を使用します。
アドレス全体の文字列の長さを取得するため、Len関数を使用します。
補足ですが、@はローカル部とドメイン部を分ける役割を持ち、@をローカル部やドメイン部に使用することは出来ません。

Sub SampleRight4()
    Dim mailAddress As String
    Dim showDat As String
    Dim sepPos As Long
    Dim domLen As Long
    mailAddress = "hogefuga@example.com"
    ' @ 以降がドメイン部のため、@ が何文字目か取得する
    sepPos = InStr(mailAddress, "@")
    ' アドレス全体の文字数 - @の位置 → ドメイン部の長さ
    domLen = Len(mailAddress) - sepPos
    ' メールアドレスのドメイン部を抽出する
    showDat = Right(mailAddress, domLen)
    '  example.com と表示される
    MsgBox showDat
End Sub
5.ファイルパスからパスとファイル名を別に抽出する

ディレクトリ区切りの文字は"¥"と"/"の2種類あるため、Replace関数を使用して"¥"で統一します。
ファイル名とパスを区切る"\"(最後の"\")の位置を取得するため、InStrRev関数を使用しています。

Sub SampleRight5()
    Dim fullPath As String
    Dim filePath As String
    Dim fileName As String
    Dim sepPos As Long
    
    ' 筆者はヤマダではありません。
    fullPath = "C:\Users\Yamada\Desktop\aaa.txt"
    
    ' "/" でもディレクトリ指定ができるため、"\"で統一
    fullPath = Replace(fullPath, "/", "\")
    ' パスとファイル名を区切る"\" が何文字目かを取得
    sepPos = InStrRev(fullPath, "\")
    ' パスの最後の"\"の位置を取得 _
        ※ この"\"より前がパス、後ろがファイル名
    fileName = Right(fullPath, Len(fullPath) - sepPos)
    ' パスを取得(パスの最後1文字の"\"を消すため、"\"を追加)
    filePath = Replace(fullPath, "\" & fileName, "")
    ' 表示する
    MsgBox "ファイルパス:" & fullPath & vbNewLine & _
            "パスのみ:" & filePath & vbNewLine & _
            "ファイル名のみ:" & fileName
End Sub

【リンク】

6.ファイル名から拡張子を取得

拡張子の前の"."が何文字目かを取得するため、InstrRev関数を使用しています。
ファイル名の文字数を取得するため、Len関数を使用しています。

Sub SampleRight6()
    Dim fileName As String
    Dim exteName As String  ' 拡張子名
    Dim exteLen As Long     ' 拡張子が何文字か
    Dim sepPos As Long
    
    fileName = "abcd.jpeg"
    ' ファイル名と拡張子を分ける"."の位置
    sepPos = InStrRev(fileName, ".")
    ' ファイル名の文字数 - 拡張子名の前の"."までの文字数 → 拡張子が何文字か
    exteLen = Len(fileName) - sepPos
    ' 拡張子名を抽出する
    exteName = Right(fileName, exteLen)
    ' 拡張子名を表示する
    MsgBox exteName
End Sub

【リンク】

処理速度を早くする方法

Right関数はバリアント型 (内部処理形式 String の Variant)を返します。
関数名 Right に $ を付けることで、戻り値の型がString型になり、処理速度がわずかに速くなります。
主に大量のデータ処理で違いが出ます。

Right$(string, length)

使用サンプルです。

Sub SampleRightOther1()
    MsgBox Right$("ABCDEF", 3)
End Sub

第一引数がNullの場合

第一引数がNullの場合はNullを返します。
Variant型以外は、Nullを格納できず「実行時エラー94」が発生します。
Nullになりえる場合は受け取る変数の型をVariantにして、Nullが返ってきていないかチェックを行いましょう。

Sub SampleRightNull()
    Dim val As Variant
    val = Null
    If Not IsNull(val) Then
        MsgBox Right(val, 2)
    Else
        MsgBox "valがNullです"
    End If
End Sub

第二引数が第一引数の文字数を超えた場合

第二引数が第一引数の文字数を超えた場合は、第一引数の文字列すべてを返します。
末尾10文字のみ表示(11文字以上は切り捨て)等の処理を行えます。

Sub SampleRightOver()
    Dim str As String
    str = "abcdef"
    ' abcdef と表示される
    MsgBox Right(str, 10)
End Sub

関連リンク

ページの先頭へ