Excel VBA: Spesielle typer - Fungerer som argumenter av funksjoner

stemmer
17

Det er ingen spesiell type for funksjoner i VBA. Det er vanskelig for meg å se hvordan du kan legge til funksjoner som argumenter til funksjoner i Excel VBA.

Det jeg prøver å oppnå er noe sånt som dette:

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

Foreløpig har jeg en gruppe av små funksjoner alle å gjenta seg selv, men med en samtale til en bestemt funksjon.

Publisert på 13/07/2009 klokken 08:48
kilden bruker
På andre språk...                            


3 svar

stemmer
13

Fra koden, tar funksjon g en streng parameter og returnerer en streng. Jeg foreslår at du oppretter en klasse modul kalt IStringFunction å fungere som definisjonen av et grensesnitt som alle funksjoner vil støtte, slik:

Klasse Modul: IStringFunction

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

Deretter oppretter du et par eksempler på funksjoner som implementerer dette grensesnittet:

Klasse Modul: HelloStringFunction

Implements IStringFunction

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

Klasse Modul: GoodbyeStringFunction

Implements IStringFunction

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

... og til slutt, noen test kode for å utøve de funksjoner:

(Standard) Modul: Test

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

Legg merke til at klassen implementerer grensesnittet må ha metoder navngitt <Interface>_<Method>som i eksempelet ovenfor, ikke bare <Method>som du forventer.

Last ned enkel demo eller mellom demo her

Svarte 13/07/2009 kl. 09:00
kilden bruker

stemmer
16

Siden VBA har sine røtter i en interaktiv språk, det har alltid hatt evnen til å utføre tekst:

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)
Svarte 21/11/2012 kl. 08:30
kilden bruker

stemmer
0

Det er mulig å passere en funksjon som et argument , og få akkurat den atferden du er ute etter, men det er litt Hacky. Dette oppnås ved å utnytte standard tilhører en klasse,

Lage en klasse myFunctionsom inneholder din funksjon

Public Function sayHi(ByVal s As String) As String
    sayHi = "Hi " & s
End Function

Eksportere den, og åpne .cls filen i en teksteditor

Du skal se et sted i filen, en linje som definerer din funksjon

Public Function sayHi(ByVal s As String) As String

Under det, legger du til linjen Attribute Value.VB_UserMemId = 0, så nå ser det ut som dette:

Public Function sayHi(ByVal s As String) As String
Attribute Value.VB_UserMemId = 0
    sayHi = "Hi " & s
End Function

Det du har gjort her er å merke sayHisom standard egenskap av klassen. Nå kan du ringe funksjon av klasse objektet alene class(args), heller ennclass.function(args)

Lagre den endrede filen og importere den inn i VBA-prosjekt

test modul

Sub test()
    Dim parameterFunction As Object         'this is what we'll be passing to our routine
    Set parameterFunction = New myFunction  'create instance of the function object
    MsgBox f(parameterFunction, "Greedo")
End Sub

Function f(ByVal g As Object, ByVal x As String) As String
        f = g(x)
End Function

* NB, denne måten kan du passere noen funksjon; men du kan i stedet angi ByVal g As IStringFunctionå få bare den delen med riktig grensesnitt som per Gary McGill svar

Svarte 07/03/2018 kl. 15:18
kilden bruker

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more