2025年5月 5日(月) 08:49 JST
VBA で配列の中身を順番に処理する場合、LBound から UBound をまでを順に処理します。
しかし、要素が 0 個の空配列は LBound も UBound も同じく 0 なので、必ず一度処理されてしまいます。
空になる可能性のある配列を扱う場合には、配列の宣言後以下の処理を行っておくと便利です。
SafeArrayAllocDescriptor 1, [配列]
この関数を使用するには、以下の定義文を Decralation に記述しておく必要があります。
Private Declare Function SafeArrayAllocDescriptor Lib "oleaut32" (ByVal cDims As Long, _ ByRef ppsaOut() As Any) As Long
この関数 (Windows API) を使用すると、UBound の値が -1 になります。
ですから、
for i = LBound([配列]) to UBound([配列])
と書いても、空配列の場合には一度も処理されることはありません。
もちろん、要素がある場合には要素数の回数だけループします。
要素数を求める場合には、以下の式で求めることができます。
UBound([配列]) - LBound([配列]) + 1