修改现有函数以处理不同维度/结构的数组

时间:2013-09-27 01:11:28

标签: arrays vba excel-vba powerpoint-vba excel

我在处理VBA中的某些数组时遇到了问题,或者更具体地说,我无法有效地使用某些现有的子程序/方法来处理不同大小/维度的数组。

从COM对象中检索数组,当它们到达一个可预测的,一致的结构时,基于哪个例程返回数组we have had trouble getting all of the functions to return the data in the same structure

所以,我正在处理不同的结构,有时是2D数组,但有时是一维数组,其中每个数组项都是变量/数组。

例如,如果我有一个需要像arr(0,0)这样的2D结构的现有函数,我需要修改它以接受一维数组,其中每个项都是Variant类型(结构如arr(0)(0) )。

我目前正在做什么

我禁用错误,并测试第二维的Ubound,知道如果它是一维数组会引发错误。然后,我可以根据数组的结构进行稍微不同的迭代。

  • 我讨厌使用On Error Resume Next,如果我可以避免它,但似乎 在这种情况下,这可能是最有效的。

  • 我也不喜欢依赖Excel.Application.Transpose,但不喜欢。{li>

    找到任何可以在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基数组。

在我的代码中可能有六个地方,我运行这样的东西,每个地方依赖于一个类似但可能不相同的方法。

我很乐意在其他地方修改我的代码,我只是想知道这是否是一个很好的方法,然后我可以将其标准化为函数,并从其他模块调用,这是一个潜在的错误,或者是否有另一种方法可以做这更有效率。

其他信息和屏幕截图

我只使用1维和2维阵列。但有时我得到一维数组,其中每个项目也是Variant类型。这给了我适合,因为我希望我可以修改我在二维数组上使用的一些函数和方法来处理“数组数组”结构。

预期的二维数组

enter image description here

有问题的变体数组

enter image description here

1 个答案:

答案 0 :(得分: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 Arrays