如何使 VBA 代码运行得更快(15 种方法)
如何使 VBA 代码运行得更快(15 种方法)
VBA(Visual Basic for Applications)是Excel等Office应用中常用的自动化脚本语言。然而,许多初学者在编写VBA代码时会遇到性能问题,导致宏运行缓慢。本文将介绍15种实用方法,帮助你优化VBA代码,使其运行得更快。
方法一 - 关闭屏幕更新以使VBA代码运行更快
保持屏幕更新会减慢您的 VBA 代码速度。每次 VBA 将数据插入工作表时,它都会重新加载屏幕图像。为此,您必须关闭屏幕更新。
您可以使用以下代码关闭屏幕更新:
Application.ScreenUpdating = FALSE
您可以使用以下代码来开启屏幕更新:
Application.ScreenUpdating = TRUE
方法2 – 关闭自动电子表格计算
如果您保持自动电子表格计算处于打开状态,可能会极大地影响您的 VBA 代码。如果更改工作表中的任何值,Excel 将重新计算与该单元格值相关的所有单元格。这意味着宏将插入这些值,并且VBA将停止,直到工作表完成。
此解决方案是运行更快的 VBA 代码所必需的。您必须手动设置计算。
应用以下命令关闭自动电子表格计算:
Application.Calculation = xlCalculationManual
您还可以应用以下命令来打开自动电子表格计算:
Application.Calculation = xlCalculationAutomatic
您还可以使用Excel设置计算选项。
- 转到顶部功能区公式>>,从计算选项>>选择自动。
方法 3 – 避免使用 VBA 复制和粘贴方法使 VBA 代码运行得更快
内置的复制粘贴方法可能会使VBA代码运行速度变慢。使用以下代码通过引用值本身来复制和粘贴。这将使VBA代码的运行速度提高 25 倍。
Range("B1:D100").value = Range("F1:H100").value
方法 4 – 不要使用复杂的公式使 VBA 代码运行得更快
复杂的公式可能会使VBA代码运行速度变慢。当需要复杂的计算时,您可以将公式分解为不同的部分。假设您想使用VBA了解每月的贷款支付情况。宏将以5%年利率计算贷款每月还款额,为期 4 年。
在这种情况下,可能需要加法、乘法、求幂和除法。这里,首先执行求幂,然后根据该结果执行其他运算。此外,求幂比其他函数需要更长的时间。
宏可以比复杂的公式更快地计算简单的公式。
方法 5 – 禁用事件使 VBA 代码运行得更快
当您激活任何工作表或打开任何工作簿时更改工作表中的任何单元格时,都会触发事件。在这种情况下,事件可能会导致不需要的结果或使宏运行速度变慢。
使用相应的代码来禁用事件:
Application.EnableEvents = False
您还可以使用相应的代码来启用事件:
Application.EnableEvents = True
方法 6 – 在 VBA 中应用“With…..End With”语句
应用with语句可以使VBA代码运行得更快。下面给出一个例子:
假设您有以下包含空白行的数据集。
步骤:
- 转到顶部功能区开发人员>>Visual Basic。
- 选择插入>>模块选项卡。
- 在模块:中输入相应的代码
Sub Faster_Example()
With Sheets("using with-end with statement")
.Range("B4").FormulaR1C1 = "Exceldemy"
.Range("B5").FormulaR1C1 = "VBA code"
.Range("B4").Font.Bold = True
.Range("B5").Font.Bold = True
End With
End Sub
With语句表示您可以对特定对象执行许多语句,而无需重复提及对象名称。通过这样做,您可以使VBA代码更具可读性。
- 转到开发人员>>宏。
- 从M宏名称中选择Faster_Example。
- 按运行un。
您可以看到以下结果。
方法 7 – 使用“For Each”循环而不是“For”循环
您可以使用For Each循环。这比 For 循环更快。 为了……每个循环执行组或数组的每个元素。
下面给出一个例子。
Sub Loop1()
Dim cell As Range
For Each cell In Range("b4:b50")
cell.Value = 100
Next cell
End Sub
方法 8 – 尝试减少与工作表的交互
当需要与工作表交互时,VBA 会变得更慢。如果可能的话,将所有公式放入 VBA 中。从宏调用公式会使 VBA 代码运行速度变慢。因此,VBA 每次都必须重新读取数据。
此外,尽量不要在循环中插入工作表数据。您可以先调用数据,然后将公式插入循环中。
下面给出一个例子:
For Time = 1 To 24
Worked_Hour = Range("Salary_Hour") + Time
Next Time
在此代码中,VBA 与工作表交互了一次,但以下代码仍然是最快的。
Salary_Hour = Range("Salary_Hour")
For Time = 1 to 24
Worked_Hour = Salary_Hour + Time
Next Time
在 VBA 中进行所有数值计算会更加富有成果。
方法 9 – 使用单个操作读取和写入数据块
“数组”可以轻松保存多个变量。所以,你不应该在一开始就初始化数组。尝试在VBA 代码的操作中使用数组。
使用以下代码:
With Worksheets("Exceldemy1")
.Range("B4:L20").Value = myArray
End With
而不是以下内容:
myArray= Worksheets("Exceldemy1").Range("B4:L20").value
方法10 – 关闭警报以使VBA代码运行得更快
当您关闭任何工作簿而不将其保存在Excel中时,会出现一个图标框,提醒您该工作簿是否已保存。
同样,警报是提醒您做某事的东西。这可能会使VBA代码运行速度稍慢。因此,您可以关闭警报以使 VBA 代码运行得更快。
使用以下命令关闭显示警报:
Application.DisplayAlerts = False
使用以下命令打开显示警报:
Application.DisplayAlerts = True
方法 11 – 避免在公式中使用变体
如果您不在代码开头使用“Option Explicit”,则任何未定义的内容都将充当变体。因此,请尝试在代码开头声明“Option Explicit”,因为VBA对变量非常敏感。此外,在VBA代码中处理变量的速度很慢。这就是为什么除非必要,否则尽量不要使用变量作为公式变体。
方法 12 – 使用布尔代码而不是字符串
字符串是简单的文本,在宏中读取速度很慢。在这种情况下,您可以使用枚举来指定数值作为变体。宏可以更快地读取数值。
另外,您可以根据自己的考虑,在枚举时指定一定的数值。
除此之外,您还可以使用布尔代码。布尔代码充当开关,例如TRUE/FALSE,这是一个非常快的过程。
Using Strings Enumeration Boolean Code
Select Case Marrital_status
Case "Married"
(insert code here)...
Case "Unmarried"
(insert code here)...
Case "Widow"
(insert code here)...
End Select Public Enum enumMarrital_status
Married = 0
Unmarried = 1
Widow = 2
End Enum
Dim Marrital_status as enumMarrital_status
Select Case Marrital_status
Case Married
(insert code here)...
Case Unmarried
(insert code here)...
Case Widow
(insert code here)...
End Select If bMarried Then
(insert code here)...
ElseIf bUnmarried Then
(insert code here)...
ElseIf bWidow Then
(insert code here)...
End If
方法 13 – 关闭分页符的显示
为了使 VBA 代码运行得更快,您可以关闭分页符的显示。使用此选项可能并不总是会产生影响,但如果 VBA 强制Excel计算所有分页符,这可能会影响VBA代码的运行速度。
使用以下命令关闭显示分页符:
ActiveSheet.DisplayPageBreaks = False
使用以下命令打开显示分页符:
ActiveSheet.DisplayPageBreaks = True
方法 14 – 除非重要,否则避免选择特定工作表
尽量不要使用“选择”命令。这可以使 VBA 代码运行得更快。
使用以下代码进行选择:
Salary1 = Worksheets("Income").Cells(4,4)
方法 15 – 不要过度使用状态栏更新
VBA 代码的计算速度比显示结果更快。因此,避免过度使用状态栏更新可能会使 VBA 代码运行得更快。当操作较多时,您可以在执行某些操作后使用状态栏更新,而不是在执行每个操作后更新。
使用以下公式更改设置以显示状态栏更新:
用于计算=1 到 100
(在此处插入代码)...
如果计算 mod 10=0 则 Application.StatusBar=计算
下一步计算
要记住的事情
在Excel中使用这些给定代码时,您必须完成 VBA 编码格式的完整步骤。