[英]Optimizing VBA macro
宏的工作原理如下:
宏工作正常,但我需要在 8 个不同的目标值上运行 8 次。 想知道是否有人有任何想法可以加快速度
'Cell address with target value"
target = Sheets(3).Cells(93, 2).Value
'Cell address with deviation value"
deviation = Sheets(3).Cells(95, 2).Value
'Calculate time between measurements'
lngRowMultiplier = 120 / Sheets(3).Cells(81, "B").Value
'First row to copy into'
pasteRow = 34
'Row number to search through'
For i = 2 To 8000
'Range to search through'
s_max_value_range = "B" & i & ":W" & i
'Max value in a row'
max_value = Application.WorksheetFunction.Max(Sheets(2).Range(s_max_value_range))
If (Abs(target - max_value) <= deviation) Then
'Copy up to 5 hours or until lowest value in a row will be bigger than target value + deviation'
For j = 1 To 150
'Minimum value in a row'
min_value = Application.WorksheetFunction.Min(Sheets(2).Range("B" & i + (j - 1) * lngRowMultiplier & ":W" & i + (j - 1) * lngRowMultiplier))
If (min_value <= target + deviation) Then
s_copyRange = "B" & i + (j - 1) * lngRowMultiplier & ":W" & i + (j - 1) * lngRowMultiplier
s_pasteRange = "C" & pasteRow & ":V" & pasteRow
'Copy to Sheet1'
Sheets(2).Range(s_copyRange).Copy Destination:=Sheets(1).Range(s_pasteRange)
Sheets(1).Range("B" & pasteRow) = Sheets(2).Range("B" & i + (j - 1) * lngRowMultiplier)
pasteRow = pasteRow + 1
End If
Next j
i = 8001
End If
Next i
所有帮助表示赞赏
VBA 有一些规则可以使您的代码更快。
规则#1。 不要复制和粘贴
复制和粘贴(或PasteSpecial )功能很慢。 使用以下内容复制和粘贴值大约快 25 倍。
Range("A1:Z100").value = Range("A101:Z200").value
如果您这样做,您的代码可能会起作用。 如果您对多行执行此操作,Mamory 可能存在问题。
规则#2。 计算
通常,当单元格或单元格区域的先例发生更改时,Excel 将重新计算该单元格或单元格区域。 这可能会导致您的工作簿过于频繁地重新计算,从而降低性能。 您可以使用以下语句阻止 Excel 重新计算工作簿:
Application.Calculation = xlCalculationManual
在代码的末尾,您可以使用以下语句将计算模式设置回自动:
Application.Calculation = xlCalculationAutomatic
但请记住,当计算模式为xlCalculationManual 时,Excel 不会更新单元格中的值。 如果您的宏依赖于更新的单元格值,则必须使用 .Calculate 方法(如Worksheets(1).Calculate
强制执行计算事件。
规则#3。 屏幕更新
VBA 的另一个速度问题是,每次 VBA 将数据写入工作表时,它都会刷新您看到的屏幕图像。 刷新图像会对性能造成相当大的拖累。 以下命令关闭屏幕更新。
Application.ScreenUpdating = FALSE
在宏的末尾,使用以下命令重新打开屏幕更新。
Application.ScreenUpdating = TRUE
规则 #4 忽略事件
如果您为工作簿的 Sheet1 实现了 Worksheet_Change 事件。 任何时候更改 Sheet1 上的单元格或范围时,都会运行 Worksheet_Change 事件。 因此,如果您有一个标准宏来操作 Sheet1 上的多个单元格,则每次更改该工作表上的一个单元格时,您的宏必须在 Worksheet_Change 事件运行时暂停。 您可以想象这种行为将如何减慢您的宏。
Application.EnableEvents = False
在代码的末尾,您可以使用以下语句将 EnableEvents 模式设置回 True:
Application.EnableEvents = True
规则 #5 带声明
录制宏时,您经常会多次操作同一个对象。 您可以通过使用 With 语句在一次拍摄中对给定对象执行多个操作来节省时间并提高性能。
以下示例中使用的 With 语句告诉 Excel 一次应用所有格式更改:
With Range("A1").Font
.Bold = True
.Italic = True
.Underline = xlUnderlineStyleSingle
End With
养成将动作分块到 With 语句中的习惯,不仅可以让您的宏运行得更快,而且还可以更轻松地阅读您的宏代码。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.