VBA 配列が初期化されているかどうかを判定する
VBA
で配列が初期化されているかどうかを判定する方法を紹介します。
以下のようにSgn
関数を使用して判定する方法がよく紹介されていますが、この方法だと環境によってエラーになることがあります。
Dim arr() As String
If Sgn(arr) = 0 Then
'初期化されていない
Else
'初期化されている
End If
そのため、以下のURLで紹介しているファンクションを使用します。sgn
関数でエラーになる原因なども以下のページで詳しく説明されています。
参考URL: https://qiita.com/satoko138/items/7e06dda56683065968f7
参考ページより抜粋
'--------------------------------------------------------------
'機能:引数が配列か判定し、配列の場合は空かどうかも判定する
'戻り値:判定結果(1:配列 / 0:空の配列 / -1:配列ではない
'--------------------------------------------------------------
Public Function isArrayEx(varArray As Variant) As Long
On Error GoTo ERROR_
If IsArray(varArray) Then
isArrayEx = IIf(UBound(varArray) >= 0, 1, 0)
Else
isArrayEx = -1
End If
Exit Function
ERROR_:
If Err.Number = 9 Then
isArrayEx = 0
Else
'想定外エラー
End If
End Function
使用方法
ファンクションを定義したら以下のように使用します。
以下の例では配列arr
は初期化されていないため、isArrayEx(arr)
の結果が-1
になります。
Dim arr() As String
If isArrayEx(arr) = -1 Then
'初期化されていない
Else
'初期化されている
End If
以下のように初期化されている場合はisArrayEx(arr)
の結果が-1
ではなくなります。
Dim arr() As String
ReDim Preserve arr(0)
If isArrayEx(arr) = -1 Then
'初期化されていない
Else
'初期化されている
End If