【VBA】ReDim した変数を LBound(ary) したら負ける

VBAってクソだなエントリー。

ReDim ary(0)

VBAは可変長コレクションオブジェクトをサポートする代わりに、 一度確保した領域を再度拡張する ReDim が用意されている。

Dim ary() As String
ReDim ary(10)

このとき、ReDimで確保されるインデックスは「0~10」の11つ。 ・・・10と書いたら11つになる。

0も指定できるが、sろれでも最低 1 インデックスが確保されている。

Dim ary() As String
ReDim ary(0)

Dim i As  Long
For i = LBound(ary) To UBound(ary)
   ' ループが 1 回回る
Next

ReDimでは、要素数 0 の配列を定義することができない。 通常、VBAではインデックスが 1 始まりであることから、どう考えてもインデックス 0 が使えてしまうのは従来ならバグにすべきものに思える。

現に、Jsonリアライザーを書くときに 0 要素配列が表現できなくて困った。

ReDimした変数を厳格に扱う

代入はインデックス1はじまり

Dim ary() As String
ReDim ary(3)

ary(1) = "foo"
ary(2) = "var"
ary(3) = "baz"

ループは 1 To UBound(ary)

Dim I As Long
For i = 1 To UBound(ary)
   ' loop...
Next