2017-09-26 213 views
0

爲什麼這樣的:如何填充動態2D陣列?

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 

導致「運行時錯誤9 - 下標越界」在使用ReDim行? 我不知道進入for循環之前的數組行數。列號應始終爲2.儘管如此,但使用一維數組也可以實現同樣的功能! 有什麼幫助嗎?

+1

如果循環之前知道數組的最終大小('1對於LRow'),通過避免在每次迭代中調整大小來調整陣列的大小並享受非常棒的性能提升。 –

回答

2

如前所述,你只能REDIM保留最後一個維度。

但你也可以使用其他方法來找到需要的「行」的數量和設置之前rediming數組:

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