Страницы: 1
RSS
Обработка ошибок Run-time error
 
Коллеги, здравствуйте.

В процессе автономной работы Excel-приложения периодически возникают ошибки вида "Run-time error" (пример во вложенной фотографии) - из-за этого останавливается выполнение макросов и всего файла в целом. После нажатия кнопки "End" на всплывающем окне всё нормализуется до следующего появления подобной ошибки.

Прошу вас, по возможности, уточнить: можно ли как-то прописать в макросах, VBA-коде книги или листов универсальную команду, чтобы при появлении подобных и любых других ошибок они автоматически обрабатывались и работа Excel не прекращалась?
Изменено: paylevan - 23.11.2013 16:44:22
 
Вы фотографируете экран? )
 
Нет, обычно пользуюсь PrtSc. Просто в этот раз надо было на телефон сфотографировать, чтобы взять с собой. Буду признателен за конструктивный совет.
 
on error goto
on error resume next
и т.д.

Цитата
при появлении подобных и любых других ошибок они автоматически обрабатывались
а вот это как раз и надо будет прописать - как именно их обрабатывать.
ибо просто пропускать (как это делаете вы сейчас) - не всегда приведет к "всё нормализуется".
фрилансер Excel, VBA - контакты в профиле
"Совершенствоваться не обязательно. Выживание — дело добровольное." Э.Деминг
 
пс. я таки не удивляюсь, почему объявления типа "лечу по фотографии" пользуются спросом :)
фрилансер Excel, VBA - контакты в профиле
"Совершенствоваться не обязательно. Выживание — дело добровольное." Э.Деминг
 
ikki, везде "принтскрины" и "ножницы", а здесь фотография. Пусть будет  :)  . Для разнообразия  :)  .
Изменено: paylevan - 23.11.2013 17:02:39
 
Сама ошибка означает отсутствие у Вас доступа. К чему - Вам виднее. И простое игнорирование ошибки может в дальнейшем еще аукнуться. Поэтому надо точно знать, что именно этого хочется.
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
 
The_Prist, я предполагаю, что отсутствие доступа возникает потому, что различные макросы импортируют данные из одного и того же текстового файла: когда в какой-то момент они это делают одновременно, именно тогда, как мне кажется, и случается ошибка с доступом, ибо файл, занятый одним из макросов, становится недоступным для других. Подправьте меня, если считаете, что это не может являться причиной.
В таком случае, необходимо, чтобы тот или иной макрос при наступлении ошибки перевыполнялся вплоть до успешного раза. Соответственно, наиболее безопасным мне представляется, согласно совету ikki, проставить в макросах следующие строки:
в начале
Код
On Error Resume Next
в конце
Код
On Error GoTo 0
Простейший пример решения данной проблемы - во вложенной фотографии. Если есть более надёжный вариант, прошу написать.
Изменено: paylevan - 23.11.2013 18:51:05
 
paylevan, ikki толсто намекнул Вам, что без Вашего файла с макросом, вероятность угадать причину очень мала.
Я сам - дурнее всякого примера! ...
 
Цитата
я предполагаю, что отсутствие доступа возникает потому, что различные макросы импортируют данные из одного и того же текстового файла: когда в какой-то момент они это делают одновременно, именно тогда, как мне кажется, и случается ошибка с доступом
Сомневаюсь: не должны два макроса одновременно запуститься.
 
"Юрий М:
не должны два макроса одновременно запуститься."
Разве что с разных машин. Тогда есть смысл добавить проверку на занятость файла. Но мы опять гадаем. :)
Я сам - дурнее всякого примера! ...
 
Цитата
согласно совету ikki
я этого не советовал!  :)  
просто проставить эти операторы в начале и конце кода и на этом успокоиться - можно.
но чревато.
надо разбираться - какие именно ошибки, в каком месте кода, в каких случаях и что с ними делать.

например, для случая "одновременного" обращения к занятому файлу можно поставить небольшой цикл с оговоренным временем повторных попыток чтения, результат - опять же обрабатывать и, к примеру, если за ранее определенный промежуток времени файл открыть не удвлось - честно предупреждать пользователя и завершать работу.
а у вас не пойми что получается - попробовали прочитать файл - он занят - ну и фиг с ним - проигнорировали ошибку и пошли дальше, как будто всё нормально.

чего-то многовато я понаписал...
и ведь всё - очевидные вещи ;)
фрилансер Excel, VBA - контакты в профиле
"Совершенствоваться не обязательно. Выживание — дело добровольное." Э.Деминг
 
ikki, кстати, именно цикл с временем и помог. Как раз так я и идентифицировал проблему с доступом.
В этой фразе "согласно совету ikki" имелось в виду "порекомендовал нужные функции"  :)   .
Именно для того, чтобы исключить проиллюстрированный Вами случай
Цитата
попробовали прочитать файл - он занят - ну и фиг с ним - проигнорировали ошибку и пошли дальше, как будто всё нормально.
и используется в конце строчка
Код
On Error GoTo 0
чтобы макрос при возникновении ошибки не "пошёл дальше", а перезапустился заново.
Изменено: paylevan - 23.11.2013 18:34:45
 
on error goto 0 используется не для перезапуска макроса, а для отключения обработки ошибок.
читайте справку ;)
фрилансер Excel, VBA - контакты в профиле
"Совершенствоваться не обязательно. Выживание — дело добровольное." Э.Деминг
 
Цитата
читайте справку
ikki, именно с неё я и начал. И всегда рекомендую всем это делать.
Если у Вас есть более корректное, чем приведённое выше, решение обработки некритических ошибок в макросах, требующее лишь их перезапуска, прошу привести пример.
Возможно, нижняя строчка "On Error GoTo 0" необязательна и достаточно лишь добавить верхнюю "On Error Resume Next"?
Изменено: paylevan - 23.11.2013 18:50:11
 
обычно советуют поступать примерно так:
перед участком кода, могущем вызвать ошибку указанного вами типа, пишем:

on error resume next
' далее - код (как правило - один оператор/функция
if err>0 then exit sub ' ошибка таки произошла. выходим из процедуры
on error goto 0 ' в общем случае - необязательно, обычно нужно в процессе отладки. особенно если в вашем коде могут быть совсем другие ошибки. а без отключенного обработчика - они все будут игнорироваться и вы ничего толком не сможете проверить.
фрилансер Excel, VBA - контакты в профиле
"Совершенствоваться не обязательно. Выживание — дело добровольное." Э.Деминг
 
ikki, спасибо большое за подробный ответ.

По поводу "on error goto 0" Вы правы: обратил внимание, что без этой строчки результат один и тот же.
Изменено: paylevan - 23.11.2013 18:51:10
 
paylevan, наиболее точной и простой симуляцией вашего случая будет:
в начале

Код
on error goto er

и в конце программы:


Код
..
exit sub
er: end
endsub

 

ps вышеупомянутый код не получается выделить тегами..
Изменено: Слэн - 29.11.2013 14:24:56
Живи и дай жить..
 
Получилось))
 
Здравствуйте, Слэн, спасибо большое за предложенный вариант.
Страницы: 1
Читают тему
Наверх