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?

War es hilfreich?

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 ...

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top