VBもしくはVBAで動的配列に要素数を設定する前の状態を確認したい場合の方法を下記に明記しておきます。
私はAccessによる開発をよく行うのですが(PHPの開発も同じく多いです)、その時にVBAは欠かせない物です。そのVBAでは動的配列をよく使用します。例えば下記のようなプログラムです。
Public Sub test()
Dim var() As Variant
ReDim var(2)
var(0) = "a"
var(1) = "b"
var(2) = "c"
End Sub
通常、プログラムは上記のようにDimで動的配列を宣言しReDimで要素数を設定。設定した配列に各値をセットしています。しかし、時と場合によってReDimで要素数を設定する前の状態で、その配列に要素数がセットしてあるかどうかをチェックする場合があります。
そうした場合
UBound(var)
で、要素数の数を取得すればいいような気がするのですが、ReDimの前でUBoundを行うとエラー番号「9」の「インデックスが有効範囲にありません。」で怒られてしまいます。
では、どうやってReDimの前の状態で要素数がセットされているのかチェックする方法を下記に紹介します
Errを使う
まずはオーソドックスな方法としてエラー処理で取得する方法です。
Public Sub test1()
On Error GoTo test3_Err
Dim var() As Variant
Dim temp
temp = UBound(var)
MsgBox "動的配列の割り当てが設定済みです"
test3_Err_Exit:
Exit Sub
test3_Err:
If Err.Number = 9 Then
MsgBox "動的配列の割り当てが未設定です"
Else
Err.Raise Err.Number, Err.Source, Err.Description, Err.HelpFile, Err.HelpContext
End If
End Sub
Not Notを使う
これはどうしてこのような方法でわかるのかはよくわかりませんが、この方法でもチェックはできます。
Public Sub test2()
Dim var() As Variant
If Not Not var Then
MsgBox "動的配列の割り当てが設定済みです"
Else
MsgBox "動的配列の割り当てが未設定です"
End If
End Sub
Sgn関数を使う
関数にSgn関数というのがあります。この関数は引数にセットした数字の正負を求める関数なのですが、この関数でも調べることができます。なぜかはよくわかりません。
Public Sub test3()
Dim var() As Variant
If Sgn(var) <> 0 Then
MsgBox "動的配列の割り当てが設定済みです"
Else
MsgBox "動的配列の割り当てが未設定です"
End If
End Sub
APIを使う
最後の手段としてAPIを使う方法があります。
Private Declare PtrSafe Function SafeArrayGetDim Lib "oleaut32" (ByRef psa() As Any) As Long
Public Sub test4()
Dim i As Long
Dim var() As Variant
If SafeArrayGetDim(var) <> 0 Then 'APIを使う
MsgBox "動的配列の割り当てが設定済みです"
Else
MsgBox "動的配列の割り当てが未設定です"
End If
End Sub
最後に
上記のどの方法を使用してもいいですが、2つめの方法が一番スマートな方法のような気がしますが、1番目のErrの方法が無難かな。
それにしてもDimで変数を宣言したときの変数って何なんでしょうね?ちょっと調べると「NullReferenceException」という言葉が見つかりましたが、NullでもEmptyでもないとはよくわかりません。
コメント