【ExcelVBA】Len関数の使い方とは?実務で使うテクニックも解説

仕事効率化
スポンサーリンク

こんにちは、VBAエンジニアのやすこれです。

みなさんは、VBAでLen関数を使ったことがありますか?

  • VBAで任意の文字列の文字数を取得したい
  • Len関数の使いどころがわからない
  • Len関数の利用の仕方を実例付きで知りたい!
という方もいるのではないでしょうか。

そこで今回は、任意の文字列の文字数を取得するLen関数の使い方と実務での応用方法をサンプルコード付きで紹介します。

スポンサーリンク

VBAでのLen関数の使い方

Len関数の基本的な使い方

Len関数は、任意の「文字列の文字数」または「変数の型のサイズ」を取得する関数です。
  1. 基本構文
Len(文字列)
  1. コード例
Len("ABCDE")
文字列「ABCDE」の文字数「5」を返します。
  1. 基本構文
Len(変数)
  • 指定した変数の型が「String型」の場合は、定義された値の文字数を返す
  1. コード例
Dim trgtLng As Long
trgtLng = 123
Len(trgtLng)
Long型変数「trgtLng」の型のサイズ「4」を返します。
  • 「4」は型のサイズで、文字数ではなくバイト数

LenB関数について

LenB関数は、任意の「文字列のバイト数」または「変数の型のサイズ」を取得する関数です。
  1. 基本構文
LenB(文字列)
  1. コード例
LenB("ABCDE")
文字列「ABCDE」のバイト数「10」を返します。
  1. 基本構文
LenB(変数)

  • 指定した変数の型が「String型」の場合は、定義された値のバイト数を返す


  1. コード例
Dim trgtLng As Long
trgtLong = 123
LenB(trgtLong)
Long型変数「trgtLng」の型のサイズ「4」を返します。

Len関数の引数に「変数」を指定した場合の注意

「Len関数」は引数に「変数」を指定すると型のサイズをバイト数で返しますが、変数の型が「String」の場合は「定義された値の文字数」を返します。

「変数」が「String型」以外の時

'Long型の変数を定義
Dim trgtLng As Long
trgtLng = 123

MsgBox "返り値:" & Len(trgtLng)
変数の型が「String」ではないため、次の画像のように、代入されている値に関わらず「Long」型変数のサイズ「4」バイトが返される。

「変数」が「String型」の時

'String型の変数を定義
Dim trgtStr As String
trgtStr = "ABC"

MsgBox "返り値:" & Len(trgtStr)
変数の型が「String」のため、次の画像のように、代入されている値の文字数「3」が返される。

Len関数の実務での利用方法

先頭だけ大文字に変換する

'対象の文字列を変数に定義
Dim trgtStr As String
trgtStr = "ABCDE"

Dim i As Long
'変換後の文字列を保持する変数を定義
Dim buf As String
For i = 1 To Len(trgtStr)
    If i = 1 Then
        '1文字目(i = 1)の時のみ大文字にして「buf」に定義
        buf = UCase(Mid(trgtStr, i, 1))
    Else
        '1文字目以外の時は小文字に変換して、すでに定義された「buf」の末尾に文字列を付け加える
        buf = buf & LCase(Mid(trgtStr, i, 1))
    End If
Next i

trgtStr = buf
まず、次の部分で対象となる文字列を定義します。
'対象の文字列を変数に定義
Dim trgtStr As String
trgtStr = "ABCDE"
次に、今回の処理のメイン部分である繰り返し処理「ForNext」を使って、1文字ずつ処理をしていきます。
Dim i As Long
'変換後の文字列を保持する変数を定義
Dim buf As String
For i = 1 To Len(trgtStr)
    If i = 1 Then
        '1文字目(i = 1)の時のみ大文字にして「buf」に定義
        buf = UCase(Mid(trgtStr, i, 1))
    Else
        '1文字目以外の時は小文字に変換して、すでに定義された「buf」の末尾に文字列を付け加える
        buf = buf & LCase(Mid(trgtStr, i, 1))
    End If
Next i

trgtStr = buf
ループ処理は「1」から「Len(trgtStr)」つまり、文字数分(= 5回)繰り返されます。

ここで「If文」を使い「i = 1」つまり一文字目の処理とそれ以外の処理を分岐させています。

1文字目(i = 1)の場合は次の処理を行い、変数「buf」に先頭の文字を大文字に変換して代入します。まず「Mid関数」を使って「trgtStr」の「i」つまり1文字目を抽出して「UCase関数」を使って大文字に変換しています。
'1文字目(i = 1)の時のみ大文字にして「buf」に定義
buf = UCase(Mid(trgtStr, i, 1))
  • Mid(文字列, 開始位置 [, 長さ])
  • 対象「文字列」の内、「開始位置」から指定した「長さ」の文字列を取得
  • ex)Mid(“ABCDE”, 3, 1) → “C”
  • UCase(文字列)
  • 大文字に変換した対象「文字列」を取得
  • ex)UCase(“abc”) → “ABC”
1文字目以外の場合は次の処理を行い、変数「buf」の末尾に「trgtStr」の「i」文字目を小文字に変換して代入します。まず「Mid関数」を使って「trgtStr」の「i」文字目を抽出して「LCase関数」を使って小文字に変換しています。
'1文字目以外の時は小文字に変換して、すでに定義された「buf」の末尾に文字列を付け加える
buf = buf & LCase(Mid(trgtStr, i, 1))
  • Mid(文字列, 開始位置 [, 長さ])
  • 対象「文字列」の内、「開始位置」から指定した「長さ」の文字列を取得
  • ex)Mid(“ABCDE”, 3, 1) → “C”
  • LCase(文字列)
  • 小文字に変換した対象「文字列」を取得
  • ex)LCase(“ABC”) → “abc”
最後に、対象文字列「trgtStr」の文字数分繰り返し処理を行う「ForNext」処理で定義された「buf」を再度「trgtStr」に代入すると、先頭だけ大文字に変換された文字列を取得できます。

Mid関数については、下記でも詳しく解説しているので、読んでみてください。
また「StrConv関数」でも「先頭だけを大文字」にすることができます。
  • StrConv(文字列, 形式)
  • 対象「文字列」を指定した「形式」で変換した値を返す
  • ex)StrConv(“abcde”, vbProperCase) → “Abcde”

入力値の桁数チェック

'入力値の検査結果を保持する変数を定義
Dim chckFlg As Boolean
chckFlg = False

'入力値を保持する変数を定義
Dim trgtStr As String

'正しい値が入力されるまでチェックと入力を繰り返す
Do Until chckFlg = True
    'InputBoxを表示し、入力された値を変数「trgtStr」に定義
    trgtStr = InputBox("任意の数字を5桁で入力してください。")
    'inputBoxの「キャンセル」、「×」が押された場合を検出し、処理を終了する
    If StrPtr(trgtStr) = 0 Then
        Exit Do
    End If
    
    '入力値が数値かどうかを判定
    If IsNumeric(trgtStr) = True Then
        '入力値の文字数を取得(桁数のチェック)
        If Len(trgtStr) = 5 Then
            '入力値が5桁の数字なら「chckFlg」を「True」として、繰り返し処理を抜ける
            chckFlg = True
        Else
            MsgBox ("5桁の数字を入力してください。")
        End If
    Else
        MsgBox ("数字を入力してください。")
    End If
Loop
まず、今回の処理で使用する各種変数を定義します。
'入力値の検査結果を保持する変数を定義
Dim chckFlg As Boolean
chckFlg = False

'入力値を保持する変数を定義
Dim trgtStr As String
次に「DoLoopUntil」を使って条件を満たすまで処理を繰り返しています。
'正しい値が入力されるまでチェックと入力を繰り返す
Do Until chckFlg = True
    'InputBoxを表示し、入力された値を変数「trgtStr」に定義
    trgtStr = InputBox("任意の数字を5桁で入力してください。")
    'inputBoxの「キャンセル」、「×」が押された場合を検出し、処理を終了する
    If StrPtr(trgtStr) = 0 Then
        Exit Do
    End If
    
    '入力値が数値かどうかを判定
    If IsNumeric(trgtStr) = True Then
        '入力値の文字数を取得(桁数のチェック)
        If Len(trgtStr) = 5 Then
            '入力値が5桁の数字なら「chckFlg」を「True」として、繰り返し処理を抜ける
            chckFlg = True
        Else
            MsgBox ("5桁の数字を入力してください。")
        End If
    Else
        MsgBox ("数字を入力してください。")
    End If
Loop
ループ処理は「chckFlg = True」となるまで繰り返されます。

はじめに、次の部分で「InputBox」を表示して、入力された値を「trgtStr」に定義します。
'InputBoxを表示し、入力された値を変数「trgtStr」に定義
trgtStr = InputBox("任意の数字を5桁で入力してください。")
続いて次の処理で「StrPtr関数」を用いて「InputBox」の「キャンセル」ボタンと「×」ボタンが押されたかどうかを判定します。どちらかが押された場合は「0」を返すので、その際は繰り返し処理を終了します。
If StrPtr(trgtStr) = 0 Then
    Exit Do
End If
次に「If文」を使って、入力値の判定を行います。

まず「IsNumeric関数」を使って、入力された値が数字かどうかを判定しています。
数字だった場合は「Len関数」を使って、文字数が「5」つまり数値が5桁かどうかを判定しています。

5桁の数字だった場合は「chckFlg = True」として繰り返し処理を終了します。
'入力値が数値かどうかを判定
If IsNumeric(trgtStr) = True Then
    '入力値の文字数を取得(桁数のチェック)
    If Len(trgtStr) = 5 Then
        '入力値が5桁の数字なら「chckFlg」を「True」として、繰り返し処理を抜ける
        chckFlg = True
    Else
        MsgBox ("5桁の数字を入力してください。")
    End If
Else
    MsgBox ("数字を入力してください。")
End If
※1「IsNumeric(trgtStr) = True」とならない場合に表示されるMsgBox
※2「Len(trgtStr) = 5」とならない場合に表示されるMsgBox
  • IsNumeric(判定対象)
  • 判定対象が「数値」なら「True」それ以外なら「False」を返す
  • ex)IsNumeric(123) → True
以上の処理で、任意の桁数が入力されているかをチェックすることができます。

キーワードより右側の文字列を取得

'キーワード右側を取り出す元となる文字列を定義
Dim trgtDepartment As String
trgtDepartment = "営業部営業第一課"

'キーワードを定義
Dim keyword As String
keyword = "部"

'キーワード位置を取得
Dim endNum As Long
endNum = InStr(trgtDepartment, keyword)

'キーワードから右側を取得
Dim trgtSection As String
trgtSection = Right(trgtDepartment, Len(trgtDepartment) - endNum)
まず、元となる文字列やキーワードを次の部分で定義します。
'キーワード右側を取り出す元となる文字列を定義
Dim trgtDepartment As String
trgtDepartment = "営業部営業第一課"

'キーワードを定義
Dim keyword As String
keyword = "部"
つづいて、次の部分で、キーワード位置を取得します。
'キーワード位置を取得
Dim endNum As Long
endNum = InStr(trgtDepartment, keyword)
  • InStr(文字列1, 文字列2)
  • 対象「文字列1」の内、「文字列2」が始まる位置を返す
  • ex)InStr(“ABC”, “B”) → 2
最後に「Right関数」を使って、対象の文字列「trgtDepartment」の内、右からキーワードの次の文字位置までを取得すれば、キーワードより右側の文字列を取り出すことができます。

この時、右からの文字数を取得するために文字列全体の文字数を取得する「Len関数」を使用しています。文字列全体の文字数からキーワードの終端「endNum」を引いたものが求めたい文字数となるので、次の処理で目的の文字列を取得できます。
'キーワードから右側を取得
Dim trgtSection As String
trgtSection = Right(trgtDepartment, Len(trgtDepartment) - endNum)
  • Right(文字列, 数値)
  • 対象「文字列」を「数値」で指定した文字数だけ右から取り出す
  • ex)Right(“ABCDE”, 3) → “CDE”
InStr関数Right関数については、下記でも詳しく解説しているので、読んでみてください。
また、「キーワードより右側の文字列」はMid関数でも取得できますので、あわせてご覧ください。

VBAでのLen関数まとめ

今回はVBAでのLen関数の使い方と実務での使用方法を紹介いたしました。
VBALen関数の実務での利用方法
  • 先頭だけ大文字に変換する
  • 入力値の桁数チェック
  • キーワードより右側の文字列を取得
引数に「文字列」または「文字列型(=String)の変数」を指定すると「文字数」を返し、引数に「文字列型(=String)以外の変数」を指定すると「型のサイズ」を返すことについても覚えておきましょう。まずは実例通り使ってみると、理解が深まり応用が効くのでおすすめです。

ぜひ使ってみてください。