Свойство Application.Caller в VBA Excel. Получение информации о том, как был вызван Visual Basic. Зависимость возвращаемого значения от ситуации.
Свойство Application.Caller
Определение свойства
Application.Caller в VBA Excel — это свойство, которое позволяет узнать, что именно вызвало выполнение текущей процедуры или пользовательской функции.Данное свойство может использоваться для определения источника вызова процедуры при работе с:
- пользовательскими функциями (UDF);
- макросами, назначенными на кнопки, изображения или фигуры;
- обработкой событий.
Возвращаемые значения
Значение, возвращаемое свойством Application.Caller, зависит от конкретной ситуации (тип возвращаемого значения — Variant):
| Вызывающая сторона | Возвращаемое значение |
|---|---|
| Пользовательская функция, введённая в одну ячейку | Объект Range, соответствующий ячейке с функцией |
| Пользовательская функция, которая является частью формулы массива в диапазоне ячеек | Объект Range, соответствующий диапазону ячеек с формулой массива |
| Макрос, назначенный фигуре или элементу управления формы на рабочем листе | Имя фигуры или элемента управления формы |
| Кнопка «Выполнить» из диалогового окна «Макрос», элементы управления ActiveX | Ошибка |
Важно: свойство
Application.Callerне работает с элементами управления ActiveX, размещённых как на рабочем листе, так и на пользовательской форме.
Примеры с Application.Caller
Простейшая пользовательская функция
|
1 2 3 |
Function MyFunc() MyFunc = Application.Caller.Address End Function |
Если ввести формулу =MyFunc() в ячейку B5, она вернёт $B$5.
Пример функции с вычислением
|
1 2 3 4 5 6 |
Function SumAbove() Dim r As Range Set r = Application.Caller ' Суммируем все ячейки от верхней границы текущего столбца до ячейки над Caller SumAbove = Application.Sum(Range(Cells(1, r.Column), r.Offset(-1, 0))) End Function |
Формула =SumAbove(), введённая в ячейку A10 просуммирует диапазон A1:A9.
Простейший макрос для кнопки
|
1 2 3 |
Sub MySub() MsgBox Application.Caller End Sub |
Назначьте данную процедуру элементу управления формы, фигуре или изображению, и, при клике, она вернёт имя объекта, запустившего её.
Результат работы кода:

Безопасная обработка вызова
Используйте проверку IsError(Application.Caller), если ваш макрос может быть запущен разными способами, иначе при ручном запуске вы получите ошибку выполнения (Run-time error).
|
1 2 3 4 5 6 7 8 |
Sub SafeMacro() ' Проверяем, является ли результат ошибкой If IsError(Application.Caller) Then MsgBox "Макрос запущен вручную (через диалог или горячую клавишу).", vbInformation Else MsgBox "Макрос вызван объектом: " & Application.Caller, vbInformation End If End Sub |
Макрос для множества фигур
Универсальный макрос для множества фигур, который меняет цвет нажатой фигуры:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
Sub ChangeButtonColor() Dim shapeName As String ' Проверяем, не вызван ли макрос из диалогового окна If IsError(Application.Caller) Then Exit Sub ' Получаем имя фигуры, которая вызвала макрос shapeName = Application.Caller ' Меняем цвет этой конкретной фигуры на зеленый ActiveSheet.Shapes(shapeName).Fill.ForeColor.RGB = vbGreen MsgBox "Вы нажали на фигуру с именем: " & shapeName End Sub |
Вам не нужно писать отдельный макрос для каждой из множества фигур. Один макрос понимает, какая именно фигура была нажата, благодаря Application.Caller.
Цвет фигуры изменится после закрытия информационного окна MsgBox.
Пример от разработчиков
Немного доработанный пример от разработчиков:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
Sub CallerDev() Dim v Select Case TypeName(Application.Caller) Case "Range" v = "Range: " & Application.Caller.Address Case "String" v = "Object: " & Application.Caller Case "Error" v = "Error" Case Else v = "Unknown" End Select MsgBox "Caller = " & v End Sub |
Результат работы кода:

Использование Application.Caller
Свойство Application.Caller можно использовать в следующих ситуациях:
- Когда нужна одна универсальная процедура для обработки нажатий на множество разных кнопок или фигур.
- Когда пользовательская функция должна «знать», в какой ячейке она вычисляется, чтобы считать данные из соседних ячеек (через
Offset). - Когда вы хотите вести лог (журнал) действий пользователя, фиксируя, откуда именно был запущен код.