Доброго дня всем Есть некоторый макрос, который сравнивает 3 различных диапазона в двух книгах и если значения совпадают выполняет перенос значений ячеек из одной книги в другую. Но суть не в этом. Прикрутил я к макросу userform для удобства отображения хода выполнения задачи. Целый progressbar мне не нужен, поэтому процесс выполнения отображается по типу "выполнено Х/из всего У". Перед началом работы макрос отключает обновление экрана и авторасчёт формул. Но почему-то окошко userform и всё окно excel виснет через некоторое время после начала работы макроса и вся красота с отображением процесса работы не работает При этом макрос продолжает выполняться и через некоторое время корректно выполняет задачу и завершается с отвисанием окон. Работает всё это на excel 2007.
Маленькая гифка с моей userform
На картинке видно, как в заголовке окна userform появляется приписка "(Не отвечает)" и прогресс перестаёт отображаться.
Что можно сделать что бы окна userform и excel не зависали и процесс работы продолжал показываться до завершения макроса? Самое очевидное, как я понимаю, либо как-то облегчить макрос, либо апгрейд железа? Но может есть другие варианты и можно как-то где-то поковыряться в настройках чего-то?
Я использую вывод прогресса в прогрессбар (в левом нижнем углу) — по 10%. Перед выводом нужно включить обновление экрана, вывести, потом сделать DoEvents и после этого вернуть обновление экрана
Пользуйтесь на здоровье
Код
'====================================================================================================
' пример вызова
Sub Test()
Dim a&, all&
Application.ScreenUpdating = False
all = 1000000
For a = 1 To all
PRDX_StatusBar a, all
Next a
Application.ScreenUpdating = True
Application.StatusBar = False
End Sub
'====================================================================================================
Sub PRDX_StatusBar(ByVal sCur#, ByVal sTotal#, Optional ByVal Msg$ = "Progress")
Dim procCur#, ASU As Boolean
Static sPrev#
procCur = Round(sCur / sTotal, 1): If sPrev = procCur Then Exit Sub
ASU = Application.ScreenUpdating: Application.ScreenUpdating = True
sPrev = procCur: Application.StatusBar = Msg & ": " & Format$(procCur, "0%"): DoEvents
Application.ScreenUpdating = ASU
End Sub
'====================================================================================================
Наверное, с формой, тоже что-то похожее нужно делать…
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
Jack Famous, спасибо за ответ! Видится мне, что с самим макросом у меня всё ок. Об этом говорит то, что вначале всё отображается корректно, а в коде макроса после 16 итерации следует точно такая же 17-ая (обычный цикл For...Next), и ничего в тексте макроса не меняется, что могло бы как-то объяснить подвисание. При этом виснет не всегда после 16, это зависит от того, по каким книгам сейчас работает макрос. В процессе выполнения книги, опять же, не меняются.
Цитата
потом сделать DoEvents
Обновляю userform с помощью UserForm.Repaint
Цитата
Читайте статью ОТОБРАЗИТЬ ПРОЦЕСС ВЫПОЛНЕНИЯ
Эту статью читал и выводить прогресс в statusbar пробовал, результат тот же, через некоторое время после начала работы макроса значения прогресса перестают обновляться.
kenigfinn: через некоторое время после начала работы макроса значения прогресса перестают обновляться
значит не включаете обновление перед выводом и/или не делаете DoEvents. Мою процедуру попробуйте.
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄