Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Microsoft Office и VBA программирование > Microsoft Office Excel
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 10.08.2011, 12:43   #1
Sotrom
Новичок
Джуниор
 
Регистрация: 10.08.2011
Сообщений: 7
По умолчанию Медленный макрос

Господа! Подскажите, пожалуйста, начинающему как ускорить выполнение макроса. Работает очень медленно, более 30 минут уходит на его выполнение.

Код:
Sub Monte_Karlo()
'
' Monte_Karlo Макрос

MasageOK_NO = MsgBox("Сейчас начнется расчет 5000 значений выбранных показателей модели методом Монте-Карло. На расчет потребуется несколько минут. Продолжить?", vbYesNo, "МОНТЕ-КАРЛО")
If MasageOK_NO = 7 Then GoTo Конец
Application.ScreenUpdating = False
Dim x As Variant
For x = 20 To 5019
Range(Cells(x, 2), Cells(x, 7)).Select
Selection.Copy
Range("B19").Select
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
        :=False, Transpose:=False
Range("H19").Select
    Application.CutCopyMode = False
    Selection.Copy
Range(Cells(x, 8), Cells(x, 8)).Select
    Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
        :=False, Transpose:=False
Range("I19").Select
    Application.CutCopyMode = False
    Selection.Copy
Range(Cells(x, 9), Cells(x, 9)).Select
    Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
        :=False, Transpose:=False
Next x
Range("B19").Select
    Application.CutCopyMode = False
    ActiveCell.FormulaR1C1 = "1"
    Range("C19").Select
    ActiveCell.FormulaR1C1 = "1"
    Range("D19").Select
    ActiveCell.FormulaR1C1 = "1"
    Range("E19").Select
    ActiveCell.FormulaR1C1 = "1"
    Range("F19").Select
    ActiveCell.FormulaR1C1 = "1"
    Range("G19").Select
    ActiveCell.FormulaR1C1 = "1"
Конец_расчета:
    MsgBox "Расчет окончен!"
Application.ScreenUpdating = True
Exit Sub
Конец:
MsgBox "Расчет прерван", , "МОНТЕ-КАРЛО"

End Sub

Последний раз редактировалось Sotrom; 10.08.2011 в 13:31.
Sotrom вне форума Ответить с цитированием
Старый 10.08.2011, 12:56   #2
Hugo121
Старожил
 
Регистрация: 11.05.2010
Сообщений: 5,166
По умолчанию

Секунда:

Код:
Sub Monte_Karlo2()
'
' Monte_Karlo Макрос

MasageOK_NO = MsgBox("Сейчас начнется расчет 5000 значений выбранных показателей модели методом Монте-Карло. На расчет потребуется несколько минут. Продолжить?", vbYesNo, "МОНТЕ-КАРЛО")
If MasageOK_NO = 7 Then GoTo Конец
Application.ScreenUpdating = False
Dim x As Variant
'Dim t: t = Timer
For x = 20 To 5019
Range("B19") = Range(Cells(x, 2), Cells(x, 7))
Cells(x, 8) = Range("H19")
Range(Cells(x, 9), Cells(x, 9)) = Range("I19")
Next x
[b19:g19] = 1
Конец_расчета:
'Debug.Print Timer - t
MsgBox "Расчет окончен!"
Application.ScreenUpdating = True
Exit Sub
Конец:
MsgBox "Расчет прерван", , "МОНТЕ-КАРЛО"

End Sub
Но у Вас вероятно ещё тормозит из-за пересчёта других формул, которые всё и считают.
webmoney: E265281470651 Z422237915069 R418926282008

Последний раз редактировалось Hugo121; 10.08.2011 в 13:00.
Hugo121 вне форума Ответить с цитированием
Старый 10.08.2011, 13:31   #3
Sotrom
Новичок
Джуниор
 
Регистрация: 10.08.2011
Сообщений: 7
По умолчанию

-> Hugo121
Спасибо за отклик, но что-то не то с Вашим кодом. Проверил, он делает немного не то, что был у меня
Sotrom вне форума Ответить с цитированием
Старый 10.08.2011, 13:33   #4
Hugo121
Старожил
 
Регистрация: 11.05.2010
Сообщений: 5,166
По умолчанию

Ну он ячейки не выделяет
А так вроде то-же должен делать.
Но это конечно на рабочем файле нужно смотреть, у меня его нет.
webmoney: E265281470651 Z422237915069 R418926282008
Hugo121 вне форума Ответить с цитированием
Старый 10.08.2011, 13:42   #5
RAN.
Форумчанин
 
Аватар для RAN.
 
Регистрация: 05.07.2011
Сообщений: 208
По умолчанию

Исправьте
Range("B19").Resize(, 6) = Range(Cells(x, 2), Cells(x, 7))
RAN. вне форума Ответить с цитированием
Старый 10.08.2011, 13:45   #6
Hugo121
Старожил
 
Регистрация: 11.05.2010
Сообщений: 5,166
По умолчанию

Да, точно, спасибо, упустил:
Код:
For x = 20 To 5019
Range("B19").Resize(, 6) = Range(Cells(x, 2), Cells(x, 7))
Cells(x, 8) = Range("H19")
Cells(x, 9) = Range("I19")
Next x
Хотя и тут ещё есть что сократить
webmoney: E265281470651 Z422237915069 R418926282008
Hugo121 вне форума Ответить с цитированием
Старый 10.08.2011, 13:45   #7
IgorGO
Новичок
СтарожилДжуниор
 
Аватар для IgorGO
 
Регистрация: 05.02.2008
Сообщений: 9,487
По умолчанию

а так подходит:
Цитата:
Sub Monte_Karlo2()
'
' Monte_Karlo Макрос

MasageOK_NO = MsgBox("Сейчас начнется расчет 5000 значений выбранных показателей модели методом Монте-Карло. На расчет потребуется несколько минут. Продолжить?", vbYesNo, "МОНТЕ-КАРЛО")
If MasageOK_NO = 7 Then GoTo Конец
Application.ScreenUpdating = False
Dim x As Variant
'Dim t: t = Timer
For x = 20 To 5019
Range(Cells(x, 2), Cells(x, 7)).copy
[B19].PasteSpecial Paste:=xlPasteValues
Cells(x, 8) = [H19]
Cells(x, 9) = [I19]
Next x
[b19:g19] = 1
Конец_расчета:
'Debug.Print Timer - t
MsgBox "Расчет окончен!"
Application.ScreenUpdating = True
Exit Sub
Конец:
MsgBox "Расчет прерван", , "МОНТЕ-КАРЛО"
End Sub
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете
IgorGO вне форума Ответить с цитированием
Старый 10.08.2011, 14:48   #8
Sotrom
Новичок
Джуниор
 
Регистрация: 10.08.2011
Сообщений: 7
По умолчанию

->Hugo121
Не работает. Все искомые значения, которые запоминаются, получаются одинаковыми.

Привожу в двух словах как должно работать.
Есть 8 столбцов. Из них 6 первых столбцов это переменные, и еще 2 - это значения которые ищем.
Первая строчка (ячейки B19-I19) представляет собой:

1 1 1 1 1 1 25 150

25 и 150 это искомые значения.

Далее цикл:
Значения случайных числе (которые я заранее сгенерировал) из ячеек В20 - G20 подставляются в ячейки, где сейчас единички (B19 - G19). Искомые значения пересчитываются (завязаны на весь расчетный файл) и их значения из ячеек H19 и I19 копируются в сроку 20, т.е. в H20 и I20.
Далее цикл повторяется. Из сроки 21 значения попадают в 19 сроку, а искомые значения из 19 сроки попадают в 21 строку и т.д. 5000 раз.

В конце в ячейках B19-G19 подставляются значения с 1, чтобы вернуть файл в исходное состояние. Но это у всех получилось

->IgorGo
Ваш код почти работает, но значения периодически смещаются с нужной строчки... Не понимаю почему. Только он не столь компактен как у Hugo121
Sotrom вне форума Ответить с цитированием
Старый 10.08.2011, 15:00   #9
Sotrom
Новичок
Джуниор
 
Регистрация: 10.08.2011
Сообщений: 7
По умолчанию

Hugo121 прав, что вероятнее всего макрос тормозит из за всего файла... Там расчет делается по нескольким десяткам тысяч ячеек.
Но очень хочется, чтобы сам код не выполнял функцию "бутылочного горлышка".
Sotrom вне форума Ответить с цитированием
Старый 10.08.2011, 16:02   #10
Hugo121
Старожил
 
Регистрация: 11.05.2010
Сообщений: 5,166
По умолчанию

Нда, так и есть, без примера код писать...
Первое копирование так идёт, через массив, иначе (и через Resize тоже) не работает:

Dim a
...
For x = 20 To 5019
a = Range(Cells(x, 2), Cells(x, 7))
[B19:G19] = a

Можно было ещё приравнивать ячейки по-одной, благо их немного...
Ну а торомоза из-за формул, этот код за секунду отрабатывает.
webmoney: E265281470651 Z422237915069 R418926282008
Hugo121 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Макрос постоянно обрабатывает события. При открытии другой книги макрос обрывается. Ples Microsoft Office Excel 8 17.12.2016 18:15
Медленный выход приложения (многопоточность) YarUnderoaker Общие вопросы Delphi 1 15.10.2010 16:57
Exel - при открытии файла через макрос, если файл отсутствует - виснет весь макрос gregory1b Microsoft Office Excel 2 14.10.2010 11:51
Макрос, запускающий макрос из другого закрытого файла petruha Microsoft Office Excel 7 14.03.2010 11:31
Макрос вставки файлов в листы-Необходимо изменить ниже приведённый макрос as-is Microsoft Office Excel 4 25.02.2010 07:51