我有2个包含相同宏的工作簿。在一个工作簿中,宏运行速度超快,不到一秒钟。在另一个中,运行需要将近30秒。我正在使用Excel 2003.两个工作簿中的分页符都关闭了。我不知道是什么导致一个人比另一个人跑得慢。有什么想法吗?
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上的数据之外,工作簿是相同的 - 宏运行缓慢的数据表有35行x 204列,快速运行的dataSheet有56行X 156列。我将在输入表上搜索隐藏列或非空单元格。
答案 0 :(得分:3)
没有看到2本工作簿,很难说清楚。最好的建议是通过...准确测量代码的速度。
在模块中判决
Public Declare Function GetTickCount Lib "kernel32" () As Long
然后在你的代码中某些代码行之间
dtStart = GetTickCount
dtline2 = GetTickCount
dtline3 = GetTickCount
dtline4 = GetTickCount
..
etc
dtStart和dtline2之间的刻度数等于dtline2 - stStart
等
还有许多因素可能会减慢速度:
inputLastRow = .Cells(.Rows.Count, "A").End(xlUp).Offset(1, 0).Row - 1
可能包含许多看似空白但不是的行。
Set inputSheet = Worksheets("Input")
& Set dataSheet = Worksheets("Database")
可能是巨大的复杂范围
For Each sh In .Shapes
可能包含许多看起来完全相同的重复形状
您有未定义的范围&如果您打开多个工作簿并在代码运行时使用它们,那么工作簿/工作表/范围未明确定义。 (例如.Range与Range)养成使用With
语句使用范围文件路径/工作簿/工作表/范围或单元格等的完整路径的习惯
例如
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 Pages
答案 1 :(得分:0)
在较慢的计算机上,卸载任何加载项。如果您有一个带有全局更改事件的加载项,则每次任何工作表更改时都会触发该加载项,并且可能导致速度变慢。你正在写电子表格,所以它会被称为很多。
不是逐个单元地编写,而是考虑构建一个数组(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
由于我只访问工作表一次,因此任何事件处理程序只会触发一次。