Выяснение того, какая функция называется другой функцией в VBA excel

Проблема У меня есть файл Excel с довольно сложным кодом VBA, и у меня возникают проблемы с отслеживанием и отладкой ошибок. Иногда функция B получает значение, которое она не должна получать, и происходит сбой, но в этот момент я не могу знать, какая другая функция вызвала эту функцию B, и процесс anylys для ее обнаружения требует очень много времени.

Мое решение Решение может преобразовать все имеющиеся у меня функции следующим образом:

Sub foo1(variable1 as string)
    'do whatever
End Sub

в

Sub foo1(variable1 as string, inforvariable as string)
    'do whatever
End Sub

Infovariable — это имя вызова функции. Это, очевидно, требует очень много времени (рефакторинг всего). Кроме того, я не знаю ни как получить доступ к имени "sub" функции вызова кода, что-то вроде:

infovariable = self.name
call foo1(variable1, inforvariable)

Кажется, не существует в VBA

Некоторые идеи?

Я смотрю здесь, здесь и здесь


person JFerro    schedule 13.03.2019    source источник
comment
Можете ли вы использовать Debug.Assert в начале функции B, чтобы поймать недопустимое значение, а затем пропустить конец функции, чтобы увидеть, откуда она была вызвана? (например, Debug.Assert Deliminator > 0 для ошибки деления на ноль)   -  person Chronocidal    schedule 13.03.2019
comment
Обработчик ошибок, который выдает сообщение, показывающее всех вызывающих абонентов над ошибкой, см. в разделе обработка ошибок vba.   -  person Mark Fitzgerald    schedule 13.03.2019


Ответы (1)


Отладьте свой макрос, поставьте точку останова на строку с проблемой (если строка вызывается слишком часто, добавьте условие только для остановки при этом условии) и просмотрите стек вызовов (сочетание клавиш Ctrl+L).

person Dominique    schedule 13.03.2019
comment
Это работает, но я ищу общее решение. Способ изменить мой способ программирования. Я не имею в виду нарушение конкретной функции, но в целом, как запрограммировать ЛЮБУЮ функцию таким образом, чтобы, когда она ломалась (ошибка) и я редактировал редактор VBA, я знал, кто (какая другая функция или подпрограмма) вызвал данную функцию с ошибкой . - person JFerro; 13.03.2019
comment
Кажется, что общего решения не существует, но, возможно, вы могли бы использовать следующую систему: объявите свою подфункцию как subfunction(..., string parent), и каждый раз, когда вы ее вызываете (в родительской функции), вы вводите имя этой родительской функции. В С++ вы можете использовать __FUNCTION, но, похоже, этого не существует в VBA. - person Dominique; 08.06.2020
comment
спасибо Доминик, вот что я в итоге сделал. Я должен сказать, что это раздражает, потому что вам, возможно, придется реорганизовать множество уже существующих функций.... - person JFerro; 08.06.2020