先頭の数文字を取得する【Left関数】
今回の目標
「文字列の先頭から何文字かだけ取得できれば・・」と思ったあなたへ。
この記事では、Left関数の使い方から、Left関数を素早く使用する方法、エラーの対処方法まで、まとめて丁寧に解説します!
基本的なだけでなく、実務で使える6つの具体例つきです。
目標リスト
- 文字列の先頭から、数文字を抽出できるようになる
- Left関数の処理速度を早くする方法を知る
- Left関数で発生するエラーと対処方法を知る
説明
Left関数とは?
Left関数は、文字列の先頭(左)から指定した数の文字列を返します。
例えば、「1234567」から、4文字取得して「1234」を取り出す処理をします。
指定した文字数が、文字の長さを超えていた時は文字列全てが返ります。
(例:「123」から5文字を抽出 → 「123」が返ります。)
特殊なケースですが、「Null」の場合は、Nullが返ります。
Left関数の構文と引数一覧
Left関数の構文と引数一覧です。
Left関数の構文
Left(string, length)
Left関数の引数一覧
引数 | 省略 | 説明 |
---|---|---|
string | 不可 | 文字列を返す元となる文字列。 |
length | 不可 | 返す文字数を入力。 |
一部、Microsoft社のリファレンス【Left関数】を参照しています。
【Microsoft公式】
Left 関数 (Visual Basic for Applications) | Microsoft Learn
使用サンプル
1.文字列の先頭3文字を抽出する
本ページの主役「Left関数」を使用します。
Sub SampleLeft1()
' ABC と表示される
MsgBox Left("ABCDEF", 3)
End Sub
2.市外局番を取得する
市外局番は地域によって、2桁~5桁と変わります。
"-"の位置を取得するため、Instr関数を使用します。
Sub SampleLeft2()
Dim telNumber As String
Dim shigaiNum As String
Dim sepPos As Long
telNumber = "000-1111-2222"
sepPos = InStr(telNumber, "-")
' - の文字数が含まれるため、-1する
shigaiNum = Left(telNumber, sepPos - 1)
' 000 と表示される
MsgBox shigaiNum
End Sub
3.社員の部署名を抽出する
●●部の"部"の位置を取得するため、Instr関数を使用します。
Sub SampleLeft3()
Dim aff As String
Dim name As String
Dim sepPos As Long
aff = "総務部法務課"
sepPos = InStr(aff, "部")
name = Left(aff, sepPos)
' 総務部 と表示される
MsgBox name
End Sub
4.ファイルパスからパスとファイル名を別に抽出する
ディレクトリ区切りの文字は"¥"と"/"の2種類あるため、Replace関数を使用して"¥"で統一します。
ファイル名とパスを区切る"\"(最後の"\")の位置を取得するため、InStrRev関数を使用しています。
Sub SampleLeft4()
Dim fullPath As String
Dim filePath As String
Dim fileName As String
Dim filePos As Long
' 筆者はヤマダではありません。
fullPath = "C:\Users\Yamada\Desktop\aaa.txt"
' "/" でもディレクトリ指定ができるため、"\"で統一
fullPath = Replace(fullPath, "/", "\")
' パスの最後の"\"の位置を取得 _
※ この"\"より前がパス、後ろがファイル名
filePos = InStrRev(fullPath, "\")
' パスを取得(最後1文字の"\"を消すため、- 1する)
filePath = Left(fullPath, filePos - 1)
' ファイル名を取得(ファイルパスからパスを削除)
fileName = Replace(fullPath, filePath & "\", "")
' 表示する
MsgBox "ファイルパス:" & fullPath & vbNewLine & _
"パスのみ:" & filePath & vbNewLine & _
"ファイル名のみ:" & fileName
End Sub
【リンク】
5.拡張子を含めないファイル名を抽出する
ファイル名と拡張子を分ける"."の位置を取得するため、InStrRev関数を使用します。
Sub SampleLeft5()
Dim filefullName As String
Dim fileName As String
Dim filePos As Long
filefullName = "aaa.txt"
filePos = InStrRev(filefullName, ".")
fileName = Left(filefullName, filePos - 1)
MsgBox fileName
End Sub
InStr関数を使用すると、ファイル名に複数の"."がある場合、一番左の"."の位置を取得してしまい、拡張子とファイル名を正確に分けられず、正しくファイル名が取得できません。
Sub SampleLeft5_Bad()
Dim filefullName As String
Dim fileName As String
Dim filePos As Long
filefullName = "a.b.c.txt"
' 正しくは「filePos = InStrRev(filefullName, ".")」
filePos = InStr(filefullName, ".")
fileName = Left(filefullName, filePos - 1)
' a と表示される(正しくは a.b.c )
MsgBox fileName
End Sub
【リンク】
6.住所から都道府県名を抽出する
「都道府県」の「都」「道」「府」「県」の位置を取得するため、Instr関数を使用しています。
' 3.社員の部署名を抽出する
Sub SampleLeft6()
Dim adress As String
Dim buf As String
Dim sepPos As Long
Dim name As String
' 東京都府中市 市役所 の 住所
adress = "東京都府中市宮西町2丁目24"
' 京都府は京「都」「府」により、判断が難しいので個別処理
If Left(adress, 3) = "京都府" Then
name = "京都府"
Else
buf = Left(adress, 3)
sepPos = InStr(buf, "都") + InStr(buf, "道") + _
InStr(buf, "府") + InStr(buf, "県")
' 和歌山県や鹿児島県(4文字)の対応
If sepPos = 0 Then
sepPos = 4
End If
name = Left(adress, sepPos)
End If
MsgBox name
End Sub
処理速度を早くする方法
Left関数はバリアント型 (内部処理形式 String の Variant)を返します。
関数名 Left に $ を付けることで、戻り値の型がString型になり、処理速度がわずかに速くなります。
主に大量のデータ処理で違いが出ます。
Left$(string, length)
使用サンプルです。
Sub SampleLeftOther1()
MsgBox Left$("ABCDEF", 3)
End Sub
第一引数がNullの場合
第一引数がNullの場合はNullを返します。
Variant型以外は、Nullを格納できず「実行時エラー94」が発生します。
Nullになりえる場合は受け取る変数の型をVariantにして、Nullが返ってきていないかチェックを行いましょう。
Sub SampleLeftNull()
Dim val As Variant
val = Null
If Not IsNull(val) Then
MsgBox Left(val, 2)
Else
MsgBox "valがNullです"
End If
End Sub
第二引数が第一引数の文字数を超えた場合
第二引数が第一引数の文字数を超えた場合は、第一引数の文字列すべてを返します。
先頭10文字のみ表示(11文字以上は切り捨て)等の処理を行えます。
Sub SampleLeftOver()
Dim str As String
str = "abcdef"
' abcdef と表示される
MsgBox Left(str, 10)
End Sub