Выполнение макроса, имя которого записано текстовой строкой
Есть строка, нужно выполнить макрос, записанный в строке. Пишу Evaluate(S + "()") – макрос вызывается ДВАЖДЫ. Если скобки убрать, то вообще не вызывается. В чём причина и как сделать правильно?
Public Sub Test()
[A1] = [A1] + 1
End Sub
Public Sub Кнопка1_Щелчок()
Dim S As String
S = "Test"
Evaluate (S + "()")
End Sub
Ответы (3 шт):
Согласно справке, Evaluate конвертирует имя в объект либо значение. Насчёт иных применений ничего не сказано. Процедура Test - не объект, и она не имеет значения. И спрашивать, почему недокументированное применение работает не так, как хочется - бессмысленно.
Public Function Test()
Test = [A1] + 1
End Function
Public Sub Кнопка1_Щелчок()
Dim S As String
S = "Test"
[A1] = Evaluate(S & "()")
End Sub
Решил проблему следующим образом:
ActiveSheet.Evaluate(S + "()+0")
ActiveSheet (в отличие от Application) выполняет выражение единожды, а чтобы сделать его выражением, добавляем ноль.
Зачем так извращаться с Evaluate? Есть же метод, заточенный для запуска макросов или вызова функций:
Public Sub Test()
[A1] = [A1] + 1
End Sub
Public Sub Кнопка1_Щелчок()
Dim S As String
S = "Test"
Application.Run S
End Sub