Динамические вызовы функций в Excel VBA
Мне было любопытно, может ли быть способ вызова функций динамически. Например.
Sub foo1()
Debug.Print "in foo1"
End Sub
Sub foo2()
Debug.Print "in foo2"
End Sub
Есть ли способ, которым я могу сделать что-то вроде:
Sub callSomeFoo(i as Integer)
Call foo&i
End Sub
Или что-то вроде этого необходимо:
Sub callSomeFoo(i as Integer)
Select Case i
Case 1
Call foo1
Case Else
Call foo2
End Select
End Sub
Не насущный вопрос... просто любопытно. Также приветствуются любые другие креативные вещи, которые могут выполнять функции call wise.
Спасибо!
edit1:
Вот код, который у меня есть, и ошибка, указанная ниже:
Sub foo1()
Debug.Print "in foo1"
End Sub
Sub foo2()
Debug.Print "in foo2"
End Sub
Sub callSomeFoo()
Dim i%
'using a cell on the worksheet to determine the function. Happens to be "1"
i = Sheets("Sheet1").Range("A1").Value
'Line below works
Call foo1
'Line below gives me an error
Application.Run "foo"&i
End Sub
Ошибка:
Ошибка времени выполнения "1004" Невозможно запустить макрос "foo1". Макрос может быть недоступен в этой книге или все макросы могут быть отключены.
Ответы
Ответ 1
Вы хотите запустить метод!
Sub callSomeFoo(i as Integer)
Application.Run "foo" & i
End Sub
Но это не работает, VBA не нравится имя foo1
, и поэтому он не будет работать.
Это потому, что FOO1 также может быть ссылкой на ячейку. Первый аргумент Application.Run может быть объектом Range, поэтому он оценивает FOO1, считает это ячейка, и поскольку эта ячейка пуста, не знает, что делать. - Дик Куслайка
Это можно легко решить, выбирая более длинное имя метода.
Проведенный рабочий пример
Option Explicit
Public Sub TestDynamic1()
Debug.Print "TestDynamic 1"
End Sub
Sub TestDynamic2()
Debug.Print "TestDynamic 2"
End Sub
Private Sub TestDynamic3()
Debug.Print "TestDynamic 3"
End Sub
Sub callTestDynamic(i As Integer)
On Error GoTo DynamicCallError
Application.Run "TestDynamic" & i
Exit Sub
DynamicCallError:
Debug.Print "Failed dynamic call: " & Err.Description
End Sub
Public Sub TestMe()
callTestDynamic 1
callTestDynamic 2
callTestDynamic 3
callTestDynamic 4
End Sub