次元の配列(API)を取得する方法

VBAで用意されていません直接関数やメソッド配列の次元を取得することができ、以前の記事「配列の次元を取得する方法は、」配列の次元を取得するための捕獲間違った方法を使用する方法について説明し、この資料では、WindowsのAPIを使用する方法について説明しますアレイの寸法を取得します。


次のようにサンプルコードは次のとおりです。

Type SAFEARRAYBOUND
    cElements As Long
    lLbound As Long
End Type
Type SAFEARRAY
    cDims As Integer
    fFeatures As Integer
    cbElements As Long
    cLocks As Long
    pvData As Long
    rgsabound(1 To 60) As SAFEARRAYBOUND
End Type
Private Declare Sub CopyMemory Lib "kernel32" _
            Alias "RtlMoveMemory" ( _
            dest As Any, _
            source As Any, _
            ByVal bytes As Long)
Private Const VT_BYREF = &H4000&

Function blnGetArrayMsg(DataArray As Variant, Array_Msg As SAFEARRAY) As Boolean
    Dim lngPoint As Long
    Dim intVType As Integer
    If Not IsArray(DataArray) Then Exit Function
    With Array_Msg
        CopyMemory intVType, DataArray, 2
        CopyMemory lngPoint, ByVal VarPtr(DataArray) + 8, 4
        If (intVType And VT_BYREF) <> 0 Then
            CopyMemory lngPoint, ByVal lngPoint, 4
        End If
        CopyMemory Array_Msg.cDims, ByVal lngPoint, 16
        If Array_Msg.cDims > 0 Then
            CopyMemory .rgsabound(1), ByVal lngPoint + 16, _
                       Array_Msg.cDims * Len(.rgsabound(1))
            GetArray_Msg = Array_Msg.cDims
            blnGetArrayMsg = True
        End If
    End With
End Function

Sub Demo()
    Dim myArr(1, 2, 3, 100, 1000)
    Dim ud_Msg As SAFEARRAY
    If blnGetArrayMsg(myArr, ud_Msg) Then
        MsgBox "数组维度为:" & ud_Msg.cDims
    Else
        MsgBox "Error!"
    End If
End Sub

コード[解決済み]
メモリコピー、ビット演算を必要とする配列の次元情報へのアクセスを実現するCopyMemory API関数を使用したサンプル・コードは、ここでは詳細に説明していないが、関連する情報を検索することができます興味を持っています。

関連する関数は、カスタム関数としてパッケージ化された最初のパラメータが配列され、カスタムデータ構造のための第2のパラメータのタイプは、次の形式を用いて呼び出すことができSAFEARRAY、その結果格納cDims

blnGetArrayMsg(myArr, ud_Msg)
公開された107元の記事 ウォン称賛49 ビュー14万+

おすすめ

転載: blog.csdn.net/taller_2000/article/details/103760301