VBA获取数组的维度

VBA没有直接提供函数获取数组的维度,一般的做法是通过错误捕获来得到:

'获取数组的维度Function GetArrayDimsByErr(v As Variant) As Long    If Not VBA.IsArray(v) Then        GetArrayDimsByErr = 0        Exit Function    End If        On Error Resume Next    Dim tmp As Long    GetArrayDimsByErr = -1    Do Until Err.Number <> 0        GetArrayDimsByErr = GetArrayDimsByErr + 1        tmp = UBound(v, GetArrayDimsByErr + 1)    Loop    On Error GoTo 0End Function

数据类型Array中,我们知道了数组的底层结构,其中cDims就是指明数组维度的,那么,我们只需要读取到cDims的值就可以了:

Public Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (ByVal Destination As Long, ByVal Source As Long, ByVal Length As Long)Private Type SafeArrayBound    cElements As Long '// 该维的长度    lLbound   As Long ' // 该维的数组存取的下限,一般为0End TypePrivate Type SafeArray    cDims      As Integer ' // 数组的维度    fFeatures  As Integer '    cbElements As Long ' // 数组元素的字节大小    cLocksas   As Long '    pvDataas   As Long ' // 数组的数据指针    rgsabound() As SafeArrayBoundEnd Type'获取数组的维度Function GetArrayDims(v As Variant) As Long    If Not VBA.IsArray(v) Then        GetArrayDims = 0        Exit Function    End If        Dim ptr As Long    Dim sa As SafeArray        ptr = MyArrayPtr(v)        CopyMemory VarPtr(sa.cDims), ptr, 4        GetArrayDims = sa.cDimsEnd FunctionFunction MyArrayPtr(ByRef v As Variant) As Long    Dim b(16 - 1) As Byte        CopyMemory VarPtr(b(0)), VarPtr(v), 16        Dim ptr As Long    CopyMemory VarPtr(ptr), VarPtr(b(8)), 4'    - 0x20 8-11存的是数组地址'    - 0x60 8-11存的是数组地址的地址    If b(1) = &H60 Then        CopyMemory VarPtr(ptr), ptr, 4    End If        MyArrayPtr = ptrEnd Function

VBA 学习
学习使用Excel VBA
176篇原创内容 -->
公众号

本文使用 文章同步助手 同步

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 6270 a1da b5e7 b8aa 4d60 60c6 dea2 9fcc66b3 1acd 0596 77b...
    BossOx阅读 9,546评论 0 0
  • 504b 0304 1400 0008 0800 4498 963d a6fa9ff3 9f41 1e00 a88...
    BossOx阅读 11,476评论 0 0
  • 504b 0304 1400 0008 0800 fa8c 963d 50740baa dffc 0e00 6cd...
    BossOx阅读 3,552评论 0 0
  • 我是黑夜里大雨纷飞的人啊 1 “又到一年六月,有人笑有人哭,有人欢乐有人忧愁,有人惊喜有人失落,有的觉得收获满满有...
    陌忘宇阅读 8,615评论 28 53
  • 人工智能是什么?什么是人工智能?人工智能是未来发展的必然趋势吗?以后人工智能技术真的能达到电影里机器人的智能水平吗...
    ZLLZ阅读 3,955评论 0 5