|
▼Tacchi さん:
こんにちは
横から失礼します。
錚々たるエキスパートの方々からの回答もあり、私なんぞのでる幕ではありませんが
・まず、動的配列を規定したかどうかの判断を行いたい場合、一番簡単な方法は
配列にセットするループの最初でブール型の変数あたりをFalseにしておき、RedimかけたらTrue。
配列から取り出すループの前に、この変数の値を判定する。
・そうではなく、どうしても配列が初期化されているかどうかの判定をしたいということなら
以下のコードは、以前に別のところでyukiさんに紹介いただいたもの(と記憶)ですが。
判定プロシジャ GetDim は本来は次元数を取得するものですが、ここでの戻り値が 0 なら
動的配列だけど初期化されていないということになります。
あるいは今回の場合は1次元配列ですから戻り値が 1 かどうかの判定のほうがいいかもですね。
(2003で検証済み。2007以降では未検証です)
・いずれにしても【めったやたらに】エラートラップを使うのはどうなんでしょうか。
本来のバグまでもが隠されてしまいますよね。
Option Explicit
Private Declare Function SafeArrayGetDim Lib "oleaut32.dll" (ByVal psa As Long) As Long
Private Declare Sub GetMem4 Lib "msvbvm60" (ByVal ptr As Long, ByRef ret As Long)
Sub Test()
Dim pas As Long
Dim a As Variant
ReDim a(2, 2) '2次元動的配列
Dim b As Variant '配列ではない
Dim c() As Variant
ReDim c(2, 2, 2) '3次元動的配列
Dim d() As Variant '初期化されていない配列
Dim e(1) As Variant '1次元静的配列
Dim f(2, 3) As Variant '2次元静的配列
MsgBox "a:" & GetDIm(a)
MsgBox "b:" & GetDIm(b)
MsgBox "c:" & GetDIm(c)
MsgBox "d:" & GetDIm(d)
MsgBox "e:" & GetDIm(e)
MsgBox "f:" & GetDIm(f)
End Sub
Private Function GetDIm(ByVal sa As Variant) As Long
Dim p As Long
If IsArray(sa) Then
GetMem4 VarPtr(sa) + 8, p
If p = 0 Then
GetDIm = 0 '初期化されていない配列
Else
GetDIm = SafeArrayGetDim(p) '配列については次元数を返す
End If
Else
GetDIm = -1 '配列ではない
End If
End Function
|
|