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

関連リンク

ページの先頭へ