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

Excel vba: специальные типы - функции как аргументы функций

В VBA нет специального типа для функций. Мне сложно понять, как добавлять функции в качестве аргументов в функции в Excel VBA.

То, что я пытаюсь выполнить, выглядит примерно так:

function f(g as function, x as string) as string
        f = g(x)
end function

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

4b9b3361

Ответ 1

Из вашего кода функция g принимает строковый параметр и возвращает строку. Я предлагаю вам создать модуль класса, называемый IStringFunction, в качестве определения интерфейса, который все функции будут поддерживать, таким образом:

Модуль класса: IStringFunction

Public Function Evaluate(ByVal s As String) As String
End Function

Затем создайте пару примерных функций, реализующих этот интерфейс:

Модуль класса: HelloStringFunction

Implements IStringFunction

Public Function IStringFunction_Evaluate(ByVal s As String) As String
    IStringFunction_Evaluate = "hello " & s
End Function

Модуль класса: GoodbyeStringFunction

Implements IStringFunction

Public Function IStringFunction_Evaluate(ByVal s As String) As String
    IStringFunction_Evaluate = "goodbye " & s
End Function

... и, наконец, некоторый тестовый код для выполнения функций:

(стандартный) Модуль: тест

Sub Test()

    Dim oHello As New HelloStringFunction
    Dim oGoodbye As New GoodbyeStringFunction

    MsgBox Evaluate(oHello, "gary")
    MsgBox Evaluate(oGoodbye, "gary")

End Sub

Private Function Evaluate(ByVal f As IStringFunction, ByVal arg As String) As String
    Evaluate = f.Evaluate(arg)
End Function

Обратите внимание, что класс, реализующий интерфейс, должен иметь методы с именем <Interface>_<Method>, как в приведенном выше примере, а не только <Method>, как вы ожидали.

Загрузите простое демо или промежуточная демонстрация здесь

Ответ 2

Поскольку VBA имеет корни в интерактивном языке, он всегда имел возможность выполнять текст:

function f(g as string, x as string) as string
        f = application.run(g,x)
end function

MyStringA = f("functionA",string1)
MyStringB = f("functionB",string1)