Хочу в обработчик ошибок добавить сообщение, о том, в каком макросе она произошла. Чтобы не прописывать вручную, пытаюсь узнать, как получить это имя ссылкой/переменной. После этого можно данный обработчик просто во все макросы добавить. Теперь будет неважно, насколько длинная цепочка макросов задействована при запуске — если произойдёт ошибка, то я буду точно знать, на каком этапе. Я вижу код примерно так…
Код
Option Explicit
Sub Test()
On Error GoTo er ' в случае ошибки, идём на обработчик
' какой-то код
Exit Sub ' если ошибки нет, то завершаем
er: MsgBox "Check «" & Application.ИмяЗапущенногоМакроса & "»", vbCritical, "Add-In ERROR" ' в случае ошибки, говорим, какой макрос нужно проверить
End Sub
Как правильно должна выглядеть запись Application.ИмяЗапущенногоМакроса?
Поиск дал только инфу про имя модуля. И да - если просто убрать обработчики, то окно с дебагом и так подсветит строку в макросе с ошибкой. Только пользователь этого всего видеть не должен. Вместе с этим сообщением (как в коде) "для разработчика", пользователь увидит другое сообщение "для пользователя" о том, чтобы он сообщил разработчику. Я запущу макрос и сразу пойму, где искать ошибку из всей цепочки задействованных макросов.
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
Может проще стоит в каждом из макросов записывать его название в глобальную переменную перед выполнением ? И обрабатывать значение этой переменной в случае ошибки.
и в каждом макросе своё имя ручками 1 раз указать. Думаю, что мой пример использования не очень удачный, т.к. тут и руками не проблема сделать, но, уверен, есть другие задачи, где это серьёзно поможет…
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
спасибо, но это лишнее. Зная макрос с ошибкой я просто добавлю On Error GoTo 0 и сделаю прогон в штатном режиме, где мне всё подсветится (плюс Locals в помощь и вообще весь штатный функционал). После исправления эту строку удалю и обновлю надстройку. Нужно только узнать, какой макрос в цепочке сбоит, т.к. комплексные программы могут задействовать десятки "базовых" макросов из надстройки и перебирать их все, с "отключением" перехода по ошибке очень долго.
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
VSerg написал: Может проще стоит в каждом из макросов записывать его название в глобальную переменную перед выполнением ? И обрабатывать значение этой переменной в случае ошибки.
ага, при этом предыдущее значение сохранять в локальную переменную и возвращать при выходе из процедуры все обратно.
Jack Famous, В чем глубокий смысл? Сделать универсальную процедуру вывода ошибки?
Доброе время суток. Алексей, вы всё же разберитесь или в конкретном макросе или в стеке вызова? Это всё же VBA - нет там таких удобных механизмов, как, например в VB.NET для такого случая. Так что всё будет только самодельное, вот что предлагает интернет Managing a programmatically accessible stack trace (вариант).
Public MacroName As String
Sub Main()
On Error GoTo er
Call Test1
Call Test2
Call Test3
er: MsgBox "Check: " & MacroName
End Sub
Sub Test1()
MacroName = "Test1"
End Sub
Sub Test2()
MacroName = "Test2"
Dim a As Integer
a = 1 / 0
End Sub
Sub Test3()
MacroName = "Test3"
End Sub
А для данного вопроса - да, универсальность. это сейчас у меня всё в каждом коде и можно руками, а так ведь можно макрос обработчика сделать, UDF или (не дай бог такого профессионализма) пользовательский класс. И вот тогда уже ручки не помогут и нужно будет возвращать для каждого макроса своё имя в автоматическом режиме.
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
Юрий М, Андрей VG, спасибо. По первому взгляду очень похоже на вариант от VSerg.
Цитата
Андрей VG: в конкретном макросе или в стеке вызова?
пока так: есть макрос, который в процессе работы использует много других макросов. При возникновении ошибки нужно узнать, в каком именно макросе она произошла. Как я понимаю, при таком раскладе, писать ручками в обработчик ошибок каждого "базового" макроса его имя — самая надёжная идея. С отдельным маросом для обработки ошибок будет сложнее, но примера пока нет (не нужен).
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
наличия любого дополнительного сервиса в эксплуатации макроса - это дополнительный геморрой в его реализации (в коде) т.е. само собой оно не появиться погеморроитесь с кодом - получите дополнительные возможности когда обьемы геморра начнут превышать обьемы пользы - забросите эту идею...
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете!
Ігор Гончаренко: когда обьёмы геморра начнут превышать обьёмы пользы — забросите эту идею…
золотые слова сколько раз так бывало…
Думаю, что пока оставлю всё как есть:
Вся модель структуры
Код
Option Explicit
'==========================================================
Sub Main()
On Error GoTo er
' какой-то код
Call Test1
' какой-то код
Call Test2
' какой-то код
Call Test3
' какой-то код
Exit Sub
er: MsgBox "Обратитесь к разработчику…", vbCritical, "НЕПРЕДВИДЕННАЯ ОШИБКА"
End Sub
'==========================================================
Sub Test1()
On Error GoTo er
' какой-то код
Exit Sub
er: MsgBox "Check «Test1»", vbCritical, "Add-In ERROR"
End Sub
'==========================================================
Sub Test2()
On Error GoTo er
' какой-то код
Exit Sub
er: MsgBox "Check «Test2»", vbCritical, "Add-In ERROR"
End Sub
'==========================================================
Sub Test3()
On Error GoTo er
' какой-то код
Exit Sub
er: MsgBox "Check «Test3»", vbCritical, "Add-In ERROR"
End Sub
в этом случае пользователь увидит 2 сообщения: первое — "для разработчика" (в каком базовом макросе надстройки ошибка), второе — для него (о том, что нужно сообщить мне)
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
Можеть чууууууть-чуть не по теме, но кто знает, как можно сделать так, чтобы текст автофигуры или обычной кнопки, или ActiveX-кнопки менялся в зависимости от того, какой макрос на неё сейчас назначен?
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
БМВ, а я что — я ничего ну правда ведь круто было бы — не надо каждый раз окно открывать, чтобы глянуть, какой макрос назначен. Удобненько, однако))
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
БМВ написал: Алексей, иногда мне кажется , что добываете Вы огонь ля самокрутки...
А мне кажется, что Джек стремится сделать УНИВЕРСАЛЬНЫЙ макрос на все случаи жизни, которые ещё даже не случились )) Ну а с текстом на кнопках вообще беда: была вменяемая надпись, понятная пользователю - "Удалить пустые строки", а после работы макроса, который призван облегчить Джеку поиск нужной процедуры (ведь выполнить правый клик по кнопке => Назначить макрос => Правка,- это сложно), появится текст, например, "DelEmptyRows". Очень информативно :-)
Юрий М, «"Всяк кулик своё болото хвалит» . Я спрашивал исключительно для себя, потому что сейчас тестирую стенд, а там одна кнопка и более 10 макросов. Кнопка называется "ПУСК". После манипуляций с листом легко забываешь, какой макрос тестишь (похожи). Для этого случая решение "динамического текста" кнопки отличное.
vikttur, «Знать всё на свете нереально, Но я, мечту свою лелея, Решил проблему гениально — Везде втыкаю "GoTo Error"» И что же вы предлагаете? Предусмотреть ВООБЩЕ всё? Сомневаюсь, что это возможно, а, если и так, то затраченное время не оправдывает результата…
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
Юрий М, а если ошибки нет и просто забыл, что за макрос?… Выходов много, как и путей решения. Мне этот нравится и удобен. А чем больше инструментов знаешь, тем шире возможности.
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
vikttur написал: Вот это не приветствую. Не должно быть непредвиденных ошибок.
Вот тут полностью согласен. Сначала верификация данных под обработку. Если что не так, то лист лог с перечнем где, что и почему не так (можно сразу на почту начальству косяки отправлять, чтобы не было потом иных толкований источника данных )
Jack Famous написал: И что же вы предлагаете? Предусмотреть ВООБЩЕ всё?
Предлагаю использовать обработчик ошибок намного реже и только там, где необходимо. Всего, естественно, не предусмотришь, но за 6-7 лет ни разу не применял "а не пошли бы вы к разработчику?". Обычно возможные ошибки обходятся с помощью проверок. Непроверенные проявляются в первые недели-месяцы и устраняются. Потом программы долго и упорно работают. Да и к кому обращаться, если разработчик сменил профиль работы или в космос улетел?
Тяжело отучаться от привычек, тем более плохих. Лучше не приучаться.
Господа, что-то моя тема в лютый оффтоп скатывается)) Каждый (как и всегда) в чём-то по-своему прав. Мне часто приходится переделывать решения под новые нужды и тратить много времени (а обработка ошибок занимает бОльшую его часть) я не могу. ТЗ у меня нет, как и понимания, какие точно данные будут и где/как/что пользователь решит нажать. Каждый адаптируется под условия работы, а послать всех нахрен и сказать "без ТЗ ничего делать не буду" — такой себе выход. Я люблю свою работу
Цитата
vikttur: Непроверенные проявляются в первые недели-месяцы и устраняются. Потом программы долго и упорно работают.
полностью согласен, но в том-то и дело, что до полноценных тестов не доходит - сразу на что-то другое переключают. И вообще вы вот предполагаете, а ведь совсем не знаете специфику моей работы. Спросили бы что-ли, если уж на то пошло, а то получается, вы говорите о том, что "мясо долго можно хранить только в морозилке", а я вам про то, что "у меня даже холодильник барахлит и морозилка у начальства только в планах"
Цитата
vikttur: Тяжело отучаться от привычек, тем более плохих. Лучше не приучаться.
а кто судей судить-то будет?))
Кто хочет обсудить, создавайте тему в курилке, пожалуйста
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄