设置这些属性可以加快Excel宏的速度:Application.ScreenUpdating,Application.DisplayAlerts

l--*_*''' 6 excel vba

这样做有什么意义:

Application.ScreenUpdating = False
Application.DisplayAlerts = False
Run Code Online (Sandbox Code Playgroud)

真的能节省那么多时间吗?

Ada*_*sha 14

这取决于您在屏幕上实际更新的数量,作为代码的一部分(即更新的单元格数量),有多少张纸,有多少张/单元引用您的代码正在更新的工作表以及有多少公式出现在整个工作簿中.

每次更改工作表中的某些内容时,Excel都会重新计算所有公式.因此,如果您的代码没有更新过多的工作表/单元格,但是您的工作簿有很多公式,那么关闭屏幕更新可能对您没有任何帮助.

对性能要考虑的另一件事是Calculation属性,将其设置为xlCalculationManual以关闭自动重复并在结束时将其转回xlCalculationAutomatic.

Application.Calculation = xlCalculationManual
Run Code Online (Sandbox Code Playgroud)

需要考虑的另一件事是事件,如果这些工作表中的一个或多个具有Worksheet_Chnage或Worksheet_Calculate事件处理程序,则每个更改代码正在执行的操作将触发它们,并且您的代码需要等到它们返回.所以在你的代码中关掉它.

Application.EnableEvents = False
Run Code Online (Sandbox Code Playgroud)

在我的大部分代码中,我都习惯使用它

On Error GoTo lblError
Dim bEvents As Boolean, iCalc As Integer, bScrnUpd As Boolean
bEvents = Application.EnableEvents
iCalc = Application.Calculation
bScrnUpd = Application.ScreenUpdating
Application.EnableEvents = False
Application.Calculation = xlCalculationManual
Application.ScreenUpdating = False

'-----------------------My code

Application.EnableEvents = bEvents
Application.Calculation = iCalc
Application.ScreenUpdating = bScrnUpd
Exit Sub

'reset them even if you are exiting due to error
lblError:
Application.EnableEvents = bEvents
Application.Calculation = iCalc
Application.ScreenUpdating = bScrnUpd
Debug.print Err.Description
Run Code Online (Sandbox Code Playgroud)


Pat*_*rez 5

screenUpdating的改进很大程度上取决于宏的编写方式.它将特别适用于录音机制作的那些可怕的宏,充满了不必要的"选择"和"激活".


小智 5

同意.

我发现当你关闭时ScreenUpdating,Calculation最好考虑如何做尽可能多的工作(写入,读取,事件......)作为ScreenUpdating回报的少量电话.这将加快操作速度,同时还为用户提供更好,更可容忍的体验.比如说,您希望尽快将一些数据写入工作表.你可以这样做:

For Each row In rowDic.Keys()
    ' turn off updating
    for item in rowDic.Key(row)
        ... do some writes
    Next             
    ' turn on updating
Next
Run Code Online (Sandbox Code Playgroud)

或者更快,你可以做到这一点:

' turn off updating
For Each row In rowDic.Keys()
    for item in rowDic.Key(row)
        ... do some writes
    Next             
Next
' turn on updating
Run Code Online (Sandbox Code Playgroud)

同样,在编写数据时,最快编写更大的块,更少.所以理想的写入次数(如果有的话)就是一个.您可以通过将a Range视为2D 来实现此目的array[rows,cols].我发现以下内容有效:

' turn off updates

' Organise data in ram so that it fits the range for which it is meant
Dim two_d_arr (rows,cols)
loadDataFromSource two_d_arr

Dim destinationRange as Range
destinationRange = Sheets(someSheet).Range(someRange).Value = two_d_arr

Redim two_d_arr(0,0) ' !!! RELEASE MEMORY
' turn on updates
Run Code Online (Sandbox Code Playgroud)

这里没有循环,这可以优化每个单独任务在CPU中的时间,从而加快处理时间,从而使excel正常工作(不会崩溃).

HTH,

F