Подтвердить что ты не робот

Динамические вызовы функций в 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". Макрос может быть недоступен в этой книге или все макросы могут быть отключены.

4b9b3361

Ответ 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