2016-07-26 3 views
0

У меня есть сценарий VBA, который копирует данные из строк в лист SoapUI - Single в лист STpremcalc, а затем копирует окончательный расчет до SoapUI - Single. Он работает нормально, но у меня есть 10000 строк данных, и для выполнения одной строки требуется около 30 секунд. Когда я проверил его с 1000 строк, он закончил в течение минуты.Excel VBA: Есть ли способ сделать это более эффективным?

Что вызывает это? Это потому, что скрипт VBA читает весь рабочий лист раньше, если копирует значения.

Sub SingleRating() 
Dim i As Long 
Dim iteration As Variant 
Dim seleciton As Variant 
Dim ws1 As Worksheet, ws2 As Worksheet 
Set ws1 = Worksheets("SoapUI - Single") 
Set ws2 = Worksheets("STpremcalc") 

iteration = 0 
iteration = InputBox("Please Select Row Iteration", "", "1000") 
seleciton = iteration + 2 

    For i = 3 To seleciton 
     ws2.Range("B3").Value = ws1.Range("B" & i).Value 

     ws2.Range("B4").Value = ws1.Range("C" & i).Value 

     ws2.Range("B5").Value = ws1.Range("D" & i).Value 

     ws2.Range("B6").Value = ws1.Range("E" & i).Value 

     ws2.Range("E3").Value = ws1.Range("F" & i).Value 

     ws2.Range("E4").Value = ws1.Range("G" & i).Value 

     ws2.Range("E5").Value = ws1.Range("H" & i).Value 

     ws2.Range("E6").Value = ws1.Range("I" & i).Value 

     ws2.Range("G3").Value = ws1.Range("J" & i).Value 

     ws2.Range("G4").Value = ws1.Range("K" & i).Value 

     ws2.Range("G5").Value = ws1.Range("L" & i).Value 

     ws2.Range("J3").Value = ws1.Range("N" & i).Value 

     ws2.Range("J4").Value = ws1.Range("O" & i).Value 

     ws2.Range("J6").Value = ws1.Range("P" & i).Value 

     ws2.Range("B9:E9").Value = ws1.Range("Q" & i, "T" & i).Value 

     ws2.Range("B10:E10").Value = ws1.Range("U" & i, "X" & i).Value 

     ws2.Range("B11:E11").Value = ws1.Range("Y" & i, "AB" & i).Value 

     ws2.Range("B12:E12").Value = ws1.Range("AC" & i, "AF" & i).Value 

     ws2.Range("B13:E13").Value = ws1.Range("AG" & i, "AJ" & i).Value 

     ws2.Range("B14:E14").Value = ws1.Range("AK" & i, "AN" & i).Value 

     ws2.Range("B15:E15").Value = ws1.Range("AO" & i, "AR" & i).Value 

     ws2.Range("B16:E16").Value = ws1.Range("AS" & i, "AV" & i).Value 

     ''''''''''''''''''''''''''''''''''''''''''''''''' 
     ws1.Range("AW" & i).Value = ws2.Range("M4").Value 

     ws1.Range("AX" & i).Value = ws2.Range("M5").Value 

     ws1.Range("AY" & i).Value = ws2.Range("M6").Value 

     Application.StatusBar = "Current iteration: " & (i - 2) & "/" & iteration 
    Next i 
End Sub 
+5

Поскольку это _working code_, это отличный кандидат для [CodeReview.SE] (https://codereview.stackexchange.com/). – FreeMan

+0

Вам нужно * скопировать данные взад и вперед? Запись данных, безусловно, вредит вашему времени выполнения. Похоже, что ячейки STpremcalc! M4: M6 выполняют вычисления, основанные на значениях на листе, и что все, что вам действительно нужно, это вывод этих ячеек. Если вы можете вычислить расчет, который они выполняете, и передать его для запуска в VBA вместо выполнения на листе, вы получите некоторые хорошие ускорения, пропустив большинство манипуляций с данными. – Mikegrann

+0

@ Mikegrann В листе расчета имеется около 100 - 150 различных вычислений, чтобы прийти к окончательному числу. так что потребуется некоторое время, чтобы настроить его. Я думал, что это будет быстрее, поскольку формулы уже установлены. – Ross

ответ

3

Если это весь ваш код, который я предложил бы вставить это сразу после инициализации переменные:

screenUpdateState = Application.ScreenUpdating 

statusBarState = Application.DisplayStatusBar 

calcState = Application.Calculation 

eventsState = Application.EnableEvents 

Application.ScreenUpdating = False 

Application.DisplayStatusBar = False 

Application.Calculation = xlCalculationManual 

Application.EnableEvents = False 

В самом конце кода (выше End Sub) повернуть его вспять:

Application.ScreenUpdating = screenUpdateState 

Application.DisplayStatusBar = statusBarState 

Application.Calculation = calcState 

Application.EnableEvents = eventsState 

Из моего опыта, особенно, элемент ScreenUpdating дает значительное повышение производительности при копировании/вставке строк. Если у вас по-прежнему возникают проблемы с производительностью после его отключения, нам нужно посмотреть на реализацию.

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

+0

Я получаю одинаковые значения для всех строк? – Ross

+0

Вы должны. Режим ручного расчета может привести к разнице в зависимости от точной настройки ваших книг. Я бы предложил попробовать все параметры, а затем проверить, являются ли значения такими же, как и раньше (в Excel это нужно сделать довольно быстро). Если значения отличаются, попробуйте выбросить параметр Application.Calculation. – daZza