我在处理 VBA 中的一些数组时遇到了麻烦,或者更具体地说,我在尝试有效地利用一些现有的子例程/方法来处理不同大小/维度的数组时遇到了麻烦。
数组是从 COM 对象中检索出来的,虽然它们以基于哪个例程返回数组的可预测、一致的结构到达,但我们很难让所有函数以相同的结构返回数据。
所以,我正在处理不同的结构,有时是二维数组,但有时是一维数组,其中每个数组项都是一个变量/数组。
例如,如果我有一个需要像 2D 结构的现有函数arr(0,0)
,我需要修改它以也接受 1D 数组,其中每个项目都是 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
注意:我重新调整了数组,因为我需要使用 0 基数组。
在我的代码中可能有六个地方会遇到这样的情况,每个地方都依赖于类似但可能不相同的方法。
我很乐意在其他地方修复我的代码,我只是想知道这是否是一种好方法,然后我可以将其标准化为一个函数并从其他可能出现错误的模块调用,或者是否有另一种方法可以更有效地做到这一点.
附加信息和屏幕截图
我只使用一维和二维数组。但有时我会得到一个一维数组,其中每个项目也是一个Variant
类型。这让我很合适,因为我希望我可以修改我在二维数组上使用的一些函数和方法来处理“数组数组”结构。
预期的二维阵列
有问题的变体数组