La Sobrecarga de funciones y UDF en Excel VBA
-
09-06-2019 - |
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?
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...