其他分享
首页 > 其他分享> > 如何获取数组的维数(API)

如何获取数组的维数(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

【代码解析】
示例代码使用API函数CopyMemory实现获取数组的维度信息,其中涉及内存复制、比特操作等,这里不进行详细讲解,有兴趣的可以搜索相关资料。

相关功能已经封装为自定义函数,可以使用如下形式调用,其中第一个参数为数组,第二参数为自定义类型数据结构SAFEARRAY,结果保存在cDims中。

blnGetArrayMsg(myArr, ud_Msg)
taller_2000 发布了107 篇原创文章 · 获赞 49 · 访问量 14万+ 私信 关注

标签:cDims,End,Long,CopyMemory,API,维数,数组,Msg,lngPoint
来源: https://blog.csdn.net/taller_2000/article/details/103760301