viernes, 25 de septiembre de 2015

Como crear Funciones Personalizadas con VBA Excel.



Hola, en el articulo de hoy aprenderemos como crear funciones personalizadas desde Excel utilizando VBA. Esta posibilidad que nos brinda Excel es una poderosa herramienta a la hora de hacer cálculos complicados, y que fácilmente los podemos automatizar con la creación de una función personalizada y que podemos guardar en un archivo complemento de Excel para que este disponible cada vez que utilicemos Excel, recuerden que los archivos complemento de Excel son los que se guardan con la extensión "*.xlam", o también puedes guardarlo en un archivo habilitado para macros los que se guarda con las extensión "*.xlsm" pero en este caso tendremos que abrir el archivo para poder utilizar la función que se hubiera guardado en el.


Bueno, lo primero que tenemos que hacer es crear un proyecto VBA y luego insertar un nuevo modulo, esto ya lo hemos visto en otros artículos relacionados, yo en mi caso a mi modulo lo llamare MyFuncion...


Para ejemplificar una función, tomaremos como ejemplo el articulo anterior a este, en el cual explique una forma personalizada de obtener la fecha de antigüedad con formulas en Excel si se dieron cuenta en la formula para obtener la antigüedad entre dos fechas, al final se hizo una formula un poquito grande, aunque una vez hecha es fácil de usar, bueno a lo que quiero llegar, es que haremos una función en VBA en la cual solo nos pida la Fecha de Inicio y la Fecha de Termino, y obtendremos los mismos resultados que con las funciones de Excel vistas en el articulo anterior, pero la diferencia es que esta Función es mucho mas corta.

Para que Excel reconozca como función Nuestra Función valga la redundancia, se identifica anteponiendo el nombre de Function y luego el nombre de la función, y en seguida los argumentos si los requiere, (Es necesario identificar el tipo de dato de los argumentos, si son numéricos, string, de fecha, boleanos), sino no es necesario, y al final debemos definir que tipo de resultado que devolverá, por lo que debemos indicar si sera de tipo string, fecha, numérico o Booleano, para este caso nuestra función será de tipo string, es decir devolverá una cadena de texto, con argumentos de tipo fecha.

Función NombreFuncion (argumento1, argumento2) as string

  "Aquí el procedimiento o algoritmo"

End Function

Aquí el código VBA que se utiliza en esta función:

'--------  INICIO DE LA FUNCION FECHA_ANTIGUEDAD  -------
'------------ Elaborada por Jorge A. Sanchez -------------
'Function FECHA_ANTIGUEDAD(FECHA INICIO,FECHA FINAL)

Function FECHA_ANTIGUEDADUEDAD(ByVal FI As Date,ByVal FF As Date) As String
     Dim ANIOS As Integer
     Dim MESES As Integer
     Dim DIAS As Integer
     Dim ULTIMOANIVERSARIO As Date
     Dim ULTIMOMES As Date
     
     If FI > FF Then
        FECHA_ANTIGUEDAD = "#ERROR EN FECHAS#"
        Exit Function
     End If
     
     ANIOS = DateDiff("yyyy", FI, FF)
     MESES = DateDiff("m", FI, FF)
     DIAS = DateDiff("d", FI, FF)
     If ANIOS >= 1 Then
        For i = 1 To ANIOS
           ULTIMOANIVERSARIO = DateAdd("yyyy", i, FI)
           If ULTIMOANIVERSARIO > FF Then
                ULTIMOANIVERSARIO = DateAdd("yyyy", i - 1, FI)
                ANIOS = ANIOS - 1
                Exit For
           End If
        Next
        MESES = DateDiff("m", ULTIMOANIVERSARIO, FF)
        If MESES >= 1 Then
        For m = 1 To MESES
            ULTIMOMES = DateAdd("m", m, ULTIMOANIVERSARIO)
            If ULTIMOMES > FF Then
                ULTIMOMES = DateAdd("m", m - 1, ULTIMOANIVERSARIO)
                MESES = MESES - 1
                Exit For
           End If
        Next
        DIAS = DateDiff("d", ULTIMOMES, FF)
            If DIAS >= 1 Then
                FECHA_ANTIGUEDAD = ANIOS & " Año(s), " & MESES & " mes(es) y " & DIAS & " dia(s)."
            Else
                FECHA_ANTIGUEDAD = ANIOS & " Año(s) y " & MESES & " mes(es)."
            End If
        Else
        DIAS = DateDiff("d", ULTIMOANIVERSARIO, FF)
            If DIAS >= 1 Then
                FECHA_ANTIGUEDAD = ANIOS & " Año(s) y " & DIAS & " dia(s)."
            Else
                FECHA_ANTIGUEDAD = ANIOS & " Año(s)."
            End If
        End If
     Else
        If MESES >= 1 Then
       For m = 1 To MESES
            ULTIMOMES = DateAdd("m", m, FI)
            If ULTIMOMES > FF Then
                ULTIMOMES = DateAdd("m", m - 1, FI)
                MESES = MESES - 1
                Exit For
           End If
        Next
        DIAS = DateDiff("d", ULTIMOMES, FF)
            If DIAS >= 1 Then
                FECHA_ANTIGUEDAD = MESES & " mes(es) y " & DIAS & " dia(s)."
            Else
                FECHA_ANTIGUEDAD = MESES & " mes(es)."
            End If
        Else
            DIAS = DateDiff("d", FI, FF)
            If DIAS >= 1 Then
                FECHA_ANTIGUEDAD = DIAS & " dia(s)."
            Else
                FECHA_ANTIGUEDAD = DIAS & " dia(s)."
            End If
        End If
     End If
End Function

Este es el código que utiliza un servidor, puede ser que haya otros mejores, pero por el momento a mi me sirve y me funciona correctamente este.

Una vez que guardamos el proyecto VBA en el archivo ya podemos llamarla como cualquier Función en una Formula de Excel, aquí la muestra..


La Función personalizada tiene tiene 2 argumentos de tipo fecha, el primer argumento es la FECHA INICIO y el segundo argumento es la FECHA TERMINO.
Y aquí la forma en que se le pasan los argumentos a la Función...


Al final de la entrada de los argumentos el resultado es el siguiente...


Si se dan cuenta esta Función hace lo mismo con la funciones anidadas de SIFECHA() de Excel en la formula del articulo anterior de Fecha de Antiguedad en Excel, con la diferencia que la formula era mas larga que con la Función personalizada.

Bueno, a partir de ahora ya podremos diseñar nuestras propias funciones que necesitemos y utilizar en todos nuestros libros de Excel.

Nota: Esta Función viene agregada en el complemento TabJASR.


Saludos Cordiales.

JASR
****Tranquilos que todo es correcto****

Share this

2 Respuestas a "Como crear Funciones Personalizadas con VBA Excel."

  1. Como siempre, gracias por compartir tus conocimientos; mis respetos. Excelente explicacion paso a paso para los que a penas empezamos a descubrir todo lo que tiene excel.
    Saludos JASR

    de RCR

    ResponderBorrar

Hola gracias por comentar.