Len


構文

Len(string|varname)

引数stringには、文字数を調べる文字列を指定します。

引数varnameには、大きさを調べる変数名を指定します。

解説

引数stringと引数varnameは、どちらかひとつを指定します。

引数stringを指定すると、引数stringで指定した文字列の文字数を返します。

引数varnameを指定すると、引数varnameで指定した変数に必要なバイト数を返します。

サンプル

次の例は、ユーザーが入力した文字数を表示します。

Sub Sample1()
    Dim str As String
    str = InputBox("文字を入力してください")
    MsgBox str & "は" & Len(str) & "文字です"
End Sub

ワンポイント

Len関数は、文字数を返す関数です。たとえば、Len("tanaka")は6を返します。このように、引数stringに文字列を指定するのが一般的な使い方です。もし、引数stringに数値を指定するとエラーになります。

ちなみに、この「変数が必要です」というエラーメッセージは、

  1. Len関数の引数には「文字列」か「変数」のどちらかを指定する
  2. 「123」は文字列ではない
  3. ってことは、「123」は変数なのか?
  4. でも「123」なんて変数はない。宣言してないし、宣言もできない
  5. 「123」は変数ではないじゃないか
  6. 「(この引数には)変数が必要です」(←今ここ)

という意味です。

注意が必要なのは、引数stringではなく、引数varnameを指定するときです。引数varnameには変数を指定します。たとえば、次のような使い方です。

Sub Sample2()
    Dim A As String
    A = "tanaka"
    MsgBox Len(A)
End Sub

では、次のケースではどうでしょう。

Sub Sample3()
    Dim A As Long
    A = 100
    MsgBox Len(A)
End Sub

長整数型(Long)の変数Aに、数値の100を入れました。この100は3文字です。結果は3になりそうなものですが、実行すると次のようになります。

3文字なのに4と表示されています。

これは、Len関数が調べたものが、変数Aに入っている「100」ではなく、変数Aそのものだからです。この4は、変数A(長整数型)の大きさです。

大きさ
バイト型 (Byte) 1 バイト
ブール型 (Boolean) 2 バイト
整数型 (Integer) 2 バイト
長整数型 (Long) 4 バイト
単精度浮動小数点数型 (Single) 4 バイト
倍精度浮動小数点数型 (Double) 8 バイト
通貨型 (Currency) 8 バイト
日付型 (Date) 8 バイト
オブジェクト型 (Object) 4 バイト
Sub Sample4()
    Dim A As Byte
    Dim B As Boolean
    Dim C As Integer
    Dim D As Long
    Dim E As Single
    Dim F As Double
    Dim G As Currency
    Dim H As Date
    Dim I As Object
        
    Range("B1") = Len(A)
    Range("B2") = Len(B)
    Range("B3") = Len(C)
    Range("B4") = Len(D)
    Range("B5") = Len(E)
    Range("B6") = Len(F)
    Range("B7") = Len(G)
    Range("B8") = Len(H)
    Set I = Range("A1")
    Range("B9") = Len(I)
End Sub

オブジェクト変数は、何かのオブジェクトをセットしないと使用できませんので、Range("A1")を入れていますが、その他の変数は、宣言しただけで何の値も格納されていない点に留意してください。

やっかいなのは、文字列型(String)とバリアント型(Variant)です。まずは文字列型(String)から。文字列型には"可変長文字列型"と"固定長文字列型"の2種類があります。一般的に使われる「Dim A As String」という宣言は"可変長文字列型"です。"可変長"ということですから、ここには何文字でも入ります。厳密には2GBまでですが、そんな巨大な文字列を入れる人なんて、我が国にはいないでしょう。"可変長文字列型"の大きさは「10 バイト + 文字列の長さ 0 ~ 2GB」です。しかし、Len関数に"可変長文字列型"を指定したときは、変数の大きさではなく、格納されている文字列の大きさを返します。

Sub Sample5()
    Dim A As String
    A = "1"
    MsgBox Len(A)
End Sub

まず使う機会はありませんけど、"固定長文字列型"の場合は、格納されている文字列にかかわらず、変数の大きさを返します。

Sub Sample6()
    Dim A As String * 3
    A = "1"
    MsgBox Len(A)
End Sub

バリアント型(Variant)は、けっこう複雑です。バリアント型に数値を入れたときのサイズは「16 バイト」です。一方、バリアント型に文字列を入れると「22 バイト + 文字列の長さ」になります。しかし、いずれにしても、Len関数にバリアント型を指定したときは、変数そのもののサイズではなく、格納されている文字列のサイズを返します。

Sub Sample7()
    Dim A As Variant
    A = "1"
    MsgBox Len(A)
End Sub

このへんの仕組みを理解していないと、予期しない結果を生じます。次のコードは、InputBoxでユーザーから2桁の数値を受け取ります。何らかの理由で、必ず2桁にしてもらいたいです。でも、ユーザーは気まぐれです。1桁や3桁の数値を誤って入力してしまうかもしれません。そこで、入力された数値の桁数(文字数)をLen関数で調べます。そういうコードです。なお、ここでは話を簡単にするため、入力されるのは必ず数値だとします。また、ユーザーが[キャンセル]ボタンをクリックしたときのことは考慮しません。

Sub Sample8()
    Dim A As Long
    A = InputBox("2桁の数値を入れて")
    If Len(A) = 2 Then
        MsgBox "2桁の数値です"
    Else
        MsgBox "桁数が違います"
    End If
End Sub

なぜ、正しく2桁の「12」を入れたのに、それを2桁と認識してくれなかったのか。お分かりですね。このLen関数は変数Aの大きさを調べたのです。長整数型(Long)は4バイトですから、Len(A)の結果は常に4です。じゃ、これを次のようにしたら。

Sub Sample8()
    Dim A As String
    A = InputBox("2桁の数値を入れて")
    If Len(A) = 2 Then
        MsgBox "2桁の数値です"
    Else
        MsgBox "桁数が違います"
    End If
End Sub

この微妙な違いが分かりますか。最初のコードで、何度やっても2桁と認識してくれず「あれ~変だなぁ~何でだろう~ったくVBAってムズい」な~んて思いながら、訳も分からず、自分がどこをどう直したかも把握せず、コードをゴニョゴニョしているうちに、偶然LongをStringに書き換えた結果「ああ、うまくいった~よかった~最初のは何だったんだろう~ま、いっか~うまくいったし~きっとバグだろうな~俺悪くないしぃ~」みたいなw おそらく日本人の86%は、そんな感じでしょうね。みなさんも、ご注意ください。