Страницы: 1
RSS
Узнать имя книги откуда была запущена процедура
 
Всем привет.

Столкнулся с необходимостью узнать источник запуска макроса. Понимаю, что нужно делать через Application.Caller, но что-то у меня ошибка вылезает.
Код
Sub NextIfNoAction()

Dim Wbn As String
Wbn = Application.Caller.Worksheet.Parent.Name
If Wbn = "Update" Then
Call UserForm2.CommandButton1_Click
Else
End If

End Sub
Можете подсказать, где собака зарыта?
 
начните с этого
Код
Set ac = Application.Caller

изучайте в режиме отладки содержимое ас и продвигайтесь по свойствам ас до нужного вам параметра
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете!
 
Ігор Гончаренко,
яснее не стало.

Код
Set ac = Application.Caller
MsgBox ac


Ошибка. Что не так делаю?
 
Breathe of fate, здравствуйте
Имя книги (или надстройки), из которой был запущен макрос: ThisWorkbook.Name
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
 
ставьте точку останова, смотрите содержимое ас в окнах Watches или Locals
там же и увидите есть у ас свойство Worksheet или нет
Изменено: Ігор Гончаренко - 15.02.2022 12:46:40
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете!
 
Jack Famous,

Код
Sub NextIfNoAction()

Dim Wbn As String
Wbn = Application.Caller.Worksheet.Parent.Name(external:=True)
If Wbn = ThisWorkbook.Path & "Update.xlsm" Then
Call UserForm2.CommandButton1_Click
Else
End If

End Sub

Ну если так, то тоже ошибка.
Изменено: Breathe of fate - 15.02.2022 12:32:58
 
Breathe of fate, ошибка точно НЕ в ThisWorkbook.Path
Я ХЗ, что вы там хотите делать - просто ответил на вопрос, как узнать имя книги
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
 
Jack Famous,
мне нужно узнать имя книги в которой сработал макрос, который открыл в свою очередь ЭТУ книгу.

Application.Caller.ThisWorkbook.Name так же выдаёт ошибку.
Изменено: Breathe of fate - 15.02.2022 13:21:10
 
похоже, ничего у вас не получится (с помощью Application.Caller - точно!)
читайте тут когда можно добиться взаимности от Caller
Изменено: Ігор Гончаренко - 15.02.2022 14:07:08
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете!
 
Ігор Гончаренко,
да читал. У меня в примере из статьи мессаджбокс выдаёт ошибку. Без понятия, что случилось.

То, что хотел смог реализовать через поиск файла и условие открыт ли файл, и если да, то выполнять макрос.
 
Цитата
написал:
мне нужно узнать имя книги в которой сработал макрос
для начала нужно рассказать, откуда он запускается. Если запуск идет из другого макроса или через Alt+F11 - то о каком Caller может быть вообще речь? Он не определяет такие вызовы. Он применяется при вызове с кнопки и внутри UDF.
P.S. Вот здесь более-менее подробно описывал про Caller: Кто вызвал функцию или процедуру?
Изменено: Дмитрий(The_Prist) Щербаков - 15.02.2022 14:47:01
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
 
Цитата
Breathe of fate написал:
да читал.
нужно прочитать еще раз внимательно, чтобы понимать что есть масса ситуаций, в которых Caller возвращает ошибку и ничего более(((
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете!
 
Здравствуйте. Почитал про Caller, походу он не подойдет. А если взять просто ActiveWorkbook.Name.
 
Дмитрий(The_Prist) Щербаков,
из другого файла. Один файл имеет в себе макрос, который открывает все файлы в папке и в каждом вызывает макрос, находящийся в файле (который открывается).

DANIKOLA,
ну по факту я так и сделал - прописал условие, что если файл открыт, то бла-бла-бла. Но это всё равно костыль.
Изменено: Breathe of fate - 17.02.2022 09:10:46
 
Цитата
Breathe of fate написал:
из другого файла
ну так
Цитата
Дмитрий(The_Prist) Щербаков написал:
Если запуск идет из другого макроса или через Alt+F11 - то о каком Caller может быть вообще речь? Он не определяет такие вызовы.
Непонятно, с чего Вы вообще решили в этом случае Caller применить. Здесь он не поможет. Да и вообще - как ни крути, но все методы будут костыльными, если хотите запускать макрос, находящийся в другой книге и из него узнать имя книги, которая макрос запустила. самый надежный по сути - это перед запуском записывать имя запускающей книги в некий временный файл, а в подчиненной книге кодом считывать этот файл. Потом удалять файл. Нюансов здесь тоже много: начиная от метода вызова макроса(OnTime или Run) и заканчивая тем, работает ли вызываемый макрос помимо этого самостоятельно, без сторонних вызовов.
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
 
похоже, что главный костыль в этой системе - необходимость запускать макросы в каждом открываемом файле
а если макросы отличаются друг от друга только тем, что лежат в другом файле - то это уже не костыль, а пятая нога у собаки (почему-то у меня устойчивое подозрение что именно так все и есть)
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете!
Страницы: 1
Наверх