【问题标题】:How do I get a subset of elements in an array in excel vba?如何在excel vba中获取数组中的元素子集?
【发布时间】:2018-06-14 18:44:44
【问题描述】:

如何在 excel vba 中获取数组中的第 3 到第 6 个元素?类似于以下内容。

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

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

【问题讨论】:

  • 能否附上样本数据?
  • 不知道该怎么做,但 shape_names 目前是一个三维变量,第一维有 10 个元素,第二维有 4 个元素,第三维有 20 个元素。我想取第三维中 20 个元素的子集。
  • 您可以添加一个简化的示例,只要它代表您正在尝试做的事情。颜色、食物、口味,例如可以是 3D。或者尝试用谷歌搜索你的问题。
  • 我对问题的修改有助于澄清吗?

标签: vba excel


【解决方案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

【讨论】:

  • 那么有没有办法把某个维度的所有元素都提取出来呢?这是 python 或 MATLAB 中的一项简单任务,但我在 VBA 中找不到与此相关的任何内容。
  • 是的。请参阅我对 Index 的使用(尽管它有最大数量的元素)。或者使用指定该维度的循环。
  • 是的,它在 python 中既可爱又简单!
  • 如果我有第三个维度,有没有办法获取该维度中的元素?这个索引方法看起来像是针对二维的。
  • 是的,我相信虽然会有外观。循环将是 3D 的明显选择。我认为可能有一些自定义功能可以完成这项工作。您的工作表有 2D 的行和列,所以不足为奇。
【解决方案2】:

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

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

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

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

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

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

【讨论】:

    猜你喜欢
    • 2019-12-17
    • 2012-02-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多