我在處理VBA中的某些數組時遇到了問題,或者更具體地說,我在嘗試有效使用某些現有子例程/方法以處理不同數組尺寸/尺寸。修改現有函數以處理不同維數/結構的數組
數組是從一個COM對象中檢索出來的,當它們到達一個可預測的一致結構時,基於哪個例程返回數組we have had trouble getting all of the functions to return the data in the same structure。因此,我正在處理不同的結構,有時是二維數組,但有時候是一維數組,其中每個數組項是變體/數組。例如,如果我有一個現有的函數,它需要像arr(0,0)
這樣的二維結構,我需要修改它以接受一維數組,其中每個項目都是Variant類型(結構像arr(0)(0)
)。
什麼我目前做
我禁用錯誤,並測試第二個維度的UBOUND,知道如果它是一維數組會引發錯誤。然後我可以根據數組的結構做一個稍微不同的迭代。
我討厭使用
On Error Resume Next
如果我能避免它,但它似乎像 可能是最有效的在這種情況下。我也不喜歡依賴
Excel.Application.Transpose
,但不要 找到任何可以在PowerPoint中本機執行此操作的方法。
實施例:
Function GetSmallFromBar(counts As Variant, banner As Variant, categories As Variant) As Variant
Dim small As Object
Dim arrSizeErr As Variant
Dim i As Long
Set small = CreateObject("Scripting.Dictionary")
On Error Resume Next
arrSizeErr = UBound(counts, 2)
arrSizeErr = (Err.Number <> 0)
Err.Clear
On Error GoTo 0
'Array is structured like arr(0)(0) instead of arr(0,1)
If arrSizeErr Then
counts = Excel.Application.Transpose(counts)
ReDim Preserve counts(0 To UBound(counts) - 1)
'Modify for unique array structure
For i = LBound(categories) To UBound(categories)
If counts(i) < 100 Then
small(i) = categories(i)
End If
Next
GoTo EarlyExit
End If
'This works for the expected array structure, arr(0,0)
For i = LBound(categories) To UBound(categories)
If counts(i, 0) < 100 Then
small(i) = categories(i)
End If
Next
EarlyExit:
GetSmallFromBar = small.Items()
Set small = Nothing
End Function
注:我REDIM陣列,因爲我需要與0個鹼基陣列工作。
在我的代碼中可能有6個地方在我遇到類似這樣的事情,每個人都依賴於類似但可能不相同的方法。
我很喜歡在其他地方修復我的代碼,我只是想知道這是否是一種好方法,然後我可以將其標準化爲一個函數,並從其他模塊調用這是潛在的錯誤,或者是否有另一種方法這樣做更有效率。
附加信息和截圖
我用1年和2 d陣列專門的工作。但有時我會得到一個一維數組,其中每個項目也是一個Variant
類型。這給了我適合,因爲我希望我可以修改一些函數和方法,我使用二維數組來處理「數組」陣列結構。
預計二維數組
變有問題的陣列
一種方法可能是將COM對象調用包裝在VBA例程中,該例程將輸出標準化爲一種特定格式(二維數組或陣列數組),以便所有其他代碼都能準確知道所需的格式。 –
您也可以使用'application.choose(array(1),v)'將變量'v'(範圍,數組,1D數組數組)轉換爲2D數組(基於1)。這可能用於在添加到字典之前對格式進行標準化。 –
@lori_m這在PPT中有效嗎? (我現在無法測試..)我以前沒見過'.choose'方法。這聽起來可能是我需要的。 –