Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Microsoft Office и VBA программирование > Microsoft Office Excel
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 26.10.2010, 12:18   #1
alvazor
Форумчанин
 
Регистрация: 02.07.2009
Сообщений: 122
По умолчанию перехват ошибок vba, excel

Всем доброго здравия!
Есть ли возможность перехвата ошибок vba и Excel извне (не из модулей кода)?
Проблема коротко вот в чем.
У меня довольно большая надстройка, использующая как листы (данные и вычисления), так и формы (6 форм с количеством элементов около 1000).
Надстройка при пуске меняет пользовательский интерфейс листов и приложения, причем выход из приложения возможен только по конкретной клавише одной из форм. Проект защищен паролем.
При появлении ошибки vba - в проект не попасть и, соответственно, не выйти из программы, нажав end в сообщении. Все виснет.
Есть п/п восстановления интерфейса, есть п/п корректного выхода, к которым можно адреснуться по ошибке, но как ее отловить?
Среди событий, которые отлавливает приложение - что-то таких не нашел. Вставлять в каждую процедуру On ERROR Go To - свихнешься, да и некрасиво.
Дайте совет, к чему можно прицепиться?
С уважением
alvazor вне форума Ответить с цитированием
Старый 26.10.2010, 13:02   #2
IgorGO
Новичок
СтарожилДжуниор
 
Аватар для IgorGO
 
Регистрация: 05.02.2008
Сообщений: 9,487
По умолчанию

ничего не красивого в On ERROR Go To не вижу.
не красиво писать код, в котором возникают ошибки...
если ошибки из-за кода - то все в ваших руках, если из-за данных от пользователя - проверьте сначала, что получили прежде, чем обрабатывать
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете
IgorGO вне форума Ответить с цитированием
Старый 26.10.2010, 13:15   #3
alvazor
Форумчанин
 
Регистрация: 02.07.2009
Сообщений: 122
По умолчанию

Хотелось бы совет по существу, IgorGo!
Даже тщательное бета-тестирование от дурных ошибок не спасает, самых неожиданных!
Пример:
один из тестеров в TextBox формы (окно ПРИМЕЧАНИЯ) ввел первым символом текста знак "=" При записи такого "текста" в ячейку листа (variant) - приехали! Все, что при тестировании проявляется, естественно, обхожу, но....
А тех, кто тестирует, напрягать лишний раз мне ни к чему. Да и явно должна быть возможность отловить ошибки "снаружи" - окно-то дебугера выскакивает
alvazor вне форума Ответить с цитированием
Старый 26.10.2010, 15:14   #4
EducatedFool
Программист VBA
СуперМодератор
 
Аватар для EducatedFool
 
Регистрация: 13.07.2008
Сообщений: 6,856
По умолчанию

в данном случае помогает On Error Resume Next

ставите эту директиву первой строкой в процедуре, а последней строкой проверяете, всё ли прошло гладко:

Код:
if err then msgbox "Что-то пошло не так, как ожидалось. Повторим всё сначала": goto НачалоПроцедуры
EducatedFool вне форума Ответить с цитированием
Старый 26.10.2010, 16:21   #5
alvazor
Форумчанин
 
Регистрация: 02.07.2009
Сообщений: 122
По умолчанию

Да я понимаю, EducatedFool, обработчиков ошибок в сложных или сомнительных процедурах у меня много наставлено. Только воткнуть эти две (или только первую) команды в сотни оставшихся процедур - кошмар. Могу, конечно, и автоматизировать вставку...
Но хотелось бы убедиться, что иных вариантов нет - через скрипты (потоки объектов), API (тип диагностического окна) или еще как-нить ??
alvazor вне форума Ответить с цитированием
Старый 26.10.2010, 17:10   #6
SAS888
Старожил
 
Аватар для SAS888
 
Регистрация: 05.12.2007
Сообщений: 4,180
По умолчанию

ИМХО все процедуры VBA Excel долны быть написаны правильно и не вызывать ошибок.
Перехват (On Error ...) допустимо (рекомендуется) применять только умышленно, для определения особых условий. Если возможна непредвиденная ошибка, ИМХО значит Вы ее не предвидели и не предприняли мер для того, чтобы ее не допустить.
Чем шире угол зрения, тем он тупее.
SAS888 вне форума Ответить с цитированием
Старый 26.10.2010, 18:24   #7
motorway
Участник клуба
 
Регистрация: 28.06.2009
Сообщений: 1,950
По умолчанию

Цитата:
один из тестеров в TextBox формы (окно ПРИМЕЧАНИЯ) ввел первым символом текста знак "=" При записи такого "текста" в ячейку листа (variant) - приехали!
Обычно такие проблемы легко решаются заменой в получаемой строке всех нежелательных символов, либо проверкой, является ли первый символ каким-то нежелательным. Если да, то берем оставшуюся подстроку
motorway вне форума Ответить с цитированием
Старый 27.10.2010, 10:59   #8
alvazor
Форумчанин
 
Регистрация: 02.07.2009
Сообщений: 122
По умолчанию

Доброго дня всем!
«Все процедуры VBA Excel долны быть написаны правильно и не вызывать ошибок.»…бла, бла, бла… Эта красивая фраза порождает у меня массу еще более красивых фраз, которые правила сайта, к сожалению, не позволяют опубликовать.
Я, собственно, этим и занимаюсь, готовя бета-тестирование.
Но каково уважаемым тестерам (не программистам!), работая в варианте бесплатной услуги с новым продуктом, подвеситься из-за какой-то непредвиденной глупости!?
На мой взгляд, тоже ни к чему втыкать в сотни процедур обработчики ошибок «на всякий случай», хотя, повторюсь, это можно сделать и программно (автоматически). Думаю, что ляп в моем продукте остались единицы, но ведь какие-то и при тестировании могут не обнаружиться и вылететь потом, что еще хуже. Вот и хочется предохраниться от последних разумным способом.
Рассуждаю так:
Application при инсталлированной надстройке у меня прописан в модуле класса и видит все окна, кроме своего. Использую его для синхронизации видимости форм надстройки с книгами Excel.
Когда VBA обнаруживает ошибку, выкидывается его окно, которое, вроде как должно относиться к CommandBars и иметь свой ID, привязанный к VBProject конкретной книги. Например, окно свойств проекта имеет ID:=2578 (тип того же окна: Application.ActiveWorkbook.WBProjec t.VBE.Window.Type = 6).
Распознав окно, им можно попробовать манипулировать с помощью SendKeys, а также, если это (модальное) окно удастся закрыть, реализовать корректный выход из программы и (или) восстановление пользовательского интерфейса Excel и книг.
Правда, еще остается ошибка Excel – тут либо скрипты, либо API, но всему свое время…
Может кто хотя бы знает ID или Type окна сообщения об ошибке VBE?

ЗЫ: с исключением недопустимых символов из вводимого текста на данном форуме мы уже отработали варианты. Я счел более удачным до записи данных программно преобразовывать формат ячейки листа в текстовый.
alvazor вне форума Ответить с цитированием
Старый 27.10.2010, 11:50   #9
EducatedFool
Программист VBA
СуперМодератор
 
Аватар для EducatedFool
 
Регистрация: 13.07.2008
Сообщений: 6,856
По умолчанию

Цитата:
Application при инсталлированной надстройке у меня прописан в модуле класса и видит все окна, кроме своего. Использую его для синхронизации видимости форм надстройки с книгами Excel.
Когда VBA обнаруживает ошибку, выкидывается его окно, которое, вроде как должно относиться к CommandBars и иметь свой ID, привязанный к VBProject конкретной книги. Например, окно свойств проекта имеет ID:=2578 (тип того же окна: Application.ActiveWorkbook.WBProjec t.VBE.Window.Type = 6).
Распознав окно, им можно попробовать манипулировать с помощью SendKeys, а также, если это (модальное) окно удастся закрыть, реализовать корректный выход из программы и (или) восстановление пользовательского интерфейса Excel и книг.
Ерудну какую-то вы написали.
Ошибка...окно...CommandBars...VBPro ject...SendKeys - между всем этим связи вообще никакой.

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

В нормально написанной программе (на любом языке программирования), обрабатывающей вводимые пользователем данные, около 50% кода - это обработчики ошибок.
Вы же, сделав только половину работы, хотите найти простое решение в пару строк кода.
Так не бывает...
EducatedFool вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
VBA Word,VBA Excel решить 2 задачи fafolo4ka Фриланс 6 05.03.2012 01:15
Перехват ошибок компилятора Яр|/||< (^_^) Общие вопросы Delphi 4 27.03.2010 16:07
Нужен специалист по VBA для исправления ошибок в существующей БД Dorfooz Фриланс 7 11.11.2009 22:01
Как запретить запуск программы на VBA Excel 2003 в Excel 2007 kovalevskivf Microsoft Office Excel 2 15.05.2009 16:47
Перехват ошибок от Windows DRUNE Софт 2 09.04.2009 13:24