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****
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.
ResponderBorrarSaludos JASR
de RCR
De nada. Muchas Gracias por tu visita.
Borrar