VBA: 将数组写入块中的sheet(一次内存访问)

VBA: Write array to sheet in a block (one memory access)

我有一个大数组(45000 个元素),我需要在 excel sheet 中写下来。然而,当循环遍历值时(为每个值请求内存访问)

(我已经禁用了屏幕更新等功能)

我找到了一些使用 Variant 类型的方法(法语:https://www.lecfomasque.com/vba-rediger-des-macros-plus-rapides/)但是我一定是在某些时候搞砸了,请参见示例代码

Sub test()
    Dim table(4) As Variant
    Dim writeArray() As Variant


    table(0) = 0
    table(1) = 1
    table(2) = 2
    table(3) = 3
    table(4) = 4

    writeArray = table

    'Supposed to write 0 to A1, 1 to A2,... but not working that way
    Range("A1:A5").Value = writeArray

End Sub

此代码仅将第一个值 (0) 写入整个范围,即使变体 writearray 也包含其他值 (1,2,3,4)。

欢迎任何关于如何解决这个问题的想法(没有每个值的内存请求),谢谢^-^

编辑(解决方案)------------------------

Paul 的(转置)和 Mikku 的(二维数组)解决方案似乎有效,并且在我的案例中都将执行时间缩短了十倍。转置平均速度略快。

我在 this site 上发现了这篇有用的小文章...

Dim Destination As Range
Set Destination = Range("K1")
Destination.Resize(UBound(Arr, 1), UBound(Arr, 2)).Value = Arr

您可以在写入工作表时转置数组:

Set Destination = Range("K1")
Destination.Resize(UBound(Arr, 2), UBound(Arr, 1)).Value = Application.Transpose(Arr)

二维数组可以做到这一点

Sub test()

    Dim table(0 To 4, 1 To 1) As Variant

    table(0, 1) = 0
    table(1, 1) = 1
    table(2, 1) = 2
    table(3, 1) = 3
    table(4, 1) = 4


    Range("A1:A5") = table


End Sub

潜在的问题是一维数组对应于sheet中的。所以你可以把

Range("A1:E1") = table

而且效果很好。

如果您想将数组放入列中,最简单的方法是使用 @Paul 提到的转置:

writeArray = Application.WorksheetFunction.Transpose(table)

这为您提供了一个包含 5 行 1 列的二维数组。

Sub test2()
    Dim table(0 To 4) As Variant
    Dim writeArray() As Variant


    table(0) = 0
    table(1) = 1
    table(2) = 2
    table(3) = 3
    table(4) = 4

    writeArray = Application.WorksheetFunction.Transpose(table)

    Debug.Print ("ubound=" & UBound(writeArray, 1))
    Debug.Print ("ubound=" & UBound(writeArray, 2))

    Range("A1:A5") = writeArray
    Range("A1:E1") = table
End Sub