構文
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%は、そんな感じでしょうね。みなさんも、ご注意ください。