相同的宏速度差异

时间:2011-04-27 21:24:27

标签: performance excel vba excel-vba

我有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列。我将在输入表上搜索隐藏列或非空单元格。

2 个答案:

答案 0 :(得分:3)

没有看到2本工作簿,很难说清楚。最好的建议是通过...准确测量代码的速度。

在模块中判决

 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. 您有未定义的范围&如果您打开多个工作簿并在代码运行时使用它们,那么工作簿/工作表/范围未明确定义。 (例如.Range与Range)养成使用With语句使用范围文件路径/工作簿/工作表/范围或单元格等的完整路径的习惯

  5. 例如

    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

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