如何填充动态2D阵列?

时间:2017-09-26 16:43:21

标签: arrays excel vba dynamic-arrays

为什么这样:

Dim Arr As Variant
p = 1
For i = 1 To LRow
If Sheets("Data").Range("U" & 4 + i).Value > 0 Then
    ReDim Preserve Arr(1 To p, 1 To 2)
    Arr(p, 1) = Sheets("Data").Range("U" & 4 + i).Value
    Arr(p, 2) = Sheets("Data").Range("N" & 4 + i).Value
    p = p + 1
End If
Next

导致ReDim线上的“运行时错误9 - 下标超出范围”? 我不知道进入for循环之前的数组行数。列号应始终为2.尽管如此,使用1D阵列可以做同样的事情! 有什么帮助吗?

2 个答案:

答案 0 :(得分:2)

如上所述,您只能重新保留最后一个维度。

但您也可以使用其他方法查找所需的“行”数,并在重新设置数组之前设置它:

Dim Arr As Variant
p = 1
dim rws as long
rws = Application.WorkSheetFunction.CountIf(Sheets("Data").Range("U5:U" & Lrow+4),">0")
Redim Arr(1 to rws,1 to 2)
For i = 1 To LRow
If Sheets("Data").Range("U" & 4 + i).Value > 0 Then

    Arr(p, 1) = Sheets("Data").Range("U" & 4 + i).Value
    Arr(p, 2) = Sheets("Data").Range("N" & 4 + i).Value
    p = p + 1
End If
Next

答案 1 :(得分:1)

如果您使用ReDim Preserve,则只能调整数组的最后一个维度。 见这里:https://docs.microsoft.com/en-us/dotnet/visual-basic/language-reference/statements/redim-statement
如果您正在寻找解决方案,那么您可以将数组交换为Arr(2,p),因为您说列号始终为2。