Доброго дня. Для визуализации процесса обработки добавил код вызывающий юзерформу и отображающий своеобразный статус бар. Иногда это отрабатывает отлично, а иногда вроде "зависает", но процесс идет все равно (всё ищется, считается и складывается) Пример зависания:
Код визуализации:
[vba]
Код
Dim RabRowMin As Long Dim iPic&, a#, w# RabRowMin = RabRow - 1 a = 242 / (RabLsRow - RabRowMin) '242 - максимальная ширина прогресса Waiting.Image1.Width = 0 Waiting.Label2.Caption = "0%" Waiting.Show 0
For ir = RabRow To RabLsRow iPic = (ir - RabRowMin) / (RabLsRow - RabRowMin) * 100 Сам ЦИКЛ w = a + w Waiting.Image1.Width = w Waiting.Label2.Caption = CStr(Application.Round(iPic, 0) & "%") Waiting.Repaint Next ir Unload Waiting
[/vba]
Как нибудь можно это исправить?
PS Опечатку в окошке исправил
Доброго дня. Для визуализации процесса обработки добавил код вызывающий юзерформу и отображающий своеобразный статус бар. Иногда это отрабатывает отлично, а иногда вроде "зависает", но процесс идет все равно (всё ищется, считается и складывается) Пример зависания:
Код визуализации:
[vba]
Код
Dim RabRowMin As Long Dim iPic&, a#, w# RabRowMin = RabRow - 1 a = 242 / (RabLsRow - RabRowMin) '242 - максимальная ширина прогресса Waiting.Image1.Width = 0 Waiting.Label2.Caption = "0%" Waiting.Show 0
For ir = RabRow To RabLsRow iPic = (ir - RabRowMin) / (RabLsRow - RabRowMin) * 100 Сам ЦИКЛ w = a + w Waiting.Image1.Width = w Waiting.Label2.Caption = CStr(Application.Round(iPic, 0) & "%") Waiting.Repaint Next ir Unload Waiting
Попробуйте вместо формы выводить состояние процесса в Application.StatusBar А по окончании восстанавливайте нормальный статусбар командой Application.StatusBar = False
Попробуйте вместо формы выводить состояние процесса в Application.StatusBar А по окончании восстанавливайте нормальный статусбар командой Application.StatusBar = FalseAlex_ST
Alex_ST, Спасибо, за совет. Попробовал, провел небольшой опрос. в статус бар вообще никто не смотрит (из 5 чел 0) - это во первых, а во вторых, опять же при избранных запросах произошла такая же ерунда, что вроде завис, но не завис. Но статус бар оставил), дублирую и в нем ход работы.
Думал возможно как-то "замедлить", пусть это будет на пару секунд дольше, но из-за постоянного изменения на экране картинки, пользователь не будет думать, что всё повисло.
Alex_ST, Спасибо, за совет. Попробовал, провел небольшой опрос. в статус бар вообще никто не смотрит (из 5 чел 0) - это во первых, а во вторых, опять же при избранных запросах произошла такая же ерунда, что вроде завис, но не завис. Но статус бар оставил), дублирую и в нем ход работы.
Думал возможно как-то "замедлить", пусть это будет на пару секунд дольше, но из-за постоянного изменения на экране картинки, пользователь не будет думать, что всё повисло.TD_MElec
К стати, а Вы ускорители в коде перед началом циклов используете? Перед началом расчёта запретите все тормозящие события:[vba]
Код
With Application: .ScreenUpdating = False: .DisplayAlerts = False: .EnableEvents = False: .Calculation = xlManual: End With
[/vba] а после окончания опять их разрешите:[vba]
Код
With Application: .EnableEvents = True: .DisplayAlerts = True: .ScreenUpdating = True: .Calculation = xlAutomatic: End With
[/vba] У Вас, возможно, именно вывод на форму тормозит. А в статусбаре информация отображается несмотря на Application.ScreenUpdating = False Попробуйте включить таймер и один и тот же массив данных обработать своим ЦИКЛом с выводом прогресса на форму и без него.
К стати, а Вы ускорители в коде перед началом циклов используете? Перед началом расчёта запретите все тормозящие события:[vba]
Код
With Application: .ScreenUpdating = False: .DisplayAlerts = False: .EnableEvents = False: .Calculation = xlManual: End With
[/vba] а после окончания опять их разрешите:[vba]
Код
With Application: .EnableEvents = True: .DisplayAlerts = True: .ScreenUpdating = True: .Calculation = xlAutomatic: End With
[/vba] У Вас, возможно, именно вывод на форму тормозит. А в статусбаре информация отображается несмотря на Application.ScreenUpdating = False Попробуйте включить таймер и один и тот же массив данных обработать своим ЦИКЛом с выводом прогресса на форму и без него.Alex_ST
С уважением, Алексей MS Excel 2003 - the best!!!
Сообщение отредактировал Alex_ST - Вторник, 27.10.2020, 22:21
И, к стати, для тех, кто не смотрит в статусбар, можно просто скрывать в начале цикла рабочий лист и вместо него показывать лист-"транспарант" с крупной надписью типа "Идёт обработка данных. Подождите, пожалуйста. Прогресс процесса показан в статусбаре внизу экрана"
И, к стати, для тех, кто не смотрит в статусбар, можно просто скрывать в начале цикла рабочий лист и вместо него показывать лист-"транспарант" с крупной надписью типа "Идёт обработка данных. Подождите, пожалуйста. Прогресс процесса показан в статусбаре внизу экрана"Alex_ST
TD_MElec, Функция DoEvents передает управление операционной системе. Управление возвращается, когда операционная система завершает обработку событий в очереди
TD_MElec, Функция DoEvents передает управление операционной системе. Управление возвращается, когда операционная система завершает обработку событий в очередиboa
Спасибо всем. Изменил цикл с перебора на матч. Раньше каждая из 250 срок бегала по массиву в 50 000 тыс строк и это занимало около 42,5 сек. (с тем самым подвисанием после 23 - 25 секунд, что на скриншоте) . Теперь весь цикл укладывается в о,8 секунды. Окно визуализации не успевает открыться :-(, а оно мне так нравилось...
Спасибо всем. Изменил цикл с перебора на матч. Раньше каждая из 250 срок бегала по массиву в 50 000 тыс строк и это занимало около 42,5 сек. (с тем самым подвисанием после 23 - 25 секунд, что на скриншоте) . Теперь весь цикл укладывается в о,8 секунды. Окно визуализации не успевает открыться :-(, а оно мне так нравилось...TD_MElec