末尾の数文字を取得する【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