Выполнение макроса, имя которого записано текстовой строкой

Есть строка, нужно выполнить макрос, записанный в строке. Пишу Evaluate(S + "()") – макрос вызывается ДВАЖДЫ. Если скобки убрать, то вообще не вызывается. В чём причина и как сделать правильно?

Public Sub Test()
    [A1] = [A1] + 1
End Sub
 
Public Sub Кнопка1_Щелчок()
    Dim S As String
    S = "Test"
    Evaluate (S + "()")
End Sub

Ответы (3 шт):

Автор решения: Akina

Согласно справке, Evaluate конвертирует имя в объект либо значение. Насчёт иных применений ничего не сказано. Процедура Test - не объект, и она не имеет значения. И спрашивать, почему недокументированное применение работает не так, как хочется - бессмысленно.

Public Function Test()
    Test = [A1] + 1
End Function
 
Public Sub Кнопка1_Щелчок()
    Dim S As String
    S = "Test"
    [A1] = Evaluate(S & "()")
End Sub
→ Ссылка
Автор решения: Eugene Krasnikov

Решил проблему следующим образом: ActiveSheet.Evaluate(S + "()+0") ActiveSheet (в отличие от Application) выполняет выражение единожды, а чтобы сделать его выражением, добавляем ноль.

→ Ссылка
Автор решения: vikttur

Зачем так извращаться с Evaluate? Есть же метод, заточенный для запуска макросов или вызова функций:

Public Sub Test()
    [A1] = [A1] + 1
End Sub
 
Public Sub Кнопка1_Щелчок()
    Dim S As String
    
    S = "Test"
    Application.Run S
End Sub
→ Ссылка