Всем привет. Осваивая VBA, столкнулся с новой задачей: как сделать паузу в выполнении макроса с ожиданием действия пользователя. Нашел в справке команду OpenForms = DoEvents. Можно подробней про нее. А то у меня справка английская, а скаченные русские не открываются.
Всем привет. Осваивая VBA, столкнулся с новой задачей: как сделать паузу в выполнении макроса с ожиданием действия пользователя. Нашел в справке команду OpenForms = DoEvents. Можно подробней про нее. А то у меня справка английская, а скаченные русские не открываются.light26
Я не волшебник. Я только учусь
Сообщение отредактировал light26 - Воскресенье, 02.09.2012, 11:10
А что толку-то? Я знаю про переводчики. Только как мне в поиске набрать то, что мне нужно? В данном случае я набирал Pause. Но не факт, что я поисковой запрос сделал правильно.
Quote (nerv)
http://translate.google.ru
А что толку-то? Я знаю про переводчики. Только как мне в поиске набрать то, что мне нужно? В данном случае я набирал Pause. Но не факт, что я поисковой запрос сделал правильно.light26
если в примеру: с перво попробуйте этот код, после запуска сразу же выделите любую ячейку и любую значение вводите в ячейку
[vba]
Code
Sub www() Dim I, OpenForms For I = 1 To 65000 Cells(I, 1) = I Application.StatusBar = I 'If I >= 10000 Then OpenForms = DoEvents 'End If Next I End Sub
[/vba]
во вторых точьно так же, как пробовали в первом, увидите разницу
[vba]
Code
Sub wwww() Dim I For I = 1 To 65000 Cells(I, 1) = I Application.StatusBar = I Next End Sub
[/vba]
если в примеру: с перво попробуйте этот код, после запуска сразу же выделите любую ячейку и любую значение вводите в ячейку
[vba]
Code
Sub www() Dim I, OpenForms For I = 1 To 65000 Cells(I, 1) = I Application.StatusBar = I 'If I >= 10000 Then OpenForms = DoEvents 'End If Next I End Sub
[/vba]
во вторых точьно так же, как пробовали в первом, увидите разницу
[vba]
Code
Sub wwww() Dim I For I = 1 To 65000 Cells(I, 1) = I Application.StatusBar = I Next End Sub
Как я понял DoEvents приостанавливает макрос и даёт выполниться другим процессам. Это позволяет например не дать макросу повиснуть если что-то пошло не так. Посему полезно наверно включить в долгие циклы. Впрочем поигравшись с кодом выше - заполнением ячеек, обнаружил, что Doevents замедляет макрос.
Но залез я на форум чтобы рассказать как мне удалось ускорить свою программу благодаря DoEvents. Программа из двух табличек в экселе делает документ ворд. В одном файле обрабатывалось 300 строк в другом 5000 и в итоге получалось примерно 900 листов ворда. Сначала я сделал - лишь бы работало. Потом поизбавлялся от разных Select Selections выключил проверку орфографии и прочее. Это ускорило макрос значительно. Но всё равно итоговый вариант работал примерно 45-50секунд. Потом я решил прикрутить прогресс бар, чтобы пользователь видел что макрос работает, что ничего не зависло и смотрел как медленно заполняется зелёная полоска. В итоге прогресс баров получилось аж 3 штуки. Так как в коде три больших цикла. Но самое главное что макрос стал работать быстрее! Примерно на 10-15 секунд. Сейчас программа работает где-то 30 секунд если выключить все фоновые проги. И помог в этом ускорении именно DoEvents. Вот кусок кода как пример:
[vba]
Код
DocEnd = .Range.End - 1 .Range(DocEnd, DocEnd).InsertBreak Type:=wdSectionBreakNextPage .Sections.First.Range.Copy For i = 1 To UBound(dom_adres_sum_arr2, 2) - 1 'на одну копию меньше, отнимаем 1 DocEnd = .Range.End - 1 .Range(DocEnd, DocEnd).PasteAndFormat (wdFormatOriginalFormatting)
Как я понял DoEvents приостанавливает макрос и даёт выполниться другим процессам. Это позволяет например не дать макросу повиснуть если что-то пошло не так. Посему полезно наверно включить в долгие циклы. Впрочем поигравшись с кодом выше - заполнением ячеек, обнаружил, что Doevents замедляет макрос.
Но залез я на форум чтобы рассказать как мне удалось ускорить свою программу благодаря DoEvents. Программа из двух табличек в экселе делает документ ворд. В одном файле обрабатывалось 300 строк в другом 5000 и в итоге получалось примерно 900 листов ворда. Сначала я сделал - лишь бы работало. Потом поизбавлялся от разных Select Selections выключил проверку орфографии и прочее. Это ускорило макрос значительно. Но всё равно итоговый вариант работал примерно 45-50секунд. Потом я решил прикрутить прогресс бар, чтобы пользователь видел что макрос работает, что ничего не зависло и смотрел как медленно заполняется зелёная полоска. В итоге прогресс баров получилось аж 3 штуки. Так как в коде три больших цикла. Но самое главное что макрос стал работать быстрее! Примерно на 10-15 секунд. Сейчас программа работает где-то 30 секунд если выключить все фоновые проги. И помог в этом ускорении именно DoEvents. Вот кусок кода как пример:
[vba]
Код
DocEnd = .Range.End - 1 .Range(DocEnd, DocEnd).InsertBreak Type:=wdSectionBreakNextPage .Sections.First.Range.Copy For i = 1 To UBound(dom_adres_sum_arr2, 2) - 1 'на одну копию меньше, отнимаем 1 DocEnd = .Range.End - 1 .Range(DocEnd, DocEnd).PasteAndFormat (wdFormatOriginalFormatting)