Одинаковая разница в скорости макросов - PullRequest
0 голосов
/ 28 апреля 2011

У меня есть 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

-EDIT-

osknows, спасибо за ответ. Просто чтобы уточнить, рабочие книги никогда не открываются одновременно, и опять-таки рабочие книги идентичны, за исключением данных в dataSheet - таблица данных, где макрос выполняется медленно, имеет 35 строк x 204 столбца, а таблица данных, которая выполняется быстро, имеет 56 строк X 156 колонн. Я собираюсь искать скрытые столбцы или непустые ячейки на входном листе.

Ответы [ 2 ]

3 голосов
/ 28 апреля 2011

Трудно сказать, не видя 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. У вас есть неопределенные диапазоны и листы, которые, если у вас открыто несколько рабочих книг и они используются во время выполнения кода, то рабочие книги / рабочие таблицы / диапазоны не являютсяявно определены.(Например. Диапазон по сравнению с диапазоном) Привыкайте использовать полный путь к диапазону Filepath / Workbook / Sheet / Range или cell и т. Д., Используя 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

0 голосов
/ 28 апреля 2011

На более медленной машине выгрузите все надстройки.Если у вас есть надстройка с событием глобального изменения, она будет запускаться каждый раз при любых изменениях рабочего листа и может вызывать замедление.Вы довольно часто пишете в электронную таблицу, поэтому она будет называться много.

Вместо записи по ячейкам, рассмотрите возможность создания массива (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

Поскольку я обращаюсь к рабочему листу только один раз, любые обработчики событий будут срабатывать только один раз.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...