【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