Pregunta

Estoy usando VBA de Excel para escribir una UDF.Me gustaría sobrecarga de mi propia UDF con un par de versiones diferentes de forma que los distintos argumentos de llamada diferentes funciones.

Como VBA no parece apoyar esto, alguien podría sugerir una buena, no desordenado manera de lograr el mismo objetivo?Debo ser el uso de argumentos Opcionales o hay una mejor manera?

¿Fue útil?

Solución

Declarar sus argumentos como Optional Variants, entonces usted puede probar para ver si se está perdiendo el uso de IsMissing() o compruebe su tipo de uso TypeName(), como se muestra en el siguiente ejemplo:

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

Esto puede ser llamado desde una hoja de cálculo como =FOO(), =FOO(número de), o =FOO("cadena").

Otros consejos

Si se puede distinguir por el número de parámetro, entonces algo como esto:

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

Si la única manera de distinguir la función es de tipo, entonces usted está efectivamente va a tener que hacer lo que C++ y otros lenguajes con reemplazado funciones, que es llamada por la firma.Te sugiero hacer la llamada, verá algo como esto:

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

y la creación de una clase con un número de métodos que coinciden con las firmas que esperar.Usted probablemente tendrá algunos errores de manejo, sin embargo, y se advirtió que los tipos que son reconocibles son limitadas:las fechas son TypeName Doble, por ejemplo.

VBA es desordenado.No estoy seguro de que hay una manera fácil de hacer una falsa sobrecargas:

En el pasado he utilizado ya sea un montón de Opciones, o se utilizan variadas funciones.Por ejemplo

Foo_DescriptiveName1()

Foo_DescriptiveName2()

Yo diría que ir con los argumentos Opcionales que han sensibles valores, a menos que la lista de argumentos que se va a poner tonto, a continuación, crear diferentes funciones de llamada para sus casos.

Usted mighta también desee considerar el uso de un tipo de datos variant para sus argumentos de la lista y, a continuación, averiguar qué es lo que el tipo de uso de la instrucción TypeOf y, a continuación, llamar a las funciones adecuadas cuando usted averiguar qué es lo que...

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top