Медленный цикл в макросе VBA - PullRequest
0 голосов
/ 16 октября 2018

У меня есть этот код, который мне нужен для создания 38 отчетов из одного большого отчета.Раньше это работало, но мы что-то добавили, и теперь это не работает.Я никогда не понимал процедуру Loop хорошо, хотя я читал другие ответы

Так вот, я полагаю, это раздел, который делает проблемуЕму нужно пройти 5602 строки, и даже минут 50, чтобы добраться до 50.

Do While v <= n
   If Cells(v, 2) <> "" And Cells(v, 2) <> "Call Center" And Cells(v, 2) <> drzava Then Rows(v).Delete Else v = v + 1
    Loop

И это все:

Sub SaveALLCountries()

Dim drzava$, nov As Workbook, ime$, v%, n%, a  As Double

Application.ScreenUpdating = False

For i = 1 To 38
    ThisWorkbook.Activate
    Application.StatusBar = i
    ThisWorkbook.Sheets("Results by CC").Range("CB14") = i
    drzava = ThisWorkbook.Sheets("Results by CC").Range("CD12")
    Workbooks.Add
    Set nov = ActiveWorkbook
    ThisWorkbook.Sheets("Results by CC").Copy Before:=nov.Sheets(1)
    ActiveSheet.Shapes.Range(Array("List Box 2")).Delete
    Cells.Select
    Selection.Copy
    Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
    :=False, Transpose:=False
    Range("A1").Select
    ThisWorkbook.Sheets("2018 Q2 Open answers").Copy Before:=nov.Sheets(2)
    Application.DisplayAlerts = False
    nov.Sheets(3).Delete
    Sheets("2018 Q2 Open answers").Select
    ActiveSheet.Outline.ShowLevels RowLevels:=2
    n = Application.WorksheetFunction.CountA(Sheets("2018 Q2 Open answers").Columns(2)) + 10
    v = 1
    Do While v <= n
        If Cells(v, 2) <> "" And Cells(v, 2) <> "Call Center" And Cells(v, 2) <> drzava Then Rows(v).Delete Else v = v + 1
    Loop
    ActiveSheet.Outline.ShowLevels RowLevels:=1
    Range("A1").Select
    ActiveWorkbook.Names("CallCenterSelect").Delete
    Sheets("Results by CC").Select
    ime = ThisWorkbook.Path & "\" & Sheets("Results by CC").Range("CD14").Value & ".xlsx"
    nov.SaveAs ime, FileFormat:=xlOpenXMLWorkbook, CreateBackup:=False
    nov.Close

Next i

Application.ScreenUpdating = True
Application.StatusBar = False

End Sub

1 Ответ

0 голосов
/ 16 октября 2018

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

Cells.Select
Selection.Copy
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
    :=False, Transpose:=False
Range("A1").Select

Полагаю, дело в удалении форматирования или что-то в этом роде?Если это так, то, вероятно, есть более эффективные способы сделать это.

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

Sub deactivate()
  Application.EnableEvents = False
  Application.ScreenUpdating = False
  Application.DisplayStatusBar = False
  Application.Calculation = xlCalculationManual
End Sub

Sub reaktiver()
  Application.EnableEvents = True
  Application.ScreenUpdating = True
  Application.DisplayStatusBar = True
  Application.Calculation = xlCalculationAutomatic
End Sub

Обратите внимание, что если вы зависите от вычислений, выполняемых во время выполнения кода, вам придется явно сделать этов то время как Application.Calculation установлен на xlCalculationManual.

Кроме того, я вижу, что вы печатали некоторые данные в строке состояния, когда ваш код работает, и если Application.DisplayStatusBar имеет значение false, это не будет отображаться.Вам придется принять решение о том, перевешивает ли отображаемая информация дополнительную скорость, которую вы получаете, установив для этого свойства значение false.

Существует множество статей о том, как оптимизировать код VBA в Интернете, для дальнейшегоинформацию о том, какие свойства может быть хорошей идеей отключить, и что она будет делать, вы можете, например, посмотреть здесь .

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