本ページには広告が含まれています。

Excel VBA Len関数 文字数またはバイト数を返す

Excel VBA Len関数 文字数またはバイト数を返す

Excel VBAの「Len関数」について解説します。

スポンサーリンク

Len関数とは

Excel VBA の Len関数は、文字列の文字数 または 変数の格納に必要なバイト数を含む長整数型 (Long) の値を返します。

LenB関数は、文字列のバイト数を返します。

Len 関数(Visual Basic for Applications リファレンス)

スポンサーリンク

構文(引数と戻り値)

Excel VBAの関数を使いこなすには、関数の構文を正しく理解しておくことが重要です。

構文

Len(string | varname)

string または varname のどちらか一つを指定します。

引数

引数 説明
string調査対象の文字列(式)を指定します
varname調査対象の変数名を指定します
※ 引数に Null が含まれていた場合は、Null が返されます。

戻り値

引数 説明
string指定した文字列の文字数を返します
varname変数が文字列型 (String) なら 文字数 を返します
バリアント型 (Variant) も 文字列型 (String) として処理します
それ以外のデータ型の場合は、変数バイト数を返します

ユーザー定義型を使用すると、Len関数は ファイルに書き込まれるデータのサイズを返します。ただし、次のような注意点があるようです。

varname がユーザー定義型の場合、メンバーのデータ型に可変長文字列 (string) が指定されていると、実際に必要な領域バイト数を判断できない場合があります。

解説(使用例)

では、簡単なサンプルコードを作成して使用例を解説していきます。

Len 関数 サンプル

引数 string に指定した文字列による戻り値をイミディエイトウインドウで見る簡単なコードです。

Sub Len_Sample_01()
  Dim n As Long
  
  n = Len("123456")
  Debug.Print (n) ' 6

  n = Len("くるみ")
  Debug.Print (n) ' 3

  n = Len("")
  Debug.Print (n) ' 0

  n = Len("ABC")  'Len関数は文字数取得
  Debug.Print (n) ' 3

  n = LenB("ABC") 'LenB関数はバイト数取得
  Debug.Print (n) ' 6

End Sub

実行結果のイミディエイトがこちらです。

実行結果イミディエイト画像

3番目の例では、引数の string を空白にした結果 が返ってきていることが確認できます。

4番目はLen関数、5番目がLenB関数で同じ引数の文字列 “ABC” にしています。

結果は、Len関数は文字数の「3」が返り、LenB関数ではバイト数「6」が返っています。

※ 1文字2バイトなので3文字は6バイト

Application.InputBoxを使った例

次は、Application.InputBox でセルデータの文字数も調べることができるサンプルです。

Sub Len_Sample_02()
  Dim str As String

  str = Application.InputBox( _
    prompt:="セル選択または文字列を入力してください", _
    Title:="文字列の字数を調べる", _
    Type:=2)

  MsgBox "「" & str & "」の" & vbCrLf & _
    "文字数は " & Len(str) & " 文字です"

End Sub

文字列「あいうえお」を入力した画像です。

Application.InputBoxの入力画像

結果のメッセージボックス画像がこちらです。

結果表示メッセージ画像

次に、文字数を調べたいセルを選択して取得する例です。セルを選択している画像がこちらです。

Application.InputBoxのセル選択画像

結果のメッセージボックス画像のとおり、セルに入力されたデータの文字数が取得できました。

結果表示メッセージ画像

varname がユーザー定義型の例

ユーザー定義型の場合、次のような注意点を記載しましたが、その例を確認してみたいと思います。

varname がユーザー定義型の場合、メンバーのデータ型に可変長文字列 (string) が指定されていると、実際に必要な領域バイト数を判断できない場合があります。

Len 関数(Visual Basic for Applications リファレンス)内のサンプルコードを一部流用して確認してみます。

String型が固定長の場合

Option Explicit
'ユーザー定義型でメンバーの変数を宣言する
Type CustomerRecord
  ID As Integer           '整数型
  Name As String * 10     '固定長文字列
  Address As String * 30  '固定長文字列
End Type

'String型のメンバーが固定長の場合
Sub Len_Test_01()
Dim Customer As CustomerRecord 'ユーザー型の変数宣言
Dim MyLen

'Customerの必要バイト数取得
MyLen = Len(Customer) '戻り値 42
Debug.Print (MyLen)

'メンバーのLen関数値の合計
With Customer
MyLen = Len(.ID) + Len(.Name) + Len(.Address)
Debug.Print (MyLen)   '戻り値 42
End With
End Sub

・15行目 MyLen = Len(Customer) でユーザー定義型の保存に必要なバイト数 42 を取得しています。

・20行目 MyLen = Len(.ID) + Len(.Name) + Len(.Address) でメンバーのデータ型を合計しています。
          Integer型(2バイト)+固定長文字列(10+30)= 42 と同一の値でした。

・String型を固定長で指定した場合、差異はなく特に問題はありません。

String型が可変長の場合

・6行目を Address As String に変更して可変長文字列として実行してみます。

Option Explicit
'ユーザー定義型でメンバーの変数を宣言する
Type CustomerRecord
  ID As Integer           '整数型
  Name As String * 10     '固定長文字列
  Address As String       '可変長文字列
End Type

'String型のメンバーが可変長の場合
Sub Len_Test_02()
Dim Customer As CustomerRecord 'ユーザー型の変数宣言
Dim MyLen

'Customerの必要バイト数取得
MyLen = Len(Customer) '戻り値 20
Debug.Print (MyLen)

'メンバーのLen関数値の合計
With Customer
MyLen = Len(.ID) + Len(.Name) + Len(.Address)
Debug.Print (MyLen)   '戻り値 12
End With
End Sub

・15行目 MyLen = Len(Customer) は 20 に変わりました。

・20行目 MyLen = Len(.ID) + Len(.Name) + Len(.Address) でメンバーのデータ型を合計してみます。
          Integer型(2バイト)+ 固定長文字列(10)+ 可変長文字列(0)= 12 です。

・リファレンスによると、String型の記憶領域サイズは次の表のとおりとなっています。

データ型記憶域サイズ範囲
String (可変長)10 バイト + 文字列の長さ0 〜 約 20 億
String (固定長)文字列の長さ1 〜 約 65,400

・String型(可変長) の 記憶領域サイズが「10 バイト + 文字列の長さ」ならば 22 になるはずですが?

・メンバーに可変長文字列がある場合 Len(Customer) の値が明らかにおかしいですね。

varname がユーザー定義型の場合、メンバーのデータ型に可変長文字列 (string) が指定されていると、実際に必要な領域バイト数を判断できない場合があります。

まあ、あまりこのような事例を使うことはないと思いますが(^^;)

データ型のバイト数取得サンプル(参考)

先ほどのユーザー定義型の例を使って、メンバーに各種データ型を入れて表示させてみます。

Option Explicit
'ユーザー定義型を定義する
Type MoldList
  mInt As Integer '整数型
  mLong As Long '長整数型
  mSingle As Single '単精度浮動小数点数型
  mDouble As Double '倍精度浮動小数点数型
  mCur As Currency '通貨型
  mBool As Boolean 'ブール型
  mByte As Byte 'バイト型
  mDate As Date '日付型
End Type

Sub Len_Test_03()
Dim Mold As MoldList
'メンバーのデータ型バイト数を取得して表示
With Mold
Debug.Print "バイト数 型名"
Debug.Print Len(.mInt) & " ←整数型"
Debug.Print Len(.mLong) & " ←長整数型"
Debug.Print Len(.mSingle) & " ←単精度型"
Debug.Print Len(.mDouble) & " ←倍精度型"
Debug.Print Len(.mCur) & " ←通貨型"
Debug.Print Len(.mBool) & " ←ブール型"
Debug.Print Len(.mByte) & " ←バイト型"
Debug.Print Len(.mDate) & " ←日付型"
End With
'ユーザー定義型 MoldList のバイト数
Debug.Print Len(Mold) & " ←ユーザー定義型"
End Sub

実行結果のイミディエイト画像がこちらです。

データ型サイズ取得の画像

おわりに

Excel VBA「Len 関数」についての解説でした。

Len 関数は、文字列の処理や制御を行う際に役立ちます。

実務で良く利用されるのは、Len 関数で取得した文字列の文字数をループ処理のEnd値として利用するケースです。対象文字列に対して1文字づつ処理を行う場合です。

For i = 1 To Len(tgtStr)
 ~ tgtStrに対して1文字づつなんらかの処理を行う ~
Next i

このほかにも、いろいろな場面で利用されていますので、しっかり使い方を覚えておきましょう。↓ サイト内で Len 関数を使っている記事を検索できます↓

以上、この解説が少しでもみなさまのお役に立てたなら幸いです(^^;

VBAの関数一覧はこちらです。

スポンサーリンク
スポンサーリンク

VBAサンプルファイルダウンロードページのご案内

このページで使用したサンプルファイルの登録はありません(^^;
ページ内のコードをコピーしてご利用ください。

ダウンロードページへのリンクは下のカードクリックでジャンプできます。
よろしければご利用ください!