我有一个有趣的问题。我需要用数据填充二维数组,但是在填充数组之前我不知道有多少数据点。
Dim finalArray(0 to 500000, 0 to 3)
R=0
For Each index in someDictionary
If Not someDictionary.item(index)(1) = 0
finalArray(R,0) = someDictionary.item(index)(1)
finalArray(R,1) = someDictionary.item(index)(2)
finalArray(R,2) = someDictionary.item(index)(3)
R = R + 1
End If
Next index
问题在于,我不知道字典中有多少项,也不知道有多少项是非零的。我知道的唯一方法是在我运行循环并计算R之后。
目前,我将整个500k行数组打印到Excel,通常是100-400k行数据,其余为空白。这是笨拙的,我想将数组重新定义为正确的大小。我无法使用ReDim
,因为我无法删除数据,因此我无法使用ReDim Preserve
,因为它是2维的,我需要减少行,而不是列。
答案 0 :(得分:0)
这个怎么样?
Sub Sample()
Dim finalArray()
Dim R As Long
For Each Index In someDictionary
If Not someDictionary.Item(Index)(1) = 0 Then R = R + 1
Next Index
ReDim finalArray(0 To R, 0 To 3)
R = 0
For Each Index In someDictionary
If Not someDictionary.Item(Index)(1) = 0 Then
finalArray(R, 0) = someDictionary.Item(Index)(1)
finalArray(R, 1) = someDictionary.Item(Index)(2)
finalArray(R, 2) = someDictionary.Item(Index)(3)
R = R + 1
End If
Next Index
End Sub
答案 1 :(得分:0)
您有几个选择
选项1
注意我已经翻转了数据,以便在你去的时候重点测试ReDim,而不是预先定义一个数组大小 - 它可能会说这改变了问题的本质,但我认为这个技术值得指点出。 Option2显示了如何转置数组,无论
Sub SloaneDog()
Dim finalArray()
Dim R As Long
Dim lngCnt As Long
Dim lngCnt2 As Long
lngCnt = 100
ReDim finalArray(1 To 3, 1 To lngCnt)
somedictionary = Range("A1:C3001")
For lngCnt2 = 1 To UBound(somedictionary, 1)
finalArray(1, lngCnt2) = "data " & lngCnt2
If lngCnt2 Mod lngCnt = 0 Then ReDim Preserve finalArray(1 To 3, 1 To lngCnt2 + lngCnt)
Next
End Sub
选项2
Sub EddieBetts()
Dim X()
Dim Y()
Dim LngCnt As Long
ReDim X(1 To 1000, 1 To 3)
Debug.Print UBound(X, 1)
LngCnt = 100
Y = Application.Transpose(X)
ReDim Preserve Y(1 To UBound(Y, 1), 1 To LngCnt)
X = Application.Transpose(Y)
Debug.Print UBound(X, 1)
End Sub