【问题标题】:Slice the first dimension from 2D array从二维数组中切片第一维
【发布时间】:2020-04-08 13:04:51
【问题描述】:

我正在尝试对二维数组的第一个维度进行切片。数组变量为 y(1 到 36、1 到 19) 我需要使它成为 y(1 to 12, 1 to 19) 要完成这样的任务,我必须像这样循环

    If rw > 0 Then

    ListBox1.AddItem
    ReDim v(1 To n, 1 To UBound(y, 2))

    Dim i As Long, j As Long
    For i = 1 To n
        For j = 1 To UBound(y, 2)
            v(i, j) = y(i, j)
        Next j
    Next i
    ListBox1.List = v()

    n = 0
End If

有没有更简单的方法来完成这样的任务而没有太多循环?

【问题讨论】:

标签: excel vba


【解决方案1】:

您可以按如下方式对数组进行切片。大部分代码只是为了填充第一个数组,所以你不需要:

Sub x()

Dim v1(1 To 6, 1 To 3), i As Long, j As Long, v2()

'this loop is just to populate the first array
For i = 1 To UBound(v1, 1)
    For j = 1 To UBound(v1, 2)
        v1(i, j) = i * j
    Next j
Next i

'this is just to show the contents
Range("A1").Resize(UBound(v1, 1), UBound(v1, 2)) = v1

'this does the slicing (first three rows
v2 = Application.Index(v1, Evaluate("row(1:3)"), Application.Transpose(Evaluate("row(1:" & UBound(v1, 2) & ")")))
'this shows the sliced array
Range("F1").Resize(UBound(v2, 1), UBound(v2, 2)) = v2

End Sub

【讨论】:

  • 非常感谢您的精彩解释。只是一个问题:使用 INDEX 是否会像 Transpose 一样有限制,或者它们都有相同的限制?
  • 对不起,我没有听懂你的问题。稍后我会挖掘一些关于这个方法的链接。
  • 这里有另一个例子stackoverflow.com/questions/60816640/… 以及我在 TM 的回答的评论中的链接。
  • 非常感谢您的大力帮助。
【解决方案2】:

你可以使用 Tranpose():

Dim v As Variant, v1 As Variant

v = Range("A1").Resize(36, 19).Value' just to fill a 36x19 array


v1 = Application.Transpose(v)
ReDim Preserve v1(1 To UBound(v, 2), 1 To 12)
v = Application.Transpose(v1)

【讨论】:

  • 非常感谢。我想过使用转置,但你确实知道它是有限的。使用 Application,Index 在这种情况下会有用吗?它也有限制吗?!
  • 嗯,你的问题是关于一些 36x19 数组,所以这种情况没有限制
  • 我知道。这只是一个简单的示例,以便能够遵循解决方案。
  • 我(但我认为我们这里的大多数人,如果不是全部的话)会根据其中所写的内容来回答问题。您应该在您的这个问题中添加一些警告,以免收到(对您而言)无用的答案,并为读者提供信息,让他们正确决定他们是否能够回答
  • 完全没有,这就是为什么我添加了“在你认为等待足够长的时间之后”,因为标记的答案可能会阻止人们深入研究它。一旦你确定你已经得到了所有可能的关注,你可能想要删除标记并在之后重新放置它
猜你喜欢
  • 2013-03-15
  • 2018-05-06
  • 2011-09-19
  • 1970-01-01
  • 1970-01-01
  • 2020-06-17
  • 1970-01-01
相关资源
最近更新 更多