字典是VBA中經常使用的對象,有時需要將字典對象中保存數據轉爲數組,然後做進一步處理,在使用過程中經常會遇到數組下標越界之類的問題,下面就講講字典到數組的轉換。
示例代碼如下:
Sub Demo()
Dim arr1, arr2, arr3
Set objDic = CreateObject("Scripting.Dictionary")
For i = 1 To 5
objDic(i) = i
Next i
Debug.Print "> items直接賦值給數組:"
arr1 = objDic.items
Call GetArrBound(arr1)
Debug.Print "> 數組第一次轉置:"
arr2 = Application.Transpose(arr1)
Call GetArrBound(arr2)
Debug.Print "> 數組第二次轉置:"
arr3 = Application.Transpose(arr2)
Call GetArrBound(arr3)
Set objDic = Nothing
End Sub
Sub GetArrBound(arr)
Dim intArrDim As Integer, n
intArrDim = fnGetArrayDimension(arr)
Debug.Print ">>數組維度:" & intArrDim
For n = 1 To intArrDim
Debug.Print ">>>第" & n & "維下界:" & LBound(arr, n) & ", 上界:" & UBound(arr, n)
Next
Debug.Print Application.Rept("=", 20)
End Sub
Function fnGetArrayDimension(arr) As Integer
Dim tmp, i
On Error Resume Next
For i = 1 To 60
Err.Clear
tmp = UBound(arr, i)
If Err.Number = 9 Then
fnGetArrayDimension = i - 1
Exit Function
End If
Next i
End Function
運行Demo
過程立即窗口中的輸出如下:
本地窗口中如下圖所示。
【代碼解析】
第3行代碼聲明創建一個字典對象。
第4~6行代碼爲字典對象賦值,共有5個元素。
第8行代碼將自動對象的items集合賦值給arr1,有立即窗口中可以看到arr1是一維數組,其下標爲0至4,對應立即窗口的輸出如下。
> items直接賦值給數組:
>>數組維度:1
>>>第1維下界:0, 上界:4
第11行代碼將數組進行一次轉置,此時生成的數組arr2變爲二維數組,對應立即窗口的輸出如下。
> 數組第一次轉置:
>>數組維度:2
>>>第1維下界:1, 上界:5
>>>第2維下界:1, 上界:1
第14行代碼將數組再進行一次轉置,此時生成的數組arr3爲一維數組,對應立即窗口的輸出如下。雖然經過兩次轉置,數組變回一維數組,但是數組的下屆和上界都發生了變化,在代碼中引用數組時需要注意下標的範圍。
> 數組第二次轉置:
>>數組維度:1
>>>第1維下界:1, 上界:5
第18~26行代碼爲GetArrBound
過程用於獲取並輸出數組每個維度的上界和下屆。
第18~26行代碼爲fnGetArrayDimension
過程用於獲取數組知維度數量,代碼詳細講解參見《[如何獲取數組的維數](https://blog.csdn.net/taller_2000/article/details/84868857)》
。