更新日:、 作成日:

VBA IsArray 関数:配列かどうかを判定する

はじめに

Excel VBA マクロの IsArray 関数から配列かどうかを判定する方法を紹介します。

IsArray 関数は、指定した値が配列かどうかを判定します。

配列なら True を返します。

UBound(配列) - LBound(配列) + 1 のようにして、配列の要素数を取得できます。

(Not 配列) = -1 のようにして、配列が空かどうかを判定できます。

変数の値が配列かどうかを判定するときに使用します。

配列について詳しくは「配列」をご覧ください。

IsArray 関数の引数と戻り値

IsArray()
が配列のときは True を返します。それ以外のときは False を返します。

引数「配列」判定したい値を指定します。
戻り値の型ブール型 (Boolean)

解説

引数「値」が静的配列、動的配列、二次元配列などの配列なら True を返します。それ以外の数値や文字列などは False を返します。

配列の要素数は関係ありません。要素数 0 の配列でも、空の動的配列でも True を返します。

配列の要素数

UBound(配列) - LBound(配列) + 1 のように入力して、配列の長さ (要素数) を取得できます。

空の配列

動的配列の要素数を決定していない状態 (ReDim していないとき) が空の配列です。その配列の要素数を取得すると「エラー 9 インデックスが有効範囲にありません。」が発生します。

(Not 配列) = -1 のように入力して、空の配列なら True を返します。

使用例

IsArray 関数の使用例を紹介します。

配列か判定する

配列かどうかを判定します。

Dim 静的(3) As String
Dim 動的() As Integer
Dim b As Boolean

b = IsArray(静的)
Debug.Print(b) ' True

b = IsArray(動的)
Debug.Print(b) ' True

b = IsArray(1)
Debug.Print(b) ' False

b = IsArray("あいう")
Debug.Print(b) ' False

Dim 二次元(1, 1) As Integer
b = IsArray(二次元)
Debug.Print(b) ' True

配列の要素数や空かどうか判定する

空の配列に対しては要素数を取得できません。そういうときは要素数 0 の配列を代入します。

Dim i As Integer
    
Dim 静的(3) As String
i = UBound(静的) - LBound(静的) + 1
Debug.Print(i) ' 4、要素数

Dim 動的() As Variant
i = UBound(動的) - LBound(動的) + 1 ' エラー、空の配列

Dim b As Boolean
b = ((Not 動的) = -1)
Debug.Print(b) ' True、空の配列

動的 = Array() ' 要素数 0 の配列を代入
i = UBound(動的) - LBound(動的) + 1
Debug.Print(i) ' 0、要素数

b = ((Not 動的) = -1)
Debug.Print(b) ' False、空でない配列

ループできるか判定する

関数の戻り値が配列またはそれ以外 (Nothing) など 2 種類あるときは、If 文で判定して配列のときだけループできます。

Dim 配列 As Variant
配列 = Array(1, 2, 3) ' 自作の配列を返す関数など

' 配列のときだけ For Each でループする
Dim v As Variant
If IsArray(配列) = True Then
    For Each v In 配列
        Debug.Print(v)
    Next
End If

' 配列のときだけ For Next でループする
Dim i As Integer
Dim min As Integer
Dim max As Integer
If IsArray(配列) = True Then
    min = LBound(配列)
    max = UBound(配列)
    For i = min To max
        Debug.Print(配列(i))
    Next
End If

本来なら関数の戻り値に配列を返すとき、配列以外の値 (Nothing) などを返すべきではありません。そういうときは要素数 0 の配列を返します。これで判定しないでループできます。空の配列でも要素数が 0 になるのでエラーになりません。

Dim 配列 As Variant
配列 = Array() ' 要素数 0 の配列

' For Each でループする
Dim v As Variant
For Each v In 配列
    Debug.Print(v)
Next

' For Next でループする
Dim i As Integer
Dim min As Integer
Dim max As Integer
min = LBound(配列)
max = UBound(配列)
For i = min To max
    Debug.Print(配列(i))
Next