Funksjon Overbelastning og UDF i Excel VBA

stemmer
26

Jeg bruker Excel VBA til en skrive en UDF. Jeg ønsker å overbelaste min egen UDF med et par forskjellige versjoner slik at ulike argumenter vil kalle ulike funksjoner.

Som VBA ser ikke ut til å støtte dette, kan noen foreslå en god, ikke-rotete måte å oppnå det samme målet? Bør jeg bruke Valgfrie argumenter eller er det en bedre måte?

Publisert på 15/09/2008 klokken 14:28
kilden bruker
På andre språk...                            


4 svar

stemmer
0

VBA er rotete. Jeg er ikke sikker på at det er en enkel måte å gjøre falske overbelastning:

I det siste har jeg enten brukt masse Tilleggsutstyr eller brukt varierte funksjoner. For eksempel

Foo_DescriptiveName1()

Foo_DescriptiveName2()

Jeg vil si gå med valgfrie argumenter som har fornuftige mislighold med mindre argumentlisten kommer til å få dumme, og deretter opprette separate funksjoner for å ringe din tilfeller.

Svarte 15/09/2008 kl. 14:35
kilden bruker

stemmer
0

Du mighta også være lurt å vurdere å bruke en variant datatype for argumenter listen, og deretter finne ut hva som er hva skrive ved hjelp av typeof uttalelse, og deretter ringe de riktige funksjonene når du finne ut hva som er hva ...

Svarte 15/09/2008 kl. 15:42
kilden bruker

stemmer
48

Erklærer dine argumenter som Optional Variants, så kan du teste for å se om de mangler hjelp IsMissing()eller sjekke type med TypeName(), som vist i følgende eksempel:

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

Dette kan kalles fra et regneark som = FOO () , = FOO ( nummer ) , eller = FOO ( " string ") .

Svarte 16/09/2008 kl. 06:59
kilden bruker

stemmer
5

Hvis du kan skille ved parameter teller, så noe sånt som dette ville fungere:

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

Hvis den eneste måten å skille funksjonen er av typer, så du effektivt nødt til å gjøre det som C ++ og andre språk med styres funksjoner gjøre, som er å ringe ved underskrift. Jeg vil foreslå å gjøre samtalen ser omtrent slik ut:

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

og skape en klasse med en rekke metoder som samsvarer med signaturer du forventer. Du vil sannsynligvis trenge noen feilhåndtering skjønt, og bli advart om at de typene som er gjenkjennelig er begrenset: datoer er type-Double, for eksempel.

Svarte 16/09/2008 kl. 08:51
kilden bruker

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