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