Len関数の返り値

Len関数の返り値

Len関数に文字列ではなく数値を渡してしまい、意図しない値が返っていたために小ハマりしてしまったので、反省も込めて覚え書き的に記しておく。

Len関数に数値を渡すとどうなるか

たとえば、次のようなコードの場合。

Dim hoge As Long
hoge = -1
Debug.Print Len(hoge)

通常、こんなアホなコードを書くことはないと思うが、初心者だと

Len関数 = 文字数を返す

という強固な思い込みがあるので、下手をすると

Len(hoge)

が、

2を返す

とか考えてしまわないだろうか。

全然違うのである。

Microsoft Office デベロッパー センター より

Microsoft Office デベロッパー センターの「Len関数」の項によると、

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

Microsoft Office デベロッパー センターの「Len関数」の項より

※強調は引用者。

つまり、文字列を渡した場合なら素直に文字数を返してくれるが、文字列以外を渡してしまったら、「変数の格納に必要なバイト数」が返ってしまうのである。

したがって、上掲コードの場合、変数hogeLong型ゆえに、Len(hoge)4を返すことになる。

実験

上記のことを示すためにちょいと実験。

リスト1 標準モジュール
Private Sub test()
  Dim a As Integer, b As Long, c As Currency
  a = -1
  b = a
  c = a
  Dim d As String
  d = CStr(a)
  Debug.Print Len(a); Len(b); Len(c); Len(d)
End Sub

変数aInteger型、bLong型、cCurrency型にして、全てに-1を代入。変数dString型にし、-1String型にキャストした上で代入した。

実行結果

イミディエイト・ウインドウの出力は、

f:id:akashi_keirin:20190818181907j:plain

ご覧のとおり。

おわりに

「だから何?」とか言われましても……。