tagCANDY CGI VBレスキュー(花ちゃん) - VBレスキュー(花ちゃん)の投稿サンプル用掲示板 - Visual Basic 6.0 VB2005 VB2010
VB2005用トップページへVBレスキュー(花ちゃん)のトップページVB6.0用のトップページ
VBレスキュー(花ちゃん)の投稿サンプル用掲示板
     サンプル投稿用掲示板  VB2005 〜 用トップページ  VB6.0 用 トップページ
Variant配列は1次元?2次元? (VB6.0)_3 ( No.3 )  [親スレッドへ]
日時: 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



 [スレッド一覧へ] [親スレッドへ]