动态标注/填充2D数组

时间:2016-04-15 16:27:46

标签: arrays excel vba excel-vba

我有一个有趣的问题。我需要用数据填充二维数组,但是在填充数组之前我不知道有多少数据点。

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维的,我需要减少行,而不是列。

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. 根据需要重新调整数组,然后在前面创建(我认为这比循环数组两次更好:))。我已将此评论添加到 tigeravatar
  2. 转置数组以重新开始第一维
  3. 根据 tigeravatar
  4. 忽略冗余数据

    选项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