Como ya sabe cómo crear UDF (y espero que también haya intentado aplicarlos en Excel), profundicemos un poco más y veamos qué se puede hacer si la función definida por el usuario no funciona.
Para solucionar algunos problemas cuando crea una función personalizada, lo más probable es que necesite ejecutar una depuración. Entonces puede estar seguro de que la función está funcionando correctamente.
Exploraremos las siguientes técnicas de solución de problemas:
Al crear una función personalizada, siempre existe la posibilidad de cometer un error. Las funciones personalizadas suelen ser bastante complejas. Y no siempre comienzan a funcionar de inmediato. La fórmula puede devolver un resultado incorrecto o #¡VALOR! error. A diferencia de las funciones estándar de Excel, no verá ningún otro mensaje.
¿Hay alguna manera de recorrer una función personalizada para verificar cómo funciona cada una de sus declaraciones? ¡Seguro! La depuración se utiliza para esto.
Le daré varias formas de depurar su función personalizada para que pueda elegir la que funcione para usted.
Por ejemplo, usamos la función personalizada ObtenerMaxEntre de uno de nuestros artículos anteriores que calcula el número máximo en el rango de valores especificado:
Función GetMaxBetween(rngCells Como Rango, MinNum, MaxNum)
Oscuro rango numérico Como Rango
Oscuro máximo
Oscuro arrNums()
Oscuro y Como Entero
Redime arrNums(rngCells.Count)
Para Cada rango numérico En el rngCells vMax = rango numérico
Seleccionar Caso máximo
Caso Número mínimo + 0.01 a MaxNum – 0.01 arrNums(i) = vMax i = i + 1
Caso De lo contrario
ObtenerMaxEntre = 0
El fin Seleccionar
Próximo NumRange GetMaxBetween = WorksheetFunction.Max(arrNums)
El fin Función
Los argumentos de la función son el rango de celdas en el que se escriben los números, así como los límites superior e inferior de los valores.
Coloque la función MsgBox en lugares importantes
Para monitorear la ejecución de los cálculos, puede mostrar los valores de las variables más importantes en la pantalla en los lugares apropiados. Esto se puede hacer usando cuadros de diálogo emergentes.
MsjBox 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 otras funciones de VBA:
MsgBox(mensaje [, buttons] [, title] [, helpfile, context])
inmediato es un argumento necesario. Contiene el mensaje que 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.
[buttons] – determina qué botones e iconos se muestran en MsjBox. Por ejemplo, si usamos la opción vbOkSóloentonces solo Bien se mostrará el botón . Incluso si omite este argumento, este botón se usa de forma predeterminada.
[title] – aquí puede especificar el título del cuadro de mensaje.
Pasemos de las palabras a la práctica y comencemos a solucionar problemas. Para mostrar el mensaje, agregue la siguiente línea a su código ObtenerMaxEntre función definida por el usuario antes El caso de algo más operador:
MsgBox vMax,, «Contar -« & i
Esto es lo que obtendremos como resultado:
Función GetMaxBetween(rngCells Como Rango, MinNum, MaxNum)
Oscuro rango numérico Como Rango
Oscuro máximo
Oscuro arrNums()
Oscuro y Como Entero
Redime arrNums(rngCells.Count)
Para Cada rango numérico En el rngCells vMax = rango numérico
Seleccionar Caso máximo
Caso Número mínimo + 0.01 a MaxNum – 0.01 arrNums(i) = vMax i = i + 1 MsgBox vMax,, «Contar -« & i
Caso De lo contrario
ObtenerMaxEntre = 0
El fin Seleccionar
Próximo NumRange GetMaxBetween = WorksheetFunction.Max(arrNums)
El fin Función
USANDO máximo variable en el cuadro de diálogo, veremos qué números cumplen con los criterios de selección, para que podamos seleccionar el mayor de ellos. Con la expresión «Número -» & I en la barra de título, indicamos cuántos números ya hemos seleccionado para determinar el valor máximo. El contador se incrementará con cada nuevo valor.
Una vez que tenemos el UDF establecido, aplicamos la siguiente fórmula al rango de datos:
= GetMaxBetween (A1:A6,10,50)
Después ingresar presiona el botón, verá un mensaje como el de la siguiente captura de pantalla:
Este es el primer número en el rango A1:A6 que cumple con los criterios: mayor que 10 pero menor que 50.
Después de hacer clic en Aceptar, aparece un segundo mensaje con el número 14. El resto de los números no coinciden con los criterios de selección. Por tanto, la función sale y devuelve el mayor de los dos valores, 17.
El MsjBox La función se puede utilizar en los lugares más importantes de la 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, te resultará sencillo determinar en qué parte del código se produce el error.
Determinar puntos de interrupción y realizar paso a paso
Puede agregar puntos de interrupción a su código de función donde se detendrá la ejecución del código. Para que pueda seguir el proceso de cálculo paso a paso. Al hacer esto, puede ver cómo cambian los valores de las variables.
Para agregar un punto de interrupción, coloque el cursor en la línea que contiene la declaración en la que elige interrumpir. Luego haga clic derecho y seleccione Depurar -> Alternar punto de interrupción o simplemente presione F9. También puede hacer clic en cualquier parte del área gris vertical a la izquierda del código de función.
Aparecerá un círculo rojo como puede ver en la captura de pantalla a continuación. La línea de código donde se detendrá el cálculo está resaltada en rojo.
Ahora la ventana del editor de VBA estará abierta cuando se ejecute la función. El cursor se colocará en el punto donde se detuvo.
Si pasa el cursor sobre cualquiera de las variables en el código de función, puede ver su valor actual:
la prensa F5 para continuar con el cálculo.
Nota. Después del punto de interrupción, puede comenzar a seguir el progreso de los cálculos paso a paso. Si presionas la tecla F8 botón, solo se ejecutará una línea siguiente de 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 se interrumpe nuevamente, puede ver los valores actuales de todas las variables de la función usando el cursor del mouse.
A continuación, presione un F8 nos llevará un paso adelante. Entonces puedes presionar F8 hasta el final del cálculo. O presione F5 para continuar el cálculo hasta el siguiente punto de interrupción.
Si ocurre un error, el cursor se detendrá en el punto del código donde ocurrió el error. Y también verá un mensaje de error emergente. Esto hace que sea más fácil determinar la causa del problema.
Los puntos de interrupción que especifique se aplicarán hasta que cierre el archivo. Cuando lo vuelva a abrir, deberá configurarlos nuevamente. No es el método más conveniente, ¿no crees?
Sin embargo, este problema se puede solucionar. Entrar a Detener instrucción en el código de función en los puntos requeridos y puede detener la ejecución del programa de la misma manera que cuando usa puntos de interrupción.
Cuando VBA encuentra un Detener declaración, detendrá la ejecución del programa y esperará su acción.Verifique los valores de las variables, luego presione F5 continuar.
O presione F8 para realizar la función paso a paso como se describe arriba.
El Detener la instrucción es parte del programa y, por lo tanto, no se elimina, como ocurre con un punto de interrupción. Cuando haya terminado de depurar, elimínelo usted mismo. O conviértalo en un comentario precediéndolo de una comilla simple (‘).
Depuración con el operador Debug.Print
Puedes colocar Solución de problemas Impresión en el código de función en el lugar apropiado. Esto es útil para verificar valores de variables que cambian cíclicamente.
Puede ver un ejemplo del rendimiento de Debug.Print en la siguiente captura de pantalla.
Declaración Depurar.Imprimir i, vMax imprimir los valores y sus números ordinales.
En la ventana Inmediato se ven dos números (17 y 14) del rango seleccionado, que corresponden a los límites establecidos y de los cuales se seleccionará el máximo. Los números 1 y 2 significan que la función completó 2 ciclos donde se seleccionaron los números. Vemos los valores de las variables más importantes, como hicimos anteriormente MsjBox. 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.
Aquí se explica cómo llamar a la función definida por el usuario GetMaxBerween desde dentro de un procedimiento:
Bajo la Prueba()
Oscuro xx = ObtenerMaxEntre(Rango («A1:A6»), 10, 50) Cuadro de mensaje (x)
El fin Bajo la
Coloque el cursor en cualquier parte del código y presione F5. Si no hay ningún error en la función, verá una ventana emergente con el resultado del cálculo.
En caso de error, verá un mensaje correspondiente en el editor de VBA. El cálculo se detendrá y la línea de código donde ocurrió el error se resaltará en amarillo. Puede identificar fácilmente dónde y por qué ocurrió el error.
Eso es todo. Ahora ha creado su propio complemento, lo agregó a Excel y puede usar el UDF en él. Si desea utilizar más UDF, escriba el código en el módulo de complemento en el editor de VBA y guárdelo.
Es todo por hoy. Cubrimos diferentes formas de depurar funciones personalizadas y aprendimos cómo usarlas en el libro de trabajo. Realmente esperamos que encuentre estas instrucciones útiles. Si tiene alguna pregunta, escriba en los comentarios a este artículo.