优化VBAmacros

macros工作如下:

  1. 我们有一个1-120秒间隔的程序logging数据,它的数据来自Sheet2,dynamic数据范围B:W列
  2. 用户正在inputSheet3上的目标和偏差值
  3. 在Sheet2上,如果一行中的最大值大于“目标值减去偏差值”,它将开始在Sheet1上将行复制到表中
  4. Sheet1中的表格需要每2分钟显示一次,因此macros将复制每个X行(取决于时间间隔)

macros正常工作,但我需要在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。 不要复制和粘贴

复制和粘贴(或粘贴特殊 )function很慢。 使用以下命令复制和粘贴值的速度要快25倍。

 Range("A1:Z100").value = Range("A101:Z200").value 

如果你这样做,你的代码可能会工作。 如果你正在对许多行进行这样的操作,那么Mamory可能有问题。


规则#2。 计算

通常情况下,当单元格或范围的先例发生变化时,Excel将重新计算一个单元格或一系列单元格。 这可能会导致您的工作簿经常重新计算,这会降低性能。 您可以通过使用该语句防止Excel重新计算工作簿:

 Application.Calculation = xlCalculationManual 

在代码结束时,可以使用以下语句将计算模式重新设置为自动:

 Application.Calculation = xlCalculationAutomatic 

请记住,当计算模式为xlCalculationManual时 ,Excel不会更新单元格中的值。 如果您的macros依赖于更新的单元格值,则必须使用.Calculate方法(如Worksheets(1).Calculate强制执行计算事件。


规则#3。 ScreenUpdating

VBA的其他速度问题是,每当VBA将数据写入工作表时,它都会刷新您所看到的屏幕图像。 刷新图像对性能造成相当大的阻碍。 以下命令closures屏幕更新。

 Application.ScreenUpdating = FALSE 

在macros的末尾使用以下命令重新打开屏幕更新。

 Application.ScreenUpdating = TRUE 

规则4忽略事件

如果您有Worksheet_Change事件为您的工作簿Sheet 1实施。 任何时候单元格或范围在Sheet1上被更改,Worksheet_Change事件将运行。 因此,如果您有一个标准的macros来处理Sheet1上的多个单元格,则每当该表单上的某个单元格发生更改时,您的macros必须在Worksheet_Change事件运行时暂停。 你可以想象这种行为会如何减慢你的macros观。

 Application.EnableEvents = False 

在代码结束时,可以使用以下语句将EnableEvents模式设置为True:

 Application.EnableEvents = True 

规则5与声明

录制macros时,您经常会多次操作相同的对象。 您可以使用With语句对一个给定对象执行多个操作,从而节省时间并提高性能。

以下示例中使用的With语句告诉Excel一次应用所有格式更改:

 With Range("A1").Font .Bold = True .Italic = True .Underline = xlUnderlineStyleSingle End With 

通过将语句分成With语句的习惯,不仅可以让macros运行得更快,而且还可以更轻松地读取macros代码。