目录:
- 停止工作表计算
- 您可以使用应用程序。 ScreenUpdating属性禁用屏幕更新,直到您的宏完成。禁用屏幕更新可节省时间和资源,使您的宏运行速度更快一些。宏代码运行完毕后,您可以重新开启屏幕更新。 Sub Macro1()应用程序。 Calculation = xlCalculationManual应用程序。 ScreenUpdating = False'将您的宏代码放在这里Application。计算= xlCalculationAutomatic应用程序。 ScreenUpdating = True End Sub
- Sub Macro1()Application。 Calculation = xlCalculationManual应用程序。 ScreenUpdating = False应用程序。 DisplayStatusBar = False'把你的宏代码放在这里Application。计算= xlCalculationAutomatic应用程序。 ScreenUpdating =真正的应用程序。 DisplayStatusBar = True End Sub
- 通过使用EnableEvents属性,您可以添加其他级别的性能提升,以便在您的宏运行时告诉Excel忽略事件。
- 挂起数据透视表更新
- 您可以通过剪切中间人,并从一个单元格直接复制到目标单元格,从而使您的宏得到轻微的提升。此替代代码使用目标参数绕过剪贴板并将单元格A1的内容直接复制到单元格B1。
- 如果只需要将公式从一个单元格复制到另一个单元格(而不是值或格式),则可以将目标单元格的公式设置为包含在源单元格中的相同公式:
- 宏记录器喜欢使用Select方法在对它们执行操作之前显式选择对象。在使用它们之前通常不需要选择对象。实际上,您可以通过不使用Select方法来显着提高宏观性能。记录你的宏之后,习惯于改变生成的代码来删除Select方法。在这种情况下,优化的代码如下所示:
- 例如,下面的简单代码强制VBA连续返回到表格(“Sheet1”)。范围(“A1”)获取在If语句中执行比较所需的数字:
随着您的Excel宏越来越强大和复杂,您可能会发现它们失去了性能。讨论宏时,单词 performance 通常与 speed 是同义的。速度是VBA程序执行预定任务的速度。以下是帮助您保持Excel宏运行在最佳性能级别的十种方法。
停止工作表计算
<!您是否知道每次影响电子表格中任何公式的单元格被更改或操作时,Excel都会重新计算整个工作表?在具有大量公式的工作表中,此行为可能会显着减慢您的宏。您可以使用应用程序。计算属性以告诉Excel切换到手动计算模式。当工作簿处于手动计算模式时,只有通过按F9键明确触发计算,工作簿才会重新计算。
<! - 2 - >
将Excel放入手动计算模式,运行您的代码,然后切换回自动计算模式。 Sub Macro1()应用程序。 Calculation = xlCalculationManual'将您的宏代码放在这里Application。 Calculation = xlCalculationAutomatic End Sub将计算模式设置回xlCalculationAutomatic将自动触发重新计算工作表,因此在宏运行后不需要按F9键。
禁用表单屏幕更新
您可能会注意到,当您的宏运行时,屏幕会进行相当数量的闪烁。这种闪烁是Excel试图重画屏幕来显示工作表的当前状态。不幸的是,每次Excel重绘屏幕时,都会占用内存资源。您可以使用应用程序。 ScreenUpdating属性禁用屏幕更新,直到您的宏完成。禁用屏幕更新可节省时间和资源,使您的宏运行速度更快一些。宏代码运行完毕后,您可以重新开启屏幕更新。 Sub Macro1()应用程序。 Calculation = xlCalculationManual应用程序。 ScreenUpdating = False'将您的宏代码放在这里Application。计算= xlCalculationAutomatic应用程序。 ScreenUpdating = True End Sub
将ScreenUpdating属性重新设置为True后,Excel将自动触发重画屏幕。
关闭状态栏更新
显示在Excel窗口底部的Excel状态栏通常显示Excel中某些操作的进度。如果您的宏正在处理大量数据,状态栏将占用一些资源。
请注意,关闭屏幕更新与关闭状态栏显示是分开的。即使禁用屏幕更新,状态栏也将继续更新。您可以使用该应用程序。 DisplayStatusBar属性暂时禁用任何状态栏更新,进一步提高您的宏的性能:
Sub Macro1()Application。 Calculation = xlCalculationManual应用程序。 ScreenUpdating = False应用程序。 DisplayStatusBar = False'把你的宏代码放在这里Application。计算= xlCalculationAutomatic应用程序。 ScreenUpdating =真正的应用程序。 DisplayStatusBar = True End Sub
告诉Excel忽略事件
您可以将宏实现为事件过程,告诉Excel在工作表或工作簿更改时运行某些代码。
有时,标准宏会做出会触发事件过程的更改。例如,如果您有一个标准的宏来处理Sheet1上的多个单元格,则每当该表单上的某个单元格发生更改时,您的宏必须在Worksheet_Change事件运行时暂停。
通过使用EnableEvents属性,您可以添加其他级别的性能提升,以便在您的宏运行时告诉Excel忽略事件。
在运行宏之前,将EnableEvents属性设置为False。宏代码运行完毕后,可以将EnableEvents属性设置为True。 Sub Macro1()应用程序。 Calculation = xlCalculationManual应用程序。 ScreenUpdating = False应用程序。 DisplayStatusBar = False应用程序。 EnableEvents = False'将您的宏代码放在这里Application。计算= xlCalculationAutomatic应用程序。 ScreenUpdating =真正的应用程序。 DisplayStatusBar =真正的应用程序。 EnableEvents = True End Sub
隐藏分页符
每次宏修改行数,修改列数或更改工作表的页面设置时,Excel都被迫花时间重新计算显示的分页符在工作表上。
您可以通过在启动宏之前隐藏分页符来避免这种行为。
将DisplayPageBreaks表属性设置为False以隐藏分页符。如果要在宏运行后继续显示分页符,请将DisplayPageBreaks表单属性重新设置为True。 Sub Macro1()应用程序。 Calculation = xlCalculationManual应用程序。 ScreenUpdating = False应用程序。 DisplayStatusBar = False应用程序。 EnableEvents = False Activesheet。 DisplayPageBreaks = False'把你的宏代码放在这里Application。计算= xlCalculationAutomatic应用程序。 ScreenUpdating =真正的应用程序。 DisplayStatusBar =真正的应用程序。 EnableEvents = True Activesheet。 DisplayPageBreaks = True End Sub
挂起数据透视表更新
如果您的宏操纵包含大型数据源的数据透视表,则在执行诸如动态添加或移动透视图字段之类的操作时,性能可能会变差。
通过暂停数据透视表的重新计算,直到完成所有透视图字段更改,可以提高宏的性能。只需设置数据透视表。 ManualUpdate属性为True推迟重新计算,运行您的宏代码,然后设置数据透视表。 ManualUpdate属性返回到False以触发重新计算。 Sub Macro1()ActiveSheet。数据透视表( “PivotTable1”)。 ManualUpdate = True'将您的宏代码放在ActiveSheet中。数据透视表( “PivotTable1”)。 ManualUpdate = False End Sub
转向清除复制和粘贴
重要的是要记住,虽然宏记录器通过为您编写VBA代码来节省时间,但并不总是编写最高效的代码。一个最好的例子就是宏录制器如何捕获录制过程中执行的任何复制和粘贴操作。
您可以通过剪切中间人,并从一个单元格直接复制到目标单元格,从而使您的宏得到轻微的提升。此替代代码使用目标参数绕过剪贴板并将单元格A1的内容直接复制到单元格B1。
范围( “A1”)。复制目的地:=范围(“B1”)
如果您只需要复制值(不是格式或公式),则可以通过避免使用复制方法来进一步提高性能。只需将目标单元格的值设置为在源单元格中找到的相同值即可。此方法比使用复制方法大约快25倍:
范围(“B1”)。值=范围(“A1”)。值
如果只需要将公式从一个单元格复制到另一个单元格(而不是值或格式),则可以将目标单元格的公式设置为包含在源单元格中的相同公式:
范围(“B1” )。公式=范围(“A1”)。公式
使用With语句
录制宏时,您经常会多次操作同一个对象。您可以使用With语句对一个给定对象执行多个操作,从而节省时间并提高性能。
以下示例中使用的With语句告诉Excel一次应用所有格式更改:
使用Range(“A1”)。字体。大胆=真实。斜体=真。下划线= xlUnderlineStyleSingle End With
将动作分成With语句的习惯不仅可以让宏运行得更快,而且还可以更轻松地读取宏代码。
避免选择方法
宏记录器喜欢使用Select方法在对它们执行操作之前显式选择对象。在使用它们之前通常不需要选择对象。实际上,您可以通过不使用Select方法来显着提高宏观性能。记录你的宏之后,习惯于改变生成的代码来删除Select方法。在这种情况下,优化的代码如下所示:
表(“Sheet1”)。范围( “A1”)。 FormulaR1C1 =“1000”表格(“Sheet2”)。范围( “A1”)。 FormulaR1C1 =“1000”表(“Sheet3”)。范围( “A1”)。 FormulaR1C1 =“1000”
请注意,没有任何内容正在被选中。代码只是使用对象层次来应用所需的操作。
限制工作表
另一种加速宏的方法是限制在代码中引用工作表数据的次数。从工作表中获取数据比从内存中获取数据效率低。也就是说,如果你的宏不需要重复地与工作表进行交互,那么你的宏将运行得更快。
例如,下面的简单代码强制VBA连续返回到表格(“Sheet1”)。范围(“A1”)获取在If语句中执行比较所需的数字:
对于ReportMonth = 1至12如果范围(“A1”)。 Value = ReportMonth Then MsgBox 1000000 / ReportMonth End If Next ReportMonth
更有效的方法是将值保存在表格(“Sheet1”)中。范围(“A1”)到一个名为MyMonth的变量。这样,代码将引用MyMonth变量而不是工作表:
Dim MyMonth as Integer MyMonth = Range(“A1”)。 Value ReportMonth = 1 To 12 If MyMonth = ReportMonth Then MsgBox 1000000 / ReportMonth End If Next ReportMonth
考虑利用变量来处理内存中的数据,而不是直接引用工作表。