Domanda

Sto utilizzando Excel VBA per scrivere un UDF.Vorrei sovraccaricare la mia UDF con un paio di versioni diverse in modo che argomenti diversi chiamino funzioni diverse.

Poiché VBA non sembra supportarlo, qualcuno potrebbe suggerire un modo valido e non disordinato per raggiungere lo stesso obiettivo?Dovrei utilizzare argomenti facoltativi o esiste un modo migliore?

È stato utile?

Soluzione

Dichiara le tue argomentazioni come Optional Variants, quindi puoi verificare se mancano utilizzando IsMissing() o controlla il loro tipo utilizzando TypeName(), come mostrato nell'esempio seguente:

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

Questo può essere chiamato da un foglio di lavoro come =PIPPIO(), =PIPPIO(numero), O =PIPPO("corda").

Altri suggerimenti

Se riesci a distinguere in base al conteggio dei parametri, qualcosa del genere funzionerebbe:

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

Se l'unico modo per distinguere la funzione è in base ai tipi, allora dovrai effettivamente fare ciò che fanno C++ e altri linguaggi con funzioni sovrascritte, ovvero chiamare per firma.Suggerirei di rendere la chiamata simile a questa:

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

e creare una classe con una serie di metodi che corrispondono alle firme previste.Probabilmente avrai bisogno di una certa gestione degli errori e tieni presente che i tipi riconoscibili sono limitati:le date sono TypeName Double, ad esempio.

VBA è disordinato.Non sono sicuro che esista un modo semplice per eseguire sovraccarichi falsi:

In passato ho utilizzato molti optional o utilizzato varie funzioni.Ad esempio

Foo_DescriptiveName1()

Foo_DescriptiveName2()

Direi di utilizzare argomenti opzionali che abbiano valori predefiniti sensati a meno che l'elenco degli argomenti non diventi stupido, quindi creare funzioni separate per richiamare i tuoi casi.

Potresti anche prendere in considerazione l'utilizzo di un tipo di dati variante per il tuo elenco di argomenti e poi capire qual è il tipo utilizzando l'istruzione TypeOf, quindi chiamare le funzioni appropriate quando capisci cosa è cosa...

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top