Asignar descripción a Función Definida por el Usuario

Excel no sólo es famoso por poseer un gran número de funciones integradas que pueden servir literalmente para resolver muchos problemas con los datos; por el contrario, también lo es porque nos permite escribir nuestras propias funciones mediante el entorno Visual Basic para Aplicaciones o VBA.

Cuando un programador de esta aplicación decide escribir funciones que pueden usarse desde la interfaz de usuario estamos hablando de UDFs o Funciones Definidas por el Usuario.

Las UDFs al igual que las funciones integradas pueden procesar los datos y devolver un resultado; sin embargo, una diferencia con las UDFs respecto de las funciones integradas, es que las primeras no muestran por default una ayuda al usuario cuando este quiere utilizarlas mediante el cuadro de dialogo Insertar función.

Por ejemplo, suponga que implementamos una función (UDF) para el tratamiento de cadenas alfanuméricas con VBA en Excel; Una función con dos argumentos que extrae de cadenas de texto que posiblemente tengan números, únicamente sus números y los separa con un carácter separador de manera opcional.

UDF para extraer los números de una cadena alfanumérica - Ver resolución

Public Function NumerosSeparador(Cadena As String, Optional Separador As String = "") As Variant
   Dim LargoCadena As Long
   Dim i As Long
   Dim Caracter As Variant
   Dim Resultado As Variant
   Dim Marca As Boolean

   If Cadena = "" Then
      NumerosSeparador = VBA.CVErr(xlErrNull)
      Exit Function
   End If
   LargoCadena = VBA.Len(Cadena)
   Marca = False
   For i = 1 To LargoCadena
      Caracter = VBA.Mid(Cadena, i, 1)
      If VBA.IsNumeric(Caracter) And Separador = "" Then
         Resultado = Resultado & Caracter
      Else
         If VBA.IsNumeric(Caracter) Then
            Resultado = Resultado & Caracter
            Marca = True
         ElseIf Marca Then
            Resultado = Resultado & Separador
            Marca = False
         End If
      End If
   Next i
   If VBA.IsEmpty(Resultado) Then
      NumerosSeparador = VBA.CVErr(xlErrNA)
   ElseIf Separador = "" Or Marca Then
      NumerosSeparador = Resultado
   Else
      NumerosSeparador = VBA.Mid(Resultado, 1, VBA.Len(Resultado) - VBA.Len(Separador))
   End If
End Function

Si únicamente se implementara esta función dentro de un módulo en VBA del Excel, con total certeza no obtendremos la ayuda correspondiente en los cuadros de dialogo Insertar función y Argumentos de función que las funciones tradicionales si muestran (clic para ampliar).


Una manera efectiva para solucionar este inconveniente es crear un Procedimiento Sub que cargue mediante el método MacroOptions del objeto Application, todos los componentes descriptivos de la UDF.

Procedimiento Sub para cargar el componente descriptivo de la UDF

Sub EjecutarAlAbrir()
   Dim NombreDeLaFuncion As String
   Dim DescripcionDeLaFuncion As String
   Dim CategoriaDeLaFuncion As Variant
   Dim DescripcionDeLosArgumentos(1 To 2) As String

   NombreDeLaFuncion = "NumerosSeparador"
   DescripcionDeLaFuncion = "Devuelve los números de una cadena " & _
     "alfanumérica con un carácter separador opcional."
   CategoriaDeLaFuncion = "Tratamiento de cadenas"
   DescripcionDeLosArgumentos(1) = "Referencia de celda que " & _
     "contiene una cadena alfanumérica."
   DescripcionDeLosArgumentos(2) = "Opcional. Carácter separador " & _
     "por el cual se dividirá el número resultante."
   Application.MacroOptions Macro:=NombreDeLaFuncion, _
     Description:=DescripcionDeLaFuncion, Category:=CategoriaDeLaFuncion, _
     ArgumentDescriptions:=DescripcionDeLosArgumentos
End Sub

Cada componente descriptivo de la UDF puede cargarse en una variable independiente dentro del método MacroOptions; Incluso puede anclarse la función dentro de una categoría personalizada o una categoría ya existente. Si se trata de una categoría personalizada sólo deberá especificarse el nombre de la nueva categoría; en cambio si se trata de una categoría existente deberá usarse un valor numérico de la siguiente tabla (clic para ampliar).


Ejecutar el Procedimiento Sub hará que los componentes descriptivos se carguen en los cuadros de dialogo correspondientes al momento de usar a la función en la interfaz de usuario, sin embargo, si cierra y abre el libro de Excel nuevamente estos componentes se perderán. La solución más recomendable es ejecutar el Procedimiento Sub que carga a los componentes descriptivos cada que se abra el libro de Excel; esto puedes lograrlo si llamas al procedimiento desde el evento Open del objeto ThisWorkbook.

Ejecutar el Procedimiento Sub al abrir el libro de Excel

Private Sub Workbook_Open()
   Call Apertura.EjecutarAlAbrir
End Sub

Así, todo quedará más entendible para un usuario final cuando quiera usar las UDFs que usted haya programado para hacerle la vida más fácil.

El método que implementa la carga de los componentes descriptivos de una función (UDF) se implementó por Sergio Alejandro Campos – EXCELeINFO.


No hay comentarios.:

Publicar un comentario