[Excel VBA] 空の配列を管理する

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

コメント (0件)


くろねこ研究所
https://www.blackcat.xyz/article.php/ProgFAQ-Xls_EmptyQueue