Страницы: 1
RSS
Происходит зависание макроса без возможности выхода
 
Какое-то время назад (около года, наверное) моя большая программа с вызовом нескольких подпрограмм вдруг стала зависать непредсказуемым образом.
Ситуации следующие:
1. Делаю обращение к данным с какого-то сайта для последующего парсинга. При этом зависает в момент формирования страницы по команде
browser.navigate pageaddr
При этом попытка установить таймер на время обработки не всегда помогает. Будто бы прямо сразу зависает.
2. Другая ситуация. В программе при изменении кода появляется ошибка. При появлении ошибки возникает окошко с текстом ошибки, но нет возможности перейти к дебагу, т.к. программа уже зависла.
3. Нахожусь в редакторе VBE. Может и при этом произойти зависание.

При этом комп начинает тарахтеть, отжирая для Excel от 20 до 30% ресурсов ЦП.
Во всех этих случаях единственный способ - остановка приложения через диспетчер задач с последующим перезапуском. Во 2-м случае обычно появляется возможность всё-таки после перезагрузки добраться до окна отладки. Но не надолго. При этом приходится почти после каждого исправления программы делать save.
Сразу скажу, что ресурс программа отжирает прилично из-за больших многомерных массивов и больших загружаемых файлов с данными (больше 100Мб - 50000 строк на 1000 столбцов).

Пытаюсь понять, в какую сторону двигаться для решения ситуации: сокращение размера файлов или какие-то настройки могут помочь?
 
Удалил примерно 150 тысяч уже не нужных формул. Ситуация не решилась.
Может быть есть какой-то параметр, кроме Приоритета в диспетчере задач, который может влиять на выделяемый ресурс памяти? Памяти, кстати, при зависании используется не такой большой процент.
Вот если бы можно было через какое-то приложение или надстройку посмотреть, в какой момент происходит изменение какого-то параметра до критического уровня.
 
Основная причина нашлась. Не все браузеры закрывались после выполнения.

browser.quit
browser = Nothing

решило проблему.
Изменено: Anders-8 - 01.04.2025 21:19:24
 
Если уж я тут тихо сам с собою, то хотя бы на память еще пару вопросов на ту же тему задам.

1. Почему-то теперь та же программа зависает после выполнения объявления:
Dim progbrowser As InternetExplorer

перед командой:
Set progbrowser = New InternetExplorer

При этом выдается сообщение run-time error 8150002e и что не удалось найти текст, связанный с этим кодом ошибки.
Попытка продолжить выполнение макроса при водит к повторению этого сообщения. Но! Только до тех пор, пока визуально не обновится Prоject Explorer в VBE. Это выглядит как небольшое дёргание списка модулей на экране. Происходит примерно через 20 секунд после описанной выше остановки. После этого дальше можно продолжать выполнение по F5.
Я открываю и закрываю во время выполнения браузер InternetExplorer несколько раз, обращаясь к разным сайтам и скачивая с них нужные вещи (примерно 4-5 раз). Каждый раз после завершения работы со скачанной информацией закрываю открытый браузер через: browser.quit.
Возможно это и не нужно делать, а при необходимости открыть другую страницу просто создавать внутри того же браузера новый документ? Но, кажется, что-то у меня там не срабатывало.
Так вот, из 5 открытий разных браузеров при одном выполнении программы описанная выше задержка выполнения возникает только 1 раз. И кажется, что не обязательно при открытии одного и того же браузера.

2. Вот такая еще вещь происходит в другом макросе. Есть 2-3 вложенных цикла с достаточно большим количеством повторений. Всё работает достаточно шустро, о чем свидетельствует вывод через Debug.Print или Application.StatusBar. И опять не понятно в какой-то момент программа зависает. Сообщений никаких нет, но через Диспетчер задач вижу, что Excel отбирает 15-30% ресурсов. Остановиться стандартными средствами при этом невозможно, сообщений об ошибках нет. Просто подвисает на каком-то шаге программы и всё. Ведь даже понять нельзя, в каком месте зависло, т.к. Эксель просто намертво зависает.
Что делать-то? Ведь тоже происходит это на совершенно разных шагах циклов. Не протюкаешь через дебаггер. Подозреваю, что и тут что-то происходит с незавершенностью каких-то внутренних процессов после выполнения отдельных команд.
Изменено: Anders-8 - 01.04.2025 21:22:43
 
можно сделать прерывание циклов по такому методу и посмотреть

p.s. без примеров файла или хотя бы примеров макросов трудно подсказывать, а телепатов на форуме мало  ;)  
Изменено: irabel - 03.04.2025 06:45:50
 
Цитата
написал:
можно сделать прерывание циклов по  такому методу  и посмотреть
Ссылка дана на целую страницу тем форума.
 
поправил ссылку
Страницы: 1
Читают тему
Наверх