暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

VBA获取数组的维度

VBA 学习 2021-06-28
1761



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 0
    End 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 ' 该维的数组存取的下限,一般为0
      End Type


      Private Type SafeArray
      cDims As Integer ' // 数组的维度
      fFeatures As Integer '
      cbElements As Long ' // 数组元素的字节大小
      cLocksas As Long '
      pvDataas As Long ' // 数组的数据指针
      rgsabound() As SafeArrayBound
      End 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.cDims
      End Function


      Function 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 = ptr
      End Function

      文章转载自VBA 学习,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

      评论