В соответствии с просьбой в комментариях ...
Найдите свойство Caller объекта Application в справке VBA Excel.Когда вы используете его из подпрограммы VBA, он сообщит вам, откуда поступил вызов подпрограммы - какой диапазон, диаграмма и т. Д.
При использовании 'Application.Caller' важно помнить следующее:что это не всегда объект Range.Посмотрите на справку, но свойство возвращает значение Variant, которое может быть Range, String или Error.(Это интересующий вас объект Range, но вы должны знать об этом.)
Из-за вышеизложенного и капризов синтаксиса VBA, когда дело доходит до объектов противзначения, это может быть сложно использовать «Application.Caller».Если в вашем коде вставить строку типа:
Debug.Print Application.Caller.Address
, произойдет сбой, если вызывающая сторона не является Range.Выполнение чего-то вроде:
Dim v
v = Application.Caller
скомпилирует, но создаст циклические ссылки, когда вызывающий будет Range, потому что вы пытаетесь получить доступ к значению вызывающего Range.
Все это означает, что, вероятно, лучше написать небольшую служебную функцию для себя:
Public Function currentCaller() As String
If TypeOf Application.Caller Is Range Then
Dim rng As Range
Set rng = Application.Caller
currentCaller = rng.Address(External:=True)
Else
currentCaller = CStr(Application.Caller)
End If
End Function
, а затем вызвать ее из ваших обработчиков ошибок, откуда вы хотите знать, откуда поступил вызов.
Еще одна вещь - очевидно, что это может сказать вызывающему абоненту только после того, как на самом деле была вызвана подпрограмма VBA.Если в ваших формулах вызова есть ошибки, Excel вернет значения ошибок в ваши ячейки, даже не вызывая подпрограммы VBA.