Поиск  Пользователи  Правила 
Закрыть
Логин:
Пароль:
Забыли свой пароль?
Регистрация
Войти
 
Страницы: 1 2 3 След.
RSS
Как узнать название выполняемого в данный момент макроса
 
Доброго времени суток, Планетяне!

Хочу в обработчик ошибок добавить сообщение, о том, в каком макросе она произошла. Чтобы не прописывать вручную, пытаюсь узнать, как получить это имя ссылкой/переменной. После этого можно данный обработчик просто во все макросы добавить. Теперь будет неважно, насколько длинная цепочка макросов задействована при запуске — если произойдёт ошибка, то я буду точно знать, на каком этапе. Я вижу код примерно так…
Код
Option Explicit
Sub Test()
On Error GoTo er ' в случае ошибки, идём на обработчик
' какой-то код

Exit Sub ' если ошибки нет, то завершаем
er: MsgBox "Check «" & Application.ИмяЗапущенногоМакроса & "»", vbCritical, "Add-In ERROR" ' в случае ошибки, говорим, какой макрос нужно проверить
End Sub
Как правильно должна выглядеть запись Application.ИмяЗапущенногоМакроса?

Поиск дал только инфу про имя модуля. И да - если просто убрать обработчики, то окно с дебагом и так подсветит строку в макросе с ошибкой. Только пользователь этого всего видеть не должен. Вместе с этим сообщением (как в коде) "для разработчика", пользователь увидит другое сообщение "для пользователя" о том, чтобы он сообщил разработчику. Я запущу макрос и сразу пойму, где искать ошибку из всей цепочки задействованных макросов.
Изменено: Jack Famous - 20 Сен 2018 11:31:41
«Тот, кто несет фонарь, спотыкается чаще, чем тот, кто идет следом.»
Иоганн Пауль Фридрих Рихтер
 
Может проще стоит в каждом из макросов записывать его название в глобальную переменную перед выполнением ? И обрабатывать значение этой переменной в случае ошибки.
 
Цитата
VSerg: Может проще
тогда уж проще вместо
Код
er: MsgBox "Check «" & Application.ИмяЗапущенногоМакроса & "»", vbCritical, "Add-In ERROR"
писать
Код
er: MsgBox "Check «Test»", vbCritical, "Add-In ERROR"
и в каждом макросе своё имя ручками 1 раз указать.
Думаю, что мой пример использования не очень удачный, т.к. тут и руками не проблема сделать, но, уверен, есть другие задачи, где это серьёзно поможет…
«Тот, кто несет фонарь, спотыкается чаще, чем тот, кто идет следом.»
Иоганн Пауль Фридрих Рихтер
 
Код
Sub test()
 
    On Error Resume Next
2: a = 1 / 0
    MsgBox "Line " & Erl & "   """ & Err.Description & """"
End Sub
как вариант выводить номер строки
 
Цитата
ivanok_v2 написал:
выводить номер строки
это если все строки в модуле пронумерованы. А по теме: нет нормальных встроенных средств для отслеживания имени макроса.
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
 
Цитата
ivanok_v2: выводить номер строки
спасибо, но это лишнее. Зная макрос с ошибкой я просто добавлю On Error GoTo 0 и сделаю прогон в штатном режиме, где мне всё подсветится (плюс Locals в помощь и вообще весь штатный функционал). После исправления эту строку удалю и обновлю надстройку. Нужно только узнать, какой макрос в цепочке сбоит, т.к. комплексные программы могут задействовать десятки "базовых" макросов из надстройки и перебирать их все, с "отключением" перехода по ошибке очень долго.

Цитата
Дмитрий(The_Prist) Щербаков: нет нормальных встроенных средств
ну, собсна, я так и думал  :sceptic: спасибо!
Изменено: Jack Famous - 20 Сен 2018 11:59:50
«Тот, кто несет фонарь, спотыкается чаще, чем тот, кто идет следом.»
Иоганн Пауль Фридрих Рихтер
 
Цитата
VSerg написал:
Может проще стоит в каждом из макросов записывать его название в глобальную переменную перед выполнением ? И обрабатывать значение этой переменной в случае ошибки.
ага, при этом предыдущее значение сохранять в локальную переменную и возвращать при выходе из процедуры все обратно.

Jack Famous, В чем глубокий смысл? Сделать универсальную процедуру вывода ошибки?
 
Может здесь что полезное найдётся?
http://www.vbnet.ru/articles/showarticle.aspx?id=171
 
Доброе время суток.
Алексей, вы всё же разберитесь или в конкретном макросе или в стеке вызова? Это всё же VBA - нет там таких удобных механизмов, как, например в VB.NET для такого случая. Так что всё будет только самодельное, вот что предлагает интернет Managing a programmatically accessible stack trace (вариант).
Изменено: Андрей VG - 20 Сен 2018 12:03:17
 
Jack Famous,
Я имел ввиду что-то типа:
Код
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 или (не дай бог такого профессионализма) пользовательский класс. И вот тогда уже ручки не помогут и нужно будет возвращать для каждого макроса своё имя в автоматическом режиме.
Изменено: Jack Famous - 20 Сен 2018 12:04:53
«Тот, кто несет фонарь, спотыкается чаще, чем тот, кто идет следом.»
Иоганн Пауль Фридрих Рихтер
 
Юрий М, Андрей VG, спасибо. По первому взгляду очень похоже на вариант от VSerg.
Цитата
Андрей VG: в конкретном макросе или в стеке вызова?
пока так: есть макрос, который в процессе работы использует много других макросов. При возникновении ошибки нужно узнать, в каком именно макросе она произошла. Как я понимаю, при таком раскладе, писать ручками в обработчик ошибок каждого "базового" макроса его имя — самая надёжная идея. С отдельным маросом для обработки ошибок будет сложнее, но примера пока нет (не нужен).
Цитата
VSerg: Я имел ввиду
а мне нравится — может сработать  :) спасибо! Только добавляется писанины, как сказал БМВ.
Изменено: Jack Famous - 20 Сен 2018 12:28:47
«Тот, кто несет фонарь, спотыкается чаще, чем тот, кто идет следом.»
Иоганн Пауль Фридрих Рихтер
 
наличия любого дополнительного сервиса в эксплуатации макроса - это дополнительный геморрой в его реализации (в коде)
т.е. само собой оно не появиться
погеморроитесь с кодом - получите дополнительные возможности
когда обьемы геморра начнут превышать обьемы пользы - забросите эту идею...
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете!
 
Цитата
Ігор Гончаренко: когда обьёмы геморра начнут превышать обьёмы пользы — забросите эту идею…
золотые слова  :D сколько раз так бывало…

Думаю, что пока оставлю всё как есть:
Вся модель структуры
в этом случае пользователь увидит 2 сообщения: первое — "для разработчика" (в каком базовом макросе надстройки ошибка), второе — для него (о том, что нужно сообщить мне)
Изменено: Jack Famous - 20 Сен 2018 12:30:21
«Тот, кто несет фонарь, спотыкается чаще, чем тот, кто идет следом.»
Иоганн Пауль Фридрих Рихтер
 
Доброго времени суток, Планетяне!

Можеть чууууууть-чуть не по теме, но кто знает, как можно сделать так, чтобы текст автофигуры или обычной кнопки, или ActiveX-кнопки менялся в зависимости от того, какой макрос на неё сейчас назначен?  :)
Изменено: Jack Famous - 21 Сен 2018 09:56:03
«Тот, кто несет фонарь, спотыкается чаще, чем тот, кто идет следом.»
Иоганн Пауль Фридрих Рихтер
 
Jack Famous, Алексей, иногда мне кажется , что добываете Вы огонь ля самокрутки, которая не поместилась на аватарку. :-)
 
БМВ, а я что — я ничего :D  ну правда ведь круто было бы — не надо каждый раз окно открывать, чтобы глянуть, какой макрос назначен. Удобненько, однако))
«Тот, кто несет фонарь, спотыкается чаще, чем тот, кто идет следом.»
Иоганн Пауль Фридрих Рихтер
 
Цитата
Jack Famous написал:
чтобы текст автофигуры или обычной кнопки
в первом приближении так
Код
Sub bb()
Dim s As Shape, x
  For Each s In ActiveSheet.Shapes
    x = s.OnAction
    If Len(x) Then s.TextFrame.Characters.Text = x
  Next
End Sub
Цитата
Jack Famous написал:
или ActiveX-кнопки
У элементов ActiveX вполне определенные имена обработчиков событий.
 
Казанский, большое вам спасибо! Всё работает  ;)
«Тот, кто несет фонарь, спотыкается чаще, чем тот, кто идет следом.»
Иоганн Пауль Фридрих Рихтер
 
так пропишите в макрос при вызове Caller прописывать :-) после первого запуска будет то что хотите.
Код
ActiveSheet.DrawingObjects(Application.Caller).Characters.Text = "Macro1"


Блин, чур меня, че-то на темную сторону потянулу, и уже не первый раз на этой неделе :-(
Изменено: БМВ - 21 Сен 2018 11:05:50
 
БМВ, спасибо))
Цитата
БМВ: на темную сторону потянуло
1.jpg (69.14 КБ)
«Тот, кто несет фонарь, спотыкается чаще, чем тот, кто идет следом.»
Иоганн Пауль Фридрих Рихтер
 
 
Цитата
БМВ написал:
Алексей, иногда мне кажется , что добываете Вы огонь ля самокрутки...
А мне кажется, что Джек стремится сделать УНИВЕРСАЛЬНЫЙ макрос на все случаи жизни, которые ещё даже не случились ))
Ну а с текстом на кнопках вообще беда: была вменяемая надпись, понятная пользователю - "Удалить пустые строки", а после работы макроса, который призван облегчить Джеку поиск нужной процедуры (ведь выполнить правый клик по кнопке => Назначить макрос => Правка,- это сложно), появится текст, например, "DelEmptyRows". Очень информативно :-)
 
Код
MsgBox "Обратитесь к разработчику…", vbCritical, "НЕПРЕДВИДЕННАЯ ОШИБКА"

Вот это не приветствую. Не должно быть непредвиденных ошибок. И использовать часто-густо On Error... не очень хорошая привычка.
 
Юрий М, «"Всяк кулик своё болото хвалит»  :) . Я спрашивал исключительно для себя, потому что сейчас тестирую стенд, а там одна кнопка и более 10 макросов. Кнопка называется "ПУСК". После манипуляций с листом легко забываешь, какой макрос тестишь (похожи). Для этого случая решение "динамического текста" кнопки отличное.

vikttur, «Знать всё на свете нереально, Но я, мечту свою лелея, Решил проблему гениально — Везде втыкаю "GoTo Error"»  :D
И что же вы предлагаете? Предусмотреть ВООБЩЕ всё? Сомневаюсь, что это возможно, а, если и так, то затраченное время не оправдывает результата…
Изменено: Jack Famous - 21 Сен 2018 14:07:12
«Тот, кто несет фонарь, спотыкается чаще, чем тот, кто идет следом.»
Иоганн Пауль Фридрих Рихтер
 
Цитата
Jack Famous написал:
После манипуляций с листом легко забываешь, какой макрос тестишь (похожи)
А если при ошибке отправлять к строке Stop - не выход?
 
Юрий М, а если ошибки нет и просто забыл, что за макрос?… Выходов много, как и путей решения. Мне этот нравится и удобен. А чем больше инструментов знаешь, тем шире возможности.
«Тот, кто несет фонарь, спотыкается чаще, чем тот, кто идет следом.»
Иоганн Пауль Фридрих Рихтер
 
Цитата
vikttur написал:
Вот это не приветствую. Не должно быть непредвиденных ошибок.
Вот тут полностью согласен. Сначала верификация данных под обработку. Если что не так, то лист лог с перечнем где, что и почему не так (можно сразу на почту начальству косяки отправлять, чтобы не было потом иных толкований источника данных :) )
 
Цитата
Jack Famous написал: И что же вы предлагаете? Предусмотреть ВООБЩЕ всё?
Предлагаю использовать обработчик ошибок намного реже и только там, где необходимо. Всего, естественно, не предусмотришь, но за 6-7 лет ни разу не применял "а не пошли бы вы к разработчику?". Обычно возможные ошибки обходятся с помощью проверок. Непроверенные проявляются в первые недели-месяцы и устраняются. Потом программы долго и упорно работают.
Да и к кому обращаться, если разработчик сменил профиль работы или в космос улетел? :)

Тяжело отучаться от привычек, тем более плохих. Лучше не приучаться.
 
Господа, что-то моя тема в лютый оффтоп скатывается))
Каждый (как и всегда) в чём-то по-своему прав. Мне часто приходится переделывать решения под новые нужды и тратить много времени (а обработка ошибок занимает бОльшую его часть) я не могу. ТЗ у меня нет, как и понимания, какие точно данные будут и где/как/что пользователь решит нажать. Каждый адаптируется под условия работы, а послать всех нахрен и сказать "без ТЗ ничего делать не буду" — такой себе выход. Я люблю свою работу  :)

Цитата
vikttur: Непроверенные проявляются в первые недели-месяцы и устраняются. Потом программы долго и упорно работают.
полностью согласен, но в том-то и дело, что до полноценных тестов не доходит - сразу на что-то другое переключают. И вообще вы вот предполагаете, а ведь совсем не знаете специфику моей работы. Спросили бы что-ли, если уж на то пошло, а то получается, вы говорите о том, что "мясо долго можно хранить только в морозилке", а я вам про то, что "у меня даже холодильник барахлит и морозилка у начальства только в планах"  :D
Цитата
vikttur: Тяжело отучаться от привычек, тем более плохих. Лучше не приучаться.
а кто судей судить-то будет?))

Кто хочет обсудить, создавайте тему в курилке, пожалуйста  ;)
Изменено: Jack Famous - 21 Сен 2018 14:23:27
«Тот, кто несет фонарь, спотыкается чаще, чем тот, кто идет следом.»
Иоганн Пауль Фридрих Рихтер
Страницы: 1 2 3 След.
Читают тему (гостей: 1)
Наверх