こんにちは、VBAエンジニアのやすこれです。
みなさんは、VBAでLen関数を使ったことがありますか?
- VBAで任意の文字列の文字数を取得したい
- Len関数の使いどころがわからない
- Len関数の利用の仕方を実例付きで知りたい!
そこで今回は、任意の文字列の文字数を取得するLen関数の使い方と実務での応用方法をサンプルコード付きで紹介します。
VBAでのLen関数の使い方
Len関数の基本的な使い方
Len関数は、任意の「文字列の文字数」または「変数の型のサイズ」を取得する関数です。- 基本構文
Len(文字列)
- コード例
Len("ABCDE")
文字列「ABCDE」の文字数「5」を返します。- 基本構文
Len(変数)
- 指定した変数の型が「String型」の場合は、定義された値の文字数を返す
- コード例
Dim trgtLng As Long
trgtLng = 123
Len(trgtLng)
Long型変数「trgtLng」の型のサイズ「4」を返します。- 「4」は型のサイズで、文字数ではなくバイト数
LenB関数について
LenB関数は、任意の「文字列のバイト数」または「変数の型のサイズ」を取得する関数です。- 基本構文
LenB(文字列)
- コード例
LenB("ABCDE")
文字列「ABCDE」のバイト数「10」を返します。- 基本構文
LenB(変数)
- 指定した変数の型が「String型」の場合は、定義された値のバイト数を返す
- コード例
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」の末尾に文字列を付け加える
buf = buf & LCase(Mid(trgtStr, i, 1))
- Mid(文字列, 開始位置 [, 長さ])
- 対象「文字列」の内、「開始位置」から指定した「長さ」の文字列を取得
- ex)Mid(“ABCDE”, 3, 1) → “C”
- LCase(文字列)
- 小文字に変換した対象「文字列」を取得
- ex)LCase(“ABC”) → “abc”
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
この時、右からの文字数を取得するために文字列全体の文字数を取得する「Len関数」を使用しています。文字列全体の文字数からキーワードの終端「endNum」を引いたものが求めたい文字数となるので、次の処理で目的の文字列を取得できます。
'キーワードから右側を取得
Dim trgtSection As String
trgtSection = Right(trgtDepartment, Len(trgtDepartment) - endNum)
- Right(文字列, 数値)
- 対象「文字列」を「数値」で指定した文字数だけ右から取り出す
- ex)Right(“ABCDE”, 3) → “CDE”
また、「キーワードより右側の文字列」はMid関数でも取得できますので、あわせてご覧ください。
VBAでのLen関数まとめ
今回はVBAでのLen関数の使い方と実務での使用方法を紹介いたしました。VBALen関数の実務での利用方法
引数に「文字列」または「文字列型(=String)の変数」を指定すると「文字数」を返し、引数に「文字列型(=String)以外の変数」を指定すると「型のサイズ」を返すことについても覚えておきましょう。まずは実例通り使ってみると、理解が深まり応用が効くのでおすすめです。- 先頭だけ大文字に変換する
- 入力値の桁数チェック
- キーワードより右側の文字列を取得
ぜひ使ってみてください。