Страницы: 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.09.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.09.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.09.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.09.2018 12:04:53
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
 
Юрий М, Андрей VG, спасибо. По первому взгляду очень похоже на вариант от VSerg.
Цитата
Андрей VG: в конкретном макросе или в стеке вызова?
пока так: есть макрос, который в процессе работы использует много других макросов. При возникновении ошибки нужно узнать, в каком именно макросе она произошла. Как я понимаю, при таком раскладе, писать ручками в обработчик ошибок каждого "базового" макроса его имя — самая надёжная идея. С отдельным маросом для обработки ошибок будет сложнее, но примера пока нет (не нужен).
Цитата
VSerg: Я имел ввиду
а мне нравится — может сработать  :) спасибо! Только добавляется писанины, как сказал БМВ.
Изменено: Jack Famous - 20.09.2018 12:28:47
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
 
наличия любого дополнительного сервиса в эксплуатации макроса - это дополнительный геморрой в его реализации (в коде)
т.е. само собой оно не появиться
погеморроитесь с кодом - получите дополнительные возможности
когда обьемы геморра начнут превышать обьемы пользы - забросите эту идею...
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете!
 
Цитата
Ігор Гончаренко: когда обьёмы геморра начнут превышать обьёмы пользы — забросите эту идею…
золотые слова  :D сколько раз так бывало…

Думаю, что пока оставлю всё как есть:
Вся модель структуры
в этом случае пользователь увидит 2 сообщения: первое — "для разработчика" (в каком базовом макросе надстройки ошибка), второе — для него (о том, что нужно сообщить мне)
Изменено: Jack Famous - 20.09.2018 12:30:21
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
 
Доброго времени суток, Планетяне!

Можеть чууууууть-чуть не по теме, но кто знает, как можно сделать так, чтобы текст автофигуры или обычной кнопки, или ActiveX-кнопки менялся в зависимости от того, какой макрос на неё сейчас назначен?  :)
Изменено: Jack Famous - 21.09.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.09.2018 11:05:50
По вопросам из тем форума, личку не читаю.
 
БМВ, спасибо))
Цитата
БМВ: на темную сторону потянуло
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
 
По вопросам из тем форума, личку не читаю.
 
Цитата
БМВ написал:
Алексей, иногда мне кажется , что добываете Вы огонь ля самокрутки...
А мне кажется, что Джек стремится сделать УНИВЕРСАЛЬНЫЙ макрос на все случаи жизни, которые ещё даже не случились ))
Ну а с текстом на кнопках вообще беда: была вменяемая надпись, понятная пользователю - "Удалить пустые строки", а после работы макроса, который призван облегчить Джеку поиск нужной процедуры (ведь выполнить правый клик по кнопке => Назначить макрос => Правка,- это сложно), появится текст, например, "DelEmptyRows". Очень информативно :-)
 
Код
MsgBox "Обратитесь к разработчику…", vbCritical, "НЕПРЕДВИДЕННАЯ ОШИБКА"

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

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

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

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

Кто хочет обсудить, создавайте тему в курилке, пожалуйста  ;)
Изменено: Jack Famous - 21.09.2018 14:23:27
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
Страницы: 1 2 3 След.
Наверх