タイトル | : Re: Variant配列は1次元?2次元? |
記事No | : 12751 |
投稿日 | : 2008/07/11(Fri) 18:35 |
投稿者 | : 魔界の仮面弁士 |
# このネタ、過去ログにあったかも。
> 返り値のVariant型配列が1次元なのか > 2次元なのかを判別するにはどうすれば > よいのでしょうか?
案1) UBound(v, 2) がエラーを返すかどうかで判定する。 案2) SafeArrayGetDim API を使って受け取る。
Private Sub Command1_Click() Dim a As Variant, b As Variant ReDim a(2, 2) Dim c() As Variant, d() As Variant ReDim c(2, 2, 2) Dim e(1) As Variant, f(2, 3) As Variant Debug.Print "a:"; GetDim(a) ' 2 … 次元数 2 の配列を格納した Variant 型 Debug.Print "b:"; GetDim(b) '-1 … 配列では無い Variant 型 Debug.Print "c:"; GetDim(c) ' 3 … 次元数 3 の動的配列 Debug.Print "d:"; GetDim(d) ' 0 … 初期化されていない動的配列 Debug.Print "e:"; GetDim(e) ' 1 … 次元数 1 の静的配列 Debug.Print "f:"; GetDim(f) ' 2 … 次元数 2 の静的配列 End Sub
===== 標準モジュール ===== 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)
Public Function GetDim(ByVal sa As Variant) As Long If IsArray(sa) Then Dim p As Long GetMem4 VarPtr(sa) + 8, p If p = 0 Then GetDim = 0 '初期化されていない配列 Else GetDim = SafeArrayGetDim(p) '次元数 End If Else GetDim = -1 '配列では無い End If End Function
|