相同的macros速度差异

我有两个工作簿包含相同的macros。 在一个工作簿中,macros运行速度超快,不到一秒钟。 另一个需要将近30秒的时间。 我正在使用Excel 2003.分页符在两个工作簿中都closures。 我不知道什么可能导致一个比另一个慢。 有任何想法吗?

Sub viewFirst() Dim dataSheet As Worksheet, inputSheet As Worksheet, projectID As Long Dim projectRow As Long, lLastRec As Long, inputLastRow As Long, dataLastRow As Long, x As Long, sh As Shape Worksheets("Input").Select ActiveSheet.Protect "", UserInterfaceOnly:=True Range("a1").Select ActiveSheet.Pictures.Insert ("working.jpg") Application.ScreenUpdating = False Application.Calculation = xlCalculationManual Application.EnableEvents = False Set inputSheet = Worksheets("Input") Set dataSheet = Worksheets("Database") With inputSheet inputLastRow = .Cells(.Rows.Count, "A").End(xlUp).Offset(1, 0).Row - 1 End With With dataSheet dataLastRow = .Cells(.Rows.Count, "A").End(xlUp).Offset(1, 0).Row - 1 lLastRec = dataLastRow - 1 End With With inputSheet .Range("currentProject").Value = 1 projectID = .Range("currentProject").Value projectRow = projectID + 1 For x = 1 To inputLastRow If Range("b" & x).HasFormula Then x = x + 1 End If If x > inputLastRow Then Exit For End If If Not Range("b" & x).HasFormula Then .Range("b" & x).Value = dataSheet.Cells(projectRow, 2 + x) End If Next x .Range("d125").Value = dataSheet.Cells(projectRow, 2 + 149) .Range("d128").Value = dataSheet.Cells(projectRow, 2 + 150) .Range("d131").Value = dataSheet.Cells(projectRow, 2 + 151) .Range("d134").Value = dataSheet.Cells(projectRow, 2 + 152) .Range("d137").Value = dataSheet.Cells(projectRow, 2 + 153) .Range("d140").Value = dataSheet.Cells(projectRow, 2 + 154) End With With ActiveSheet For Each sh In .Shapes If sh.Type = msoPicture Then ActiveSheet.Unprotect "" sh.Delete ActiveSheet.Protect "", UserInterfaceOnly:=True End If Next sh End With Range("b5").Select Application.EnableEvents = True Application.Calculation = xlCalculationAutomatic Application.ScreenUpdating = True End Sub 

-编辑-

osknows,谢谢你的回应。 只是为了澄清,工作簿从来没有同时打开,除了dataSheet上的数据,工作簿是一样的 – macros运行缓慢的dataSheet有35行x 204列,快速运行的dataSheet有56行X 156列。 我将在input表中search隐藏的列或非空白单元格。

没有看到2个工作簿,很难说。 最好的build议是准确衡量你的代码的速度…

在一个模块decare

  Public Declare Function GetTickCount Lib "kernel32" () As Long 

然后在你的代码之间放置一些代码行

 dtStart = GetTickCount dtline2 = GetTickCount dtline3 = GetTickCount dtline4 = GetTickCount .. etc 

dtStart和dtline2之间的滴答数等于dtline2 - stStart

还有一些因素可能会减慢速度:

  1. inputLastRow = .Cells(.Rows.Count, "A").End(xlUp).Offset(1, 0).Row - 1可以包含很多行,看起来是空的,但不是。

  2. Set inputSheet = Worksheets("Input")Set dataSheet = Worksheets("Database")可能是巨大的复杂的范围

  3. For Each sh In .Shapes可能包含许多彼此重复的形状,看起来完全相同

  4. 您有未定义的范围和工作表,如果您打开多个工作簿并在代码运行时使用它们,则工作簿/工作表/范围没有明确定义。 (例如范围与范围)习惯使用With语句使用范围Filepath / Workbook / Sheet / Range或者单元格等的完整path

例如

 With ThisWorkbook With SheetXYZ With .range("XYZ1") End with End With End With 

要么

  With ThisWorkbook With SheetXYZ.range("XYZ1") .formula = "=Now()" End With End With 

另外看看这个方便的网站Excel页面

在较慢的机器上,卸载任何加载项。 如果你有一个全局变化事件的插件,那么每当任何工作表发生变化时,这个事件就会被触发,并且可能会导致速度变慢。 你正在写电子表格,所以会被称为很多。

考虑构build一个数组(2维,下限为1),并将所有数据写入单元格中,而不是逐个单元格写入。 这是一个如何工作的例子

 Sub WriteOnce() Dim aReturn() As Double Dim i As Long, j As Long Const lLASTROW As Long = 10 Const lLASTCOL As Long = 5 ReDim aReturn(1 To lLASTROW, 1 To lLASTCOL) For i = 1 To lLASTROW For j = 1 To lLASTCOL aReturn(i, j) = Rnd Next j Next i Sheet1.Range("A1").Resize(UBound(aReturn, 1), UBound(aReturn, 2)).Value = aReturn End Sub 

由于我只能访问一次工作表,任何事件处理程序只会触发一次。