Добрый день! Имеется макрос, нужна его оптимизация. На процесоре Phenom2 X4 3,4Ггц этот макрос выполняется минут 40. В макросе копируются значения ячеек, не формулы. Обработка данных происходит на листе Подстановка, вывод даннных на лист IN. Что бы лучше понять работу макроса нужно просмотреть его работу поэтапно. Выкладываю файл RAR архив разделенный на 2 части по 90Кб. Если возможно помогите пожалуйста. Спасибо!!! [vba]
Код
Sub Подстановка() ' ' Макрос1 Макрос '
' Rem Dim tm: tm = Timer Rem Application.WindowState = xlMinimized Rem Application.ScreenUpdating = False Sheets("in").Select Cells.Select Selection.ClearContents Range("A1").Select Sheets("Подстановка").Select Rem Оптимизация макроса нужна с этого момента For i = 0 To 7000 Range("B4").Select Selection.Delete Shift:=xlToLeft Rows("4:4").Select Selection.Copy Range("A3").Select Selection.PasteSpecial Paste:=xlPasteAllUsingSourceTheme, Operation:=xlNone _ , SkipBlanks:=False, Transpose:=False Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _ :=False, Transpose:=False Range("B90:CM161").Select Application.CutCopyMode = False Selection.Copy Sheets("in").Select q = i * 72 + 2 p = i * 72 + 73 s = "c" + CStr(q) v = "cn" + CStr(p) Range(s).Select Selection.PasteSpecial Paste:=xlPasteAllUsingSourceTheme, Operation:=xlNone _ , SkipBlanks:=False, Transpose:=False Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _ :=False, Transpose:=False Range(s, (v)).Select Selection.SpecialCells(xlCellTypeConstants, 4).Select Application.CutCopyMode = False Selection.Delete Shift:=xlToLeft Sheets("Подстановка").Select Next i Rem Application.WindowState = xlMaximized Rem Application.ScreenUpdating = True Rem MsgBox Timer - tm End Sub
[/vba]
Добрый день! Имеется макрос, нужна его оптимизация. На процесоре Phenom2 X4 3,4Ггц этот макрос выполняется минут 40. В макросе копируются значения ячеек, не формулы. Обработка данных происходит на листе Подстановка, вывод даннных на лист IN. Что бы лучше понять работу макроса нужно просмотреть его работу поэтапно. Выкладываю файл RAR архив разделенный на 2 части по 90Кб. Если возможно помогите пожалуйста. Спасибо!!! [vba]
Код
Sub Подстановка() ' ' Макрос1 Макрос '
' Rem Dim tm: tm = Timer Rem Application.WindowState = xlMinimized Rem Application.ScreenUpdating = False Sheets("in").Select Cells.Select Selection.ClearContents Range("A1").Select Sheets("Подстановка").Select Rem Оптимизация макроса нужна с этого момента For i = 0 To 7000 Range("B4").Select Selection.Delete Shift:=xlToLeft Rows("4:4").Select Selection.Copy Range("A3").Select Selection.PasteSpecial Paste:=xlPasteAllUsingSourceTheme, Operation:=xlNone _ , SkipBlanks:=False, Transpose:=False Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _ :=False, Transpose:=False Range("B90:CM161").Select Application.CutCopyMode = False Selection.Copy Sheets("in").Select q = i * 72 + 2 p = i * 72 + 73 s = "c" + CStr(q) v = "cn" + CStr(p) Range(s).Select Selection.PasteSpecial Paste:=xlPasteAllUsingSourceTheme, Operation:=xlNone _ , SkipBlanks:=False, Transpose:=False Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _ :=False, Transpose:=False Range(s, (v)).Select Selection.SpecialCells(xlCellTypeConstants, 4).Select Application.CutCopyMode = False Selection.Delete Shift:=xlToLeft Sheets("Подстановка").Select Next i Rem Application.WindowState = xlMaximized Rem Application.ScreenUpdating = True Rem MsgBox Timer - tm End Sub
Sub uuu() Dim a(), b() Dim i&, ii&, j&, jj&, rw& t = Timer Application.ScreenUpdating = False 'отключаем обновление экрана Sheets("in").UsedRange.ClearContents 'чистим диапазон на листе "in" For i = 0 To 7000 'почему именно 7000 я не знаю With Sheets("Подстановка") 'работаем с листом "Подстановка" .Range("B4").Delete Shift:=xlToLeft 'удаляем ячейку со здвигом .Rows(4).Copy .Range("A3") 'копируем 4ю строку на 3ю a = .Range("B6").CurrentRegion.Value 'берём в массив диапазон B6: и до краёв непрерывной таблицы End With ReDim b(1 To 40, 1 To 90) 'перезаписываем массив b For ii = 1 To UBound(b) 'идём по строкам массива b от 1й до последней j = 0 'счётчик колонок для записи в массив b For jj = 1 To UBound(b, 2) 'проходим по колонкам массива b 'вычисляем есть ли совпадения номера 1-90 (номера колонок массива b) 'с циферками в массиве а If считанем(a, ii, jj) = False Then 'если результат "ложь" то j = j + 1 'увеличиваем счётчик колонок b(ii, j) = jj 'пишем в массив b в крайнюю слева ячейку номер колонки End If Next Next rw = i * 72 + 2 'ститаем номер строки для выгрузки массива b With Sheets("in") 'работаем с листом "in" .Cells(rw, 3).Resize(UBound(b), UBound(b, 2)) = b 'выгружаем массив на лист End With Next Application.ScreenUpdating = True 'включаем обновление экрана MsgBox Timer - t End Sub
Function считанем(a(), ii&, jj&) As Boolean Dim j& 'счётчик колонок массива a() For j = 1 To UBound(a, 2) 'проходим по всем элементам нужной строки If a(ii, j) = jj Then 'если есть совпадение то считанем = True 'функция принимает значение "истина" Exit For 'выходим из цикла End If Next End Function
Sub uuu() Dim a(), b() Dim i&, ii&, j&, jj&, rw& t = Timer Application.ScreenUpdating = False 'отключаем обновление экрана Sheets("in").UsedRange.ClearContents 'чистим диапазон на листе "in" For i = 0 To 7000 'почему именно 7000 я не знаю With Sheets("Подстановка") 'работаем с листом "Подстановка" .Range("B4").Delete Shift:=xlToLeft 'удаляем ячейку со здвигом .Rows(4).Copy .Range("A3") 'копируем 4ю строку на 3ю a = .Range("B6").CurrentRegion.Value 'берём в массив диапазон B6: и до краёв непрерывной таблицы End With ReDim b(1 To 40, 1 To 90) 'перезаписываем массив b For ii = 1 To UBound(b) 'идём по строкам массива b от 1й до последней j = 0 'счётчик колонок для записи в массив b For jj = 1 To UBound(b, 2) 'проходим по колонкам массива b 'вычисляем есть ли совпадения номера 1-90 (номера колонок массива b) 'с циферками в массиве а If считанем(a, ii, jj) = False Then 'если результат "ложь" то j = j + 1 'увеличиваем счётчик колонок b(ii, j) = jj 'пишем в массив b в крайнюю слева ячейку номер колонки End If Next Next rw = i * 72 + 2 'ститаем номер строки для выгрузки массива b With Sheets("in") 'работаем с листом "in" .Cells(rw, 3).Resize(UBound(b), UBound(b, 2)) = b 'выгружаем массив на лист End With Next Application.ScreenUpdating = True 'включаем обновление экрана MsgBox Timer - t End Sub
Function считанем(a(), ii&, jj&) As Boolean Dim j& 'счётчик колонок массива a() For j = 1 To UBound(a, 2) 'проходим по всем элементам нужной строки If a(ii, j) = jj Then 'если есть совпадение то считанем = True 'функция принимает значение "истина" Exit For 'выходим из цикла End If Next End Function
Mishael s, этот макрос, это один из макросов по (наиболее трудоемкий) промежуточной обработке данных числовой лотереи для последующего прогнозирования чисел (пытаюсь шото сотворить). Большое спасибо Wild_Pig за оптимизацию макроса, стало быстрее в 3,3 раза.
Mishael s, этот макрос, это один из макросов по (наиболее трудоемкий) промежуточной обработке данных числовой лотереи для последующего прогнозирования чисел (пытаюсь шото сотворить). Большое спасибо Wild_Pig за оптимизацию макроса, стало быстрее в 3,3 раза.djon2012
Уважаемый Wild_Pig на примере который Вы оптимизировали у меня отрабатывает за 350 с, у Вас 180 с. Пример который я выложил не отображал полного обьема обрабатываемых данных, пришлось кое где подкоректировать Ваш оптимизированный макрос. Так вот неоптимизированный макрос у меня выполнялся приблизительно 40 минут, оптимизированный 12 минут. Разница по времени выполнения макроса может быть связана с процессором. У меня AMD Phenom2 X4 965 3,4 Ггц. На процессорах Intel обработка идет быстрее. У моего знакомого на процессоре Intel Core I7 4770 3,5 Ггц я запускал неоптимизированный макрос, время его выполнения составило приблизительно 15 минут против моих 40.
Уважаемый Wild_Pig на примере который Вы оптимизировали у меня отрабатывает за 350 с, у Вас 180 с. Пример который я выложил не отображал полного обьема обрабатываемых данных, пришлось кое где подкоректировать Ваш оптимизированный макрос. Так вот неоптимизированный макрос у меня выполнялся приблизительно 40 минут, оптимизированный 12 минут. Разница по времени выполнения макроса может быть связана с процессором. У меня AMD Phenom2 X4 965 3,4 Ггц. На процессорах Intel обработка идет быстрее. У моего знакомого на процессоре Intel Core I7 4770 3,5 Ггц я запускал неоптимизированный макрос, время его выполнения составило приблизительно 15 минут против моих 40.djon2012