更新日:、 作成日:
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