2014-10-29 2 views
2

Я пытаюсь написать макрос, который имеет часть, которая реагирует по-разному в зависимости от того, вызвана ли она непосредственно из кнопки на листе или косвенно вызвана из другого макроса. Я также хочу иметь возможность реагировать по-разному в зависимости от того, что вызвал другой макросКак программно найти то, что вызвало макрос

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

Есть ли способ сделать это?

+2

Может быть 'Application.Caller' можно использовать? [link] (http://msdn.microsoft.com/en-us/library/ff193687.aspx) – Socii

+0

@Sociithat: Это правильный ответ. :) Я собирался опубликовать ответ с этим. Вы можете опубликовать его в качестве ответа. Добавьте также пример кода: D –

+0

Это не даст вам имя вызывающего макроса. – Rory

ответ

4

Вы можете сделать это, передав аргументы подпрограмм. Вот очень простой пример:

Sub test(number, displayMessage) 
MsgBox ("The number is " & number) 
If displayMessage Then MsgBox ("You ran the B sub") 
End Sub 

Sub aSub() 
Call test(4, False) 
End Sub 

Sub bSub() 
Call test(7, True) 
End Sub 

Попробуйте запустить как Asub и bSub. Надеюсь, это помогло.

+0

Так я предпочитаю это делать. Имейте отдельную процедуру входа для каждой точки входа, а не одну процедуру для каждой точки входа. Для меня он сохраняет код чище и проще в обслуживании. –

+0

Думаю, мне, возможно, придется это сделать. Наверное, я надеялся, что есть что-то похожее на 'Application.Caller', которое покажет вызывающий sub, но я начинаю думать, что этого не существует. – wrcathey

1

Вот один способ, который будет работать для формы/Процедуры

Dim SSub As String 

Sub Sample() 
    On Error Resume Next 
    SSub = Application.Caller '<~~ Already suggested by @Socii 
    On Error GoTo 0 

    Debug.Print "This procedure was called by " & SSub 
End Sub 

Sub Example() 
    SSub = "Example" '~~> (Also see the link below) 
    Sample 
End Sub 

Вы также можете прочитать THIS, если вы хотите взять его на другой уровень. :)

Смежные вопросы