Es ist möglich, eine Funktion zu übergeben ein Argument, und erhalten genau das Verhalten, das Sie suchen, aber es ist ein bisschen hacky. Dies wird durch Ausnutzen der Standardeigenschaft einer Klasse erreicht,
Erstellen Sie eine Klasse myFunction
Ihre Funktion enthält
Public Function sayHi(ByVal s As String) As String
sayHi = "Hi " & s
End Function
Export es, und öffnen Sie die.cls-Datei in einem Texteditor
Sie sollten irgendwo in der Datei, eine Linie, die Ihre Funktion
Public Function sayHi(ByVal s As String) As String
Darunter definiert, fügen Sie die Zeile Attribute Value.VB_UserMemId = 0
, so dass es jetzt so aussieht:
Public Function sayHi(ByVal s As String) As String
Attribute Value.VB_UserMemId = 0
sayHi = "Hi " & s
End Function
Was Sie hier getan haben, ist sayHi
als default property der Klasse zu markieren. Jetzt können Sie die Funktion, die durch das Klassenobjekt aufrufen allein class(args)
, anstatt class.function(args)
Speichern Sie die geänderte Datei und importieren Sie es in Ihrem VBA-Projekt
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, diese So kannst du jede Funktion bestehen; aber Sie können stattdessen ByVal g As IStringFunction
angeben, um nur die Teilmenge mit der richtigen Schnittstelle nach Gary McGill's answer
zu bekommen Das hilft ihm nicht wirklich, weil er noch eine separate Bewertungsfunktion für jede Klasse schreiben muss. – Treb
@Treb: vielleicht verstehe ich die Frage nicht, aber ich verstehe nicht, was du meinst. Jede Klasse repräsentiert eine andere Funktion, also muss sie natürlich eine separate Bewertungsfunktion haben! Vielleicht wäre es klarer, wenn das Problem neu formuliert werden könnte. –
Hallo, ich denke das ist die richtige Antwort. Dies ist der Weg, es in Oo-Sprachen zu tun, ich wusste nur nicht, dass Schnittstellen in VBA existieren - mein Fehler. Ich erinnere mich, diese Technik das erste Mal in * einem kleinen Java * gesehen zu haben. Aber ich muss die vorgeschlagene Lösung testen. Im Moment habe ich eine Fehlermeldung erhalten, dass die Schnittstelle nicht implementiert wurde. Public Function (ByVal tmp As Variant) As End Function --- Implementiert IBooleanFunction Public Function Boolean gelten gelten (ByVal tmp As Variant) As Boolean gelten = Application.IsText (tmp) End Function –