设置这些属性需要多less时间才能加快Excelmacros:Application.ScreenUpdating,Application.DisplayAlerts

这样做的意义何在:

Application.ScreenUpdating = False Application.DisplayAlerts = False 

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

同意。

我发现,当closuresScreenUpdatingCalculation ,最好考虑如何尽可能多的工作(写入,读取,事件…),尽可能less的ScreenUpdating调用。 这将加速运营,同时也为用户提供更好,更可忍受的体验。 比方说,你想尽可能快地写一些数据到一张纸上。 你可以这样做:

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

或者走得更快,你可以这样做:

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

同样,在写入数据时,写入较大块的速度最快,次数也最less。 所以如果有的话,理想的写入次数是1次。 你可以通过将Range作为二维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 

在这里,没有循环,这优化了每个单独的任务在CPU中的时间,从而导致更快的处理时间,反过来似乎使Excel正常工作(而不是崩溃)。

HTH,

F

这取决于你在屏幕上作为代码的一部分实际更新了多less(即已更新的单元格数量),以及有多less表单,有多less表单/单元格参考你的代码正在更新的表单以及有多less个公式呈现在整个工作簿中。

每次您在工作表中更改某些内容时,Excel都会重新计算所有公式。 所以,如果你的代码没有更新太多的工作表/单元格,但是你的工作簿有很多公式,closures屏幕更新可能根本无法帮到你。

还有一件事要考虑性能是计算属性,将其设置为xlCalculationManual以closures自动标记,并最终将其返回到xlCalculationAutomatic。

 Application.Calculation = xlCalculationManual 

还有一件要考虑的事件是事件,如果其中一个或多个工作表具有Worksheet_Chnage或Worksheet_Calculate事件处理程序,则每个事件处理程序都会更改您的代码将触发它们,并且您的代码需要等到它们返回。 所以在你的代码中closures它。

 Application.EnableEvents = False 

在我的大部分代码中,我怀疑是使用这个

 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 

screenUpdating的改进在很大程度上取决于你的macros如何编写。 这将是特别有用的那些可怕的macros由logging器,充满了不必要的“select”和“激活”。

绝对。 几年前,我有一个长时间运行的macros,运行了几乎一分钟。 我将ScreenUpdating设置为false,并在5秒内完成。

只要确保在完成运行macros时将ScreenUpdating重置为true。

我不会使用这些'速度',而是'function'

当您不希望用户看到屏幕更新时:

 Application.ScreenUpdating = False 

当你不希望用户看到应用程序的每一个多余的消息:

 Application.DisplayAlerts = False 

特别是后者,因为没有人希望用消息询问你是否真的想要更新,附加或删除logging而被大肆宣传。 我更喜欢屏蔽用户这样的东西。