2013-09-27 34 views
6

我在處理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類型。這給了我適合,因爲我希望我可以修改一些函數和方法,我使用二維數組來處理「數組」陣列結構。

預計二維數組

enter image description here

有問題的陣列

enter image description here

+0

一種方法可能是將COM對象調用包裝在VBA例程中,該例程將輸出標準化爲一種特定格式(二維數組或陣列數組),以便所有其他代碼都能準確知道所需的格式。 –

+1

您也可以使用'application.choose(array(1),v)'將變量'v'(範圍,數組,1D數組數組)轉換爲2D數組(基於1)。這可能用於在添加到字典之前對格式進行標準化。 –

+0

@lori_m這在PPT中有效嗎? (我現在無法測試..)我以前沒見過'.choose'方法。這聽起來可能是我需要的。 –

回答

1

只要你的代碼當前工作,我認爲這很好。如果有的話你可能想把你的子程序中的一些函數包裝到它們自己的函數中,這樣它就可以重用了。

芯片皮爾遜在他的陣列現場可用的功能,這將使你的數組​​,然後你就可以使用的維數來決定你需要做什麼:

Public Function NumberOfArrayDimensions(Arr As Variant) As Integer 
Dim Ndx As Integer 
Dim Res As Integer 
On Error Resume Next 
    Do 
     Ndx = Ndx + 1 
     Res = UBound(Arr, Ndx) 
    Loop Until Err.Number <> 0 
NumberOfArrayDimensions = Ndx - 1 
End Function 

來源:Chip Pearson, VBA Arrays

+0

這應該有所幫助。我已經使用了他的一些數組函數,雖然我知道這個是因爲什麼原因,我沒有使用它,事後看起來似乎是愚蠢的。 –