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
我有一个大数组(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