2015-01-29 3 views
0

У меня возникли проблемы при запуске следующих кодов. В основном идея состоит в сортировке списка и копировании уникальных записей на другой лист. Но из-за большого количества записей (160000 строк). Мой код всегда висел и не мог остановить вычисление.Как оптимизировать производительность кода VBA?

Columns("A:A").Insert Shift:=xlToRight 
Range("A1").Value = "Reference2" 
Range("A2").Formula = "=B2&F2&N2" 
Range("A2").AutoFill Destination:=Range("A2:A160000") 

Range("N1").Value = "Day" 

Range("N2").Formula = "=DAY(G2)" 
Range("N2").AutoFill Destination:=Range("N2:N160000") 

Columns("A:N").Select 
Selection.Sort Key1:=Range("N2"), Order1:=xlAscending, Header:=xlGuess, _ 
OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom, _ 
DataOption1:=xlSortNormal 

Columns("A:N").Select 
Selection.Sort Key1:=Range("F2"), Order1:=xlAscending, Header:=xlGuess, _ 
OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom, _ 
DataOption1:=xlSortNormal 

Columns("A:N").Select 
Selection.Sort Key1:=Range("B2"), Order1:=xlAscending, Header:=xlGuess, _ 
OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom, _ 
DataOption1:=xlSortNormal 


Sheets("Fairbanks Data").Range("A1:N" & Range("B1").End(xlDown).Row).Select 
Selection.Copy 

Sheets("Fairbanks Data(Edited)").Cells(Rows.Count, "A").End(xlUp).PasteSpecial xlPasteValues 
'my code always stopped at here and did the calculation 

Sheets("Fairbanks Data").Delete 

Sheets("Fairbanks Data(Edited)").Range("A1:A160000").AdvancedFilter  Action:=xlFilterCopy, CopyToRange:=Sheets("Step1Raw").Range("A2"), Unique:=True 

Является ли это каким-либо образом, я могу улучшить скорость? Спасибо за ваше время!

ответ

2

Существует несколько правил для VBA с тем, что вы можете сделать свой код быстрее.


Правило № 1. Не копировать и вставлять

Копии и вставка (или PasteSpecial) работают медленно. Это примерно в 25 раз быстрее использовать следующие для копирования и вставки значений.

Range("A1:Z100").value = Range("A101:Z200").value 

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


Правило № 2. Расчет

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

Application.Calculation = xlCalculationManual 

В конце кода, вы можете установить режим расчета обратно в автоматический режим с утверждением:

Application.Calculation = xlCalculationAutomatic 

Помните, что хотя , что когда режим вычисления равен xlCalculationManual, Excel не обновляет значения в ячейках. Если ваш макрос полагается на обновленное значение ячейки, вы должны принудительно выполнить событие Calculate с помощью метода .Calculate, например Worksheets(1).Calculate.


Правило № 3. ScreenUpdating

Другая проблема скорости с VBA - каждый раз, когда VBA записывает данные на рабочий лист, он обновляет отображаемое на экране изображение. Обновление изображения является значительным перетащить на производительность. Следующая команда отключает обновления экрана.

Application.ScreenUpdating = FALSE 

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

Application.ScreenUpdating = TRUE 
1

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

' 01. 
Sub deaktiver() 
    Application.EnableEvents = False 
    Application.ScreenUpdating = False 
    Application.DisplayStatusBar = False 
    Application.Calculation = xlCalculationManual 
    ' ActiveSheet.DisplayPageBreaks = True 'note this is a sheet-level setting 
End Sub 
' 02. 
Sub reaktiver() 
    Application.EnableEvents = True 
    Application.ScreenUpdating = True 
    Application.DisplayStatusBar = True 
    Application.Calculation = xlCalculationAutomatic 
    ' ActiveSheet.DisplayPageBreaks = True 'note this is a sheet-level setting 
End Sub 

Очевидно, что вы должны знать, что различные настройки сделать, так как некоторые из параметров позволит предотвратить расчеты произойти события или стрелять, как описано выше Moosli.

Больше всего (всего?) От того, что находится в коде выше, я нашел here, что также включает в себя несколько других способов сделать ваш код более эффективным.

Смежные вопросы