我可以加快这个VBA代码吗?

我已经放了一个简单的macros,筛选通过列A和每3行转移到一行…(即A1,A2,A3去A1,B1,C1,A4,A5,A6去A2,B2, C2等…)

它工作得很好,但是,我将把范围推到最大,即试图去rows.count

我想知道如果有人对如何加快代码有深入的了解,大约需要40秒才能通过20万行,并在某个时间后排出一些炸弹(91错误)….

任何想法的一些改进?

这是代码:

Sub arrsampWORKS1() Dim array_example(3) Dim Destination As Range Dim p As Double 'StartTime = Timer For q = 0 To 40 p = q * 3 'Storing values in the array For i = 0 To 2 array_example(i) = Range("A" & i + 1 + p) Next Set Destination = Range(Cells(q + 1, 4), Cells(q + 1, 7)) Set Destination = Destination.Resize(1, 3) Destination.Value = array_example Next 'MsgBox Timer - StartTime & " seconds" End Sub 

一般来说,如果我有一个macros,我想更有效率,我closures屏幕更新和自动计算在macros的开始。 默认情况下,每次更改时,Excel将更新打开的工作簿中的每个公式。

 Application.ScreenUpdating = False Application.Calculation = xlCalculationManual 

在macros的末尾,我重新启用它们

 Application.Calculation = xlCalculationAutomatic Application.ScreenUpdating = True 

这大大缩短了时间,但只有在您不需要重新计算所有内容时才有用。

如果你需要在macros的给定时间计算,你可以使用

 Application.Calculate 'calculate everything wksht.Calculate 'calculate a specified worksheet 

如果你仍然需要更好的性能,那么开始重新编写代码。

写入电子表格和设置范围需要一定的时间来初始化,并且通常可以通过在内存中存储更多的项目,然后在最后写入来节省时间。

我会改变你的代码有2个循环 – 首先读取所有的数据,并创build一个临时variables,保存信息,然后第二个循环,输出所有的数据。

 Sub revised() Dim array_example(3) As Variant, alldata() As Variant Dim Destination As Range, Data As Range Dim p As Double, iCount As Double, iArraysCount As Double Dim step As Integer 'StartTime = Timer Set Data = Range("A1") ReDim Preserve alldata(0) iArraysCount = 0 step = 3 For iCount = 1 To 45 Step step 'Storing values in the array For i = 0 To 2 array_example(i) = Data.Cells(iCount + i) Next ReDim Preserve alldata(iArraysCount) alldata(iArraysCount) = array_example iArraysCount = iArraysCount + 1 Next Set Destination = Range("B1") For iCount = 0 To UBound(alldata) Destination.Cells(iCount + 1, 1).Value = alldata(iCount)(0) Destination.Cells(iCount + 1, 2).Value = alldata(iCount)(1) Destination.Cells(iCount + 1, 3).Value = alldata(iCount)(2) Next 'MsgBox Timer - StartTime & " seconds" End Sub