
VBA没有直接提供函数获取数组的维度,一般的做法是通过错误捕获来得到:
'获取数组的维度Function GetArrayDimsByErr(v As Variant) As LongIf Not VBA.IsArray(v) ThenGetArrayDimsByErr = 0Exit FunctionEnd IfOn Error Resume NextDim tmp As LongGetArrayDimsByErr = -1Do Until Err.Number <> 0GetArrayDimsByErr = GetArrayDimsByErr + 1tmp = UBound(v, GetArrayDimsByErr + 1)LoopOn 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 SafeArrayBoundcElements As Long '// 该维的长度lLbound As Long ' 该维的数组存取的下限,一般为0End TypePrivate Type SafeArraycDims As Integer ' // 数组的维度fFeatures As Integer 'cbElements As Long ' // 数组元素的字节大小cLocksas As Long 'pvDataas As Long ' // 数组的数据指针rgsabound() As SafeArrayBoundEnd Type'获取数组的维度Function GetArrayDims(v As Variant) As LongIf Not VBA.IsArray(v) ThenGetArrayDims = 0Exit FunctionEnd IfDim ptr As LongDim sa As SafeArrayptr = MyArrayPtr(v)CopyMemory VarPtr(sa.cDims), ptr, 4GetArrayDims = sa.cDimsEnd FunctionFunction MyArrayPtr(ByRef v As Variant) As LongDim b(16 - 1) As ByteCopyMemory VarPtr(b(0)), VarPtr(v), 16Dim ptr As LongCopyMemory VarPtr(ptr), VarPtr(b(8)), 4' - 0x20 8-11存的是数组地址' - 0x60 8-11存的是数组地址的地址If b(1) = &H60 ThenCopyMemory VarPtr(ptr), ptr, 4End IfMyArrayPtr = ptrEnd Function

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




