如何在excel vba中获取数组中的元素子集?

时间:2018-06-14 18:44:45

标签: excel vba excel-vba

如何在excel vba中获取数组中的第3到第6个元素?如下所示。

    Dim x(9) as variant, y(3) as variant

    y(0:3) = x(2:5)

2 个答案:

答案 0 :(得分:1)

在VBA中,与python不同,例如,我们不能直接"子集"一个数组。

我们只能通过将ij指定为某些范围之间来循环搜索感兴趣的指数,例如i位于第1行和第2行之间,j位于第2列和第3列之间。当然,我们也可以按位置直接索引到数组中,例如arr(1)i只是表示行索引的变量,j列索引。

或者,我们可以使用Index来"切片"出一个特定的行或列;我想你可能会调用子集,但是从你的语法中我认为你是以python的方式思考的。例如。

Application.WorksheetFunction.Index(array,n, 0)会将行n从数组中删除

Application.WorksheetFunction.Index(array, 0, n)会将列n从数组中删除

Option Explicit

Public Sub ArrayStuff()
    Dim arr(0 To 5) As Long, i As Long
    For i = 0 To 5
        arr(i) = i
    Next

    'Loop only required indices
    For i = 2 To 3
        Debug.Print arr(i)
    Next

    'Slice via Application.WorksheetFunction.Index
    Dim arr2(0 To 2, 0 To 2) As Long, j As Long, counter As Long

    For i = LBound(arr2, 1) To UBound(arr2, 1) '<==  here can specify particular rows
        For j = LBound(arr2, 2) To UBound(arr2, 2) '<== here can specify particular columns
            counter = counter + 1
            arr2(i, j) = counter
        Next
    Next

    MsgBox Join(Application.WorksheetFunction.Transpose(Application.WorksheetFunction.Index(arr2, 0, 1)), ",") 'slice a column out
    MsgBox Join(Application.WorksheetFunction.Index(arr2, 1, 0), ",") 'slice a row out
    MsgBox Join(Application.WorksheetFunction.Index(arr2, 2, 0), ",") 'slice a row out
End Sub

答案 1 :(得分:0)

对于不想使用循环或范围方法来解决此问题的任何人, 这是一个经过测试的解决方案,用于处理数组的子集(不需要是整个行或列):

Application.Sum(Application.Index(Array(1, 2, 3, 4, 5), 0, Evaluate("ROW(2:5)")))

求和数组第二个至第五个元素(1、2、3、4、5)。 对于具有二维的数组,只需执行以下操作:

Application.Average(.Index(DataArray, Evaluate("ROW(17:21)"), 5))

将计算2维数组“ DataArray”的五个元素子集(第17至21行,第5列)的平均值。

顺便说一句,我尚未尝试评估此方法的效率,但这确实是一种解决方法。希望这会有所帮助。