Überladen von Funktionen und UDF in Excel VBA
-
09-06-2019 - |
Frage
Ich verwende Excel VBA ein UDF schreiben. Ich möchte meine eigenen UDF mit ein paar verschiedenen Versionen zu überlasten, so dass unterschiedliche Argumente unterschiedliche Funktionen aufrufen wird.
Wie VBA scheint nicht, dies zu unterstützen, jemand einen guten, nicht-chaotisch Weg zur Erreichung des gleiche Ziels vorschlagen könnte? Soll ich Optionale Argumente verwenden, oder gibt es einen besseren Weg?
Lösung
Erklären Sie Ihre Argumente als Optional Variants
, dann können Sie testen, um zu sehen, ob sie IsMissing()
verwenden sind vermisst oder überprüfen ihre Art TypeName()
verwenden, wie im folgenden Beispiel gezeigt:
Public Function Foo(Optional v As Variant) As Variant
If IsMissing(v) Then
Foo = "Missing argument"
ElseIf TypeName(v) = "String" Then
Foo = v & " plus one"
Else
Foo = v + 1
End If
End Function
Dies kann aus einem Arbeitsblatt als = foo () , = FOO ( Zahl ) oder = FOO aufgerufen werden ( " string ") .
Andere Tipps
Wenn Sie mit dem Parameter-Zählern unterscheiden können, dann so etwas wie dies funktionieren würde:
Public Function Morph(ParamArray Args())
Select Case UBound(Args)
Case -1 '' nothing supplied
Morph = Morph_NoParams()
Case 0
Morph = Morph_One_Param(Args(0))
Case 1
Morph = Two_Param_Morph(Args(0), Args(1))
Case Else
Morph = CVErr(xlErrRef)
End Select
End Function
Private Function Morph_NoParams()
Morph_NoParams = "I'm parameterless"
End Function
Private Function Morph_One_Param(arg)
Morph_One_Param = "I has a parameter, it's " & arg
End Function
Private Function Two_Param_Morph(arg0, arg1)
Two_Param_Morph = "I is in 2-params and they is " & arg0 & "," & arg1
End Function
Wenn der einzige Weg, um die Funktion zu unterscheiden von Arten ist, dann sind Sie effektiv gehen zu müssen, tun, was C ++ und andere Sprachen mit überschriebenen Funktionen zu tun, das durch Unterschrift zu nennen ist. Ich würde vorschlagen, der Anruf in etwa so aussehen zu machen:
Public Function MorphBySig(ParamArray args())
Dim sig As String
Dim idx As Long
Dim MorphInstance As MorphClass
For idx = LBound(args) To UBound(args)
sig = sig & TypeName(args(idx))
Next
Set MorphInstance = New MorphClass
MorphBySig = CallByName(MorphInstance, "Morph_" & sig, VbMethod, args)
End Function
und eine Klasse mit einer Reihe von Methoden zu schaffen, die die Signaturen Sie erwarten lassen. Sie werden wahrscheinlich aber einige Fehlerbehandlung benötigen und davor gewarnt, dass die Typen, die erkennbar sind, sind begrenzt. Termine sind Type-Name doppelt, zum Beispiel
VBA ist chaotisch. Ich bin mir nicht sicher, es ist eine einfache Möglichkeit, gefälschte Überlastungen zu tun:
In der Vergangenheit habe ich entweder verwendet viele Optionals oder verwendet vielfältige Funktionen. Zum Beispiel
Foo_DescriptiveName1()
Foo_DescriptiveName2()
würde ich mit Optionale Argumenten gehen sagen, dass sinnvolle Standardwerte haben, wenn die Argumentliste ist dumm in Gang bringen, dann separate Funktionen erstellen für Ihre Fälle zu nennen.
Sie mighta wollen auch eine Variante Datentyp für Ihre Argumente Liste prüfen und anschließend herauszufinden, was ist das, was die TypeOf Anweisung geben Sie verwenden und dann die entsprechenden Funktionen aufrufen, wenn Sie herausfinden, was ist das, was ...