構文
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に数値を指定するとエラーになります。

ちなみに、この「変数が必要です」というエラーメッセージは、
という意味です。
注意が必要なのは、引数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%は、そんな感じでしょうね。みなさんも、ご注意ください。