- 日時: 2009/12/28 10:18
- 名前: 花ちゃん
- ***********************************************************************************
* カテゴリー:[基本コード][][] * * キーワード:配列,Variant,次元数,要素数,, * *********************************************************************************** タイトル : Variant配列は1次元?2次元? 記事No : 12748 投稿日 : 2008/07/11(Fri) 16:35 投稿者 : エドワード
あるアプリケーションのAPIの戻り値である時はVariant型の1次元配列でまたある時はVariant型の2次元配列で返って来ます。
返り値のVariant型配列が1次元なのか2次元なのかを判別するにはどうすればよいのでしょうか?
----------------------------------------------------------------------------------- 記事No : 12751 投稿日 : 2008/07/11(Fri) 18:35 回答者 : 魔界の仮面弁士 ----------------------------------------------------------------------------------- 案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
|