6

我在处理 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类型。这让我很合适,因为我希望我可以修改我在二维数组上使用的一些函数和方法来处理“数组数组”结构。

预期的二维阵列

在此处输入图像描述

有问题的变体数组

在此处输入图像描述

4

1 回答 1

1

只要您的代码当前有效,我认为就可以了。如果有的话,您可能希望将子例程中的一些函数包装到它们自己的函数中,以便它可以重用。

Chip Pearson 在他的数组站点上有一个可用的函数,该函数将为您提供数组的维数,然后您可以使用它来确定您需要做什么:

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 阵列

于 2013-10-12T14:28:09.140 回答