una todos personalizadas personalizada para los libros guardar funciones funcion ejemplos crear como agregar excel excel-vba user-defined-functions vba

todos - public function vba excel



FunciĆ³n de sobrecarga y UDF en Excel VBA (4)

Si puede distinguir por conteo 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 forma de distinguir la función es por tipos, entonces efectivamente tendrá que hacer lo que hace C ++ y otros lenguajes con funciones anuladas, que es llamar por firma. Sugeriría que la llamada se vea así:

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 crear una clase con una cantidad de métodos que coincidan con las firmas que espera. 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.

Estoy usando Excel VBA para escribir un UDF. Me gustaría sobrecargar mi propia UDF con un par de versiones diferentes para que los diferentes argumentos invoquen diferentes funciones.

Como VBA no parece respaldar esto, ¿alguien podría sugerir una forma buena y no desordenada de lograr el mismo objetivo? ¿Debería usar argumentos opcionales o hay una mejor manera?


También podría considerar usar un tipo de datos variantes para su lista de argumentos y luego averiguar qué tipo de tipo utiliza la instrucción TypeOf, y luego llamar a las funciones apropiadas cuando descubra qué es qué ...


VBA es desordenado No estoy seguro de que haya una manera fácil de hacer sobrecargas falsas:

En el pasado, he usado muchos Opcionales o he utilizado funciones variadas. Por ejemplo

Foo_DescriptiveName1() Foo_DescriptiveName2()

Yo diría que vaya con los argumentos opcionales que tienen valores predeterminados razonables a menos que la lista de argumentos se vuelva estúpida, luego cree funciones separadas para llamar a sus casos.


Declare sus argumentos como Optional Variants , luego puede probar para ver si faltan usando IsMissing() o verifique su tipo usando 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 se puede llamar desde una hoja de trabajo como = FOO () , = FOO ( número ) o = FOO (" cadena ") .