Si se puede distinguir por el recuento de parámetros, entonces algo como esto funcionaría:
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 está por tipos, entonces usted va efectivamente a tener que hacer lo que C++ y otros lenguajes con funciones anuladas, que es llamar por firma. Yo sugeriría haciendo que el llamado 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 una serie de métodos que responden a las firmas que se pueden esperar. Sin embargo, es probable que necesite algún tipo de manejo de errores, y tenga en cuenta que los tipos que son reconocibles son limitados: las fechas son, por ejemplo, TypeName Double.
Gracias, eso suena como una buena manera de hacerlo. – Patrick
Joel, ¿es realmente usted a quien todos debemos agradecerle por tener Variant en VB/VBA? ;-) – Yarik
Sí. Era importante para Excel, ya que consideramos que todo lo que podría ir en una celda de hoja de cálculo debería poder ir en una variable Básica, de lo contrario, el simple acto de leer una celda tomaría varias líneas de código. –