是否可以在VBA中截断多维数组,保留已包含在其中的数据?

时间:2016-11-08 14:43:10

标签: arrays excel vba excel-vba

我有一个数组,我在填充之前预先分配了一堆内存,一旦填充我想删除最后的空行,但是我得到一个错误。有没有使用第二个for循环的好方法的任何建议?

Dim myArray() as Variant
ReDim myArray( 1 to 800, 1 to 50)

For i = 1 to 800
' .....fill the array
Next i

然后下一个函数调用失败

ReDim Preserve myArray(1 to 50, 1 to 50)

错误消息:

"运行时错误' 9':

下标超出范围"

2 个答案:

答案 0 :(得分:1)

您可以使用Redim Preserve来重新定义数组。但是,这仅适用于数组的最后一个维度。这是一个做redim保存的快速示例:

Sub Test()
Dim arrMy()
ReDim arrMy(1 To 10, 1 To 10)
Dim i, j
For i = 1 To 10
    For j = 1 To 10
        arrMy(i, j) = 1
    Next j
Next i

ReDim Preserve arrMy(1 To 10, 1 To 1)

End Sub

为了回避这个限制,你可以简单地创建一个新数组,适当地调整它,并使用第一个数组中的数据填充它。

以下是此示例:

Sub Test2()
Dim arrMy()
ReDim arrMy(1 To 10, 1 To 10)
Dim i, j
For i = 1 To 10
    For j = 1 To 10
        arrMy(i, j) = 1
    Next j
Next i

Dim arrFinal()
ReDim arrFinal(1 To 2, 1 To 10)
For i = 1 To 2
    For j = 1 To 10
        arrFinal(i, j) = arrMy(i, j)
        arrFinal(i, j) = arrMy(i, j)
        arrFinal(i, 2) = arrMy(i, j)
    Next j
Next i

End Sub

答案 1 :(得分:0)

这不是你问题的正确答案,但是关于避免循环,你可以尝试这种方法

Sub Test2()

Dim arrMy()

ReDim arrMy(1 To 5, 1 To 5)
Dim i, j
For i = 1 To 5
    For j = 1 To 5
        arrMy(i, j) = i * j
    Next j
Next i

Range("A1").Resize(5, 5) = arrMy

Dim arrFinal()

ReDim arrFinal(1 To 2, 1 To 5)

arrFinal = Application.Index(arrMy, Evaluate("ROW(1:2)"), Array(1, 2, 3, 4, 5))

Range("H1").Resize(2, 5) = arrFinal

End Sub