tagCANDY CGI VBレスキュー(花ちゃん)の Visual Basic 6.0用 掲示板 [ツリー表示へ]   [Home]
一括表示(VB6.0)
タイトルVariant配列は1次元?2次元?
記事No12748
投稿日: 2008/07/11(Fri) 16:35
投稿者エドワード
あるアプリケーションのAPIの戻り値で
ある時はVariant型の1次元配列で
またある時はVariant型の2次元配列で
返って来ます。

返り値のVariant型配列が1次元なのか
2次元なのかを判別するにはどうすれば
よいのでしょうか?

どなたか御指導いただけますよう、
よろしくお願いいたします。

[ツリー表示へ]
タイトルRe: Variant配列は1次元?2次元?
記事No12751
投稿日: 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

[ツリー表示へ]
タイトルRe^2: Variant配列は1次元?2次元?
記事No12754
投稿日: 2008/07/12(Sat) 01:59
投稿者よねKEN
#脱線です。私のネット人生初の質問と同じ質問なのでうれしくてコメント(^^;

> # このネタ、過去ログにあったかも。

VB初心者友の会で私がした質問だったりして。
ここの検索で、ちょっと探してみましたがなさそうな感じでした。

> 案1) UBound(v, 2) がエラーを返すかどうかで判定する。
> 案2) SafeArrayGetDim API を使って受け取る。

私のお勧めは案1ですね。
昔に同じ疑問を持ったときに案1は思いついたのですが、
もっと正攻法な手段がないかと思い質問して案2の回答をとある方から頂きました。
で、結果として案2は大袈裟すぎるので採用しなかったという経緯があります。

[ツリー表示へ]
タイトルRe^2: Variant配列は1次元?2次元?
記事No12755
投稿日: 2008/07/12(Sat) 06:48
投稿者花ちゃん
> # このネタ、過去ログにあったかも。

下記のような事なら紹介しておりますが。

サンプル投稿用掲示板
http://hanatyan.sakura.ne.jp/patio/read.cgi?no=111

プログラマのメモ帳 さんのサイト(閉鎖されたので何時見られなくなるかも知れません)
http://web.archive.org/web/20030815190356/www.gj.il24.net/~nakasima/download/Array/modSafeArray.bas.txt

[ツリー表示へ]