tagCANDY CGI VBレスキュー(花ちゃん)の Visual Basic 6.0用 掲示板
VBレスキュー(花ちゃん)の Visual Basic 6.0用 掲示板
[ツリー表示へ]  [ワード検索]  [Home]

タイトル Re: Variant配列は1次元?2次元?
投稿日: 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

- 関連一覧ツリー をクリックするとツリー全体を一括表示します)

古いスレッドにレスはつけられません。