Tabla de contenido
Como ya sabes cómo crear UDFs (y, espero, que también hayas probado a aplicarlas en tu Excel), vamos a profundizar un poco más y ver qué se puede hacer en caso de que tu función definida por el usuario no funcione.
Para resolver algunos problemas al crear una función personalizada, lo más probable es que necesite ejecutar una depuración. Así podrá estar seguro de que la función funciona correctamente.
Exploraremos las siguientes técnicas de depuración:
Cuando crea una función personalizada, siempre existe la posibilidad de que cometa un error. Las funciones personalizadas suelen ser bastante complejas. Y no siempre empiezan a funcionar correctamente de inmediato. La fórmula puede devolver un resultado incorrecto o el error #¡VALOR! A diferencia de las funciones estándar de Excel, no verá ningún otro mensaje.
¿Existe alguna forma de recorrer paso a paso una función personalizada para comprobar cómo funciona cada una de sus sentencias? ¡Claro! Para ello se utiliza la depuración.
Te ofreceré varias formas de depurar tu función personalizada para que elijas la que más te convenga.
Como ejemplo, utilizamos la función personalizada GetMaxBetween de uno de nuestros artículos anteriores que calcula el número máximo en el rango de valores especificado:
Function GetMaxBetween(rngCells As Range, MinNum, MaxNum) Dim NumRange As Range Dim vMax Dim arrNums() Dim i As Integer ReDim arrNums(rngCells.Count) For Each NumRange In rngCells vMax = NumRange Select Case vMax Case MinNum + 0.01 To MaxNum - 0.01 arrNums(i) = vMax i = i + 1 Case Else GetMaxBetween = 0 End Select Next NumRange GetMaxBetween = WorksheetFunction.Max(arrNums) End FunctionLos argumentos de la función son el rango de celdas donde se escriben los números, así como el límite superior e inferior de los valores.
Coloque la función MsgBox en lugares importantes
Para supervisar la ejecución de los cálculos, puede mostrar en la pantalla los valores de las variables más importantes en los lugares adecuados, mediante cuadros de diálogo emergentes.
MsgBox es un cuadro de diálogo que puede utilizar para mostrar algún tipo de mensaje al usuario.
La sintaxis de MsgBox es similar a la de otras funciones VBA:
MsgBox(prompt [, botones] [, título] [, helpfile, contexto])consulte es un argumento obligatorio. Contiene el mensaje que se ve en el cuadro de diálogo. También se puede utilizar para mostrar los valores de variables individuales.
Todos los demás argumentos son opcionales.
[ botones ] - determina qué botones e iconos se muestran en el MsgBox Por ejemplo, si utilizamos la opción vbOkOnly entonces sólo el OK Aunque se haya omitido este argumento, este botón se utilizará por defecto.
[ título ] - aquí puede especificar el título del cuadro de mensaje.
Pasemos de las palabras a la práctica y empecemos a depurar. Para mostrar el mensaje, añade la siguiente línea al código de la aplicación GetMaxBetween función definida por el usuario antes de la Caso Else operador:
MsgBox vMax,, "Recuento -" & iEsto es lo que obtendremos como resultado:
Function GetMaxBetween(rngCells As Range, MinNum, MaxNum) Dim NumRange As Range Dim vMax Dim arrNums() Dim i As Integer ReDim arrNums(rngCells.Count) For Each NumRange In rngCells vMax = NumRange Select Case vMax Case MinNum + 0.01 To MaxNum - 0.01 arrNums(i) = vMax i = i + 1 MsgBox vMax,, "Count -" & i Case Else GetMaxBetween = 0 End Select Next NumRange GetMaxBetween =WorksheetFunction.Max(arrNums) End FunctionUtilización de la vMax en el cuadro de diálogo, veremos qué números cumplen los criterios de selección, para poder seleccionar el mayor de ellos. Con la expresión "Contador -" & I en la barra de título, indicamos cuántos números hemos seleccionado ya para determinar el valor máximo. El contador se incrementará con cada nuevo valor.
Una vez que tenemos nuestro UDF configurado, aplicamos la fórmula siguiente al intervalo de fechas:
= GetMaxBetween (A1:A6,10,50)
Tras pulsar el botón Intro, aparecerá un mensaje como el de la captura de pantalla siguiente:
Es el primer número del intervalo A1: A6 que cumple los criterios: mayor que 10 pero menor que 50.
Después de hacer clic en OK, aparece un segundo mensaje con el número 14. El resto de los números no coinciden con los criterios de selección. Por lo tanto, la función sale y devuelve el mayor de los dos valores, 17.
En MsgBox se puede utilizar en los lugares más importantes de su función personalizada para controlar cómo cambian los valores de las variables individuales. Los cuadros de mensaje pueden ser muy útiles cuando tiene una función grande y muchos cálculos. En este caso, le resultará fácil determinar en qué parte del código se produce el error.
Determinar los puntos de parada y realizar el paso a paso
Puede añadir puntos de interrupción al código de su función en los que se detendrá la ejecución del código. De este modo, podrá seguir paso a paso el proceso de cálculo y ver cómo cambian los valores de las variables.
Para añadir un punto de interrupción, sitúe el cursor en la línea que contiene la sentencia en la que desea hacer una pausa. A continuación, haga clic con el botón derecho del ratón y seleccione Debug -> Alternar punto de interrupción o simplemente pulse F9 . También puede hacer clic en el lugar deseado de la zona gris vertical situada a la izquierda del código de función.
Aparecerá un círculo rojo, como puede ver en la siguiente captura de pantalla. La línea de código en la que se detendrá el cálculo está resaltada en rojo.
Ahora, la ventana del editor VBA se abrirá cuando la función se esté ejecutando. El cursor se situará en el punto donde se detuvo.
Si pasa el cursor del ratón por encima de cualquiera de las variables del código de la función, podrá ver su valor actual:
Pulse F5 para continuar el cálculo.
Nota. Después del punto de interrupción, puede empezar a seguir el progreso de los cálculos paso a paso. Si pulsa el botón F8, sólo se ejecutará la siguiente línea del código VBA. La línea amarilla con una flecha también se moverá a la última posición del código ejecutado.
Como la ejecución de la función vuelve a estar en pausa, puede ver los valores actuales de todas las variables de la función utilizando el cursor del ratón.
La siguiente pulsación de F8 nos llevará un paso adelante. Así que puedes pulsar F8 hasta el final del cálculo. O pulsar F5 para continuar el cálculo hasta el siguiente punto de interrupción.
Si se produce un error, el cursor se detendrá en el punto del código en el que se ha producido el error. Además, aparecerá un mensaje de error emergente, lo que facilita la determinación de la causa del problema.
Los puntos de interrupción que especifiques se aplicarán hasta que cierres el archivo. Cuando vuelvas a abrirlo, tendrás que establecerlos de nuevo. No es el método más cómodo, ¿no crees?
Sin embargo, este problema puede resolverse. Inserte un Stop en el código de la función en los puntos necesarios, y puede detener la ejecución del programa de la misma manera que cuando se utilizan puntos de interrupción.
Cuando VBA encuentra un Stop se detendrá la ejecución del programa y esperará su acción. Compruebe los valores de las variables y pulse F5 para continuar.
O pulse F8 para realizar la función paso a paso como se ha descrito anteriormente.
En Stop forma parte del programa y, por tanto, no se elimina, como ocurre con un punto de interrupción. Cuando termines de depurar, elimínalo tú mismo. O conviértelo en un comentario precediéndolo de una comilla simple (').
Depuración mediante el operador Debug.Print
Puede colocar el Debug.Print en el código de la función en el lugar correcto. Esto es útil para comprobar los valores de variables que cambian cíclicamente.
Puede ver un ejemplo del rendimiento de Debug.Print en la siguiente captura de pantalla.
Declaración Debug.Print i, vMax imprime los valores y sus números ordinales.
En la ventana Inmediato vemos dos números (17 y 14) del rango seleccionado, que corresponde a los límites fijados y entre los que se seleccionará el máximo. Los dígitos 1 y 2 significan que la función ha completado 2 ciclos en los que se han seleccionado los números. Vemos los valores de las variables más importantes, como hicimos anteriormente con MsgBox Pero esto no detuvo la función.
Llamar a una función desde un procedimiento
Puede llamar a una función definida por el usuario no desde una celda de la hoja de cálculo, sino desde un procedimiento. En este caso, todos los errores se mostrarán en la ventana del Editor de Visual Basic.
A continuación se muestra cómo se puede llamar a la función definida por el usuario GetMaxBerween desde un procedimiento:
Sub Test() Dim x x = GetMaxBetween(Range ( "A1:A6" ), 10, 50) MsgBox(x) End SubSitúe el cursor en cualquier lugar del código y pulse F5 . Si no hay ningún error en la función, aparecerá una ventana emergente con el resultado del cálculo.
En caso de error, verá el mensaje correspondiente en el editor VBA. El cálculo se detendrá y la línea de código en la que se ha producido el error se resaltará en amarillo. Podrá identificar fácilmente dónde y por qué se ha producido el error.
Eso es todo. Ahora ha creado su propio complemento, lo ha añadido a Excel y puede utilizar la UDF en él. Si desea utilizar más UDF, sólo tiene que escribir el código en el módulo del complemento en el editor VBA y guardarlo.
Eso es todo por hoy. Hemos cubierto diferentes formas de depurar funciones personalizadas y hemos aprendido a utilizarlas en tu libro de trabajo. Esperamos que estas directrices te resulten útiles. Si tienes alguna pregunta, escribe en los comentarios de este artículo.