excel-vba
Depuración y solución de problemas
Buscar..
Sintaxis
- Debug.Print (cadena)
- Para para
Debug.Print
Para imprimir una lista de las descripciones de los códigos de error en la ventana Inmediata, Debug.Print
a la función Debug.Print
:
Private Sub ListErrCodes()
Debug.Print "List Error Code Descriptions"
For i = 0 To 65535
e = Error(i)
If e <> "Application-defined or object-defined error" Then Debug.Print i & ": " & e
Next i
End Sub
Puede mostrar la ventana Inmediato por:
- Selección de V er | Me imagino una ventana desde la barra de menú
- Usando el atajo de teclado Ctrl-G
Detener
El comando Detener pausará la ejecución cuando se llame. A partir de ahí, el proceso se puede reanudar o ejecutar paso a paso.
Sub Test()
Dim TestVar as String
TestVar = "Hello World"
Stop 'Sub will be executed to this point and then wait for the user
MsgBox TestVar
End Sub
Ventana inmediata
Si desea probar una línea de código de macro sin necesidad de ejecutar un subcomité completo, puede escribir comandos directamente en la ventana Inmediato y presionar ENTER
para ejecutar la línea.
¿Para probar la salida de una línea, puede precederla con un signo de interrogación ?
para imprimir directamente en la ventana Inmediata. Alternativamente, también puede usar el comando de print
para print
la salida.
Mientras esté en el Editor de Visual Basic, presione CTRL + G
para abrir la ventana Inmediato. Para cambiar el nombre de la hoja seleccionada actualmente a "Hoja de ejemplo", escriba lo siguiente en la ventana Inmediato y presione ENTER
ActiveSheet.Name = "ExampleSheet"
Para imprimir el nombre de la hoja seleccionada actualmente directamente en la ventana Inmediata
? ActiveSheet.Name
ExampleSheet
Este método puede ser muy útil para probar la funcionalidad de las funciones integradas o definidas por el usuario antes de implementarlas en el código. El siguiente ejemplo muestra cómo se puede usar la ventana Inmediato para probar la salida de una función o serie de funciones para confirmar un esperado.
'In this example, the Immediate Window was used to confirm that a series of Left and Right
'string methods would return the desired string
'expected output: "value"
print Left(Right("1111value1111",9),5) ' <---- written code here, ENTER pressed
value ' <---- output
La ventana Inmediato también se puede usar para configurar o restablecer la aplicación, el libro de trabajo u otras propiedades necesarias. Esto puede ser útil si tiene Application.EnableEvents = False
en una subrutina que inesperadamente lanza un error, causando que se cierre sin restablecer el valor a True
(lo que puede causar una funcionalidad frustrante e inesperada. En ese caso, los comandos se pueden escribir directamente en la ventana inmediata y ejecute:
? Application.EnableEvents ' <---- Testing the current state of "EnableEvents"
False ' <---- Output
Application.EnableEvents = True ' <---- Resetting the property value to True
? Application.EnableEvents ' <---- Testing the current state of "EnableEvents"
True ' <---- Output
Para técnicas de depuración más avanzadas, se pueden usar dos puntos :
como separador de línea. Esto se puede usar para expresiones de varias líneas, como en bucle en el siguiente ejemplo.
x = Split("a,b,c",","): For i = LBound(x,1) to UBound(x,1): Debug.Print x(i): Next i '<----Input this and press enter
a '<----Output
b '<----Output
c '<----Output
Utilice el temporizador para encontrar cuellos de botella en el rendimiento
El primer paso para optimizar la velocidad es encontrar las secciones de código más lentas. La función Timer
VBA devuelve el número de segundos transcurridos desde la medianoche con una precisión de 1/255 de segundo (3.90625 milisegundos) en PC con Windows. Las funciones VBA Now
y Time
son solo precisas a un segundo.
Dim start As Double ' Timer returns Single, but converting to Double to avoid
start = Timer ' scientific notation like 3.90625E-03 in the Immediate window
' ... part of the code
Debug.Print Timer - start; "seconds in part 1"
start = Timer
' ... another part of the code
Debug.Print Timer - start; "seconds in part 2"
Agregando un punto de interrupción a su código
Puede agregar fácilmente un punto de interrupción a su código haciendo clic en la columna gris a la izquierda de la línea de su código VBA donde desea que se detenga la ejecución. Aparece un punto rojo en la columna y el código del punto de interrupción también se resalta en rojo.
Puede agregar múltiples puntos de interrupción a lo largo de su código y reanudar la ejecución presionando el icono "jugar" en la barra de menú. No todo el código puede ser un punto de interrupción como líneas de definición variable, la primera o la última línea de un procedimiento y las líneas de comentarios no se pueden seleccionar como un punto de interrupción.
Ventana Locales del Depurador
La ventana Locales proporciona un acceso fácil al valor actual de las variables y objetos dentro del alcance de la función o subrutina que está ejecutando. Es una herramienta esencial para depurar su código y pasar por los cambios para encontrar problemas. También te permite explorar propiedades que quizás no sabías que existían.
Tomemos el siguiente ejemplo,
Option Explicit
Sub LocalsWindowExample()
Dim findMeInLocals As Integer
Dim findMEInLocals2 As Range
findMeInLocals = 1
Set findMEInLocals2 = ActiveWorkbook.Sheets(1).Range("A1")
End Sub
En el Editor de VBA, haga clic en Ver -> Ventana Locales
Luego, al pasar por el código con F8 después de hacer clic dentro de la subrutina, nos hemos detenido antes de asignar findMeinLocals. Abajo puede ver que el valor es 0 --- y esto es lo que se usaría si nunca le asignara un valor. El objeto de rango es 'Nada'.
Si nos detenemos justo antes de que finalice la subrutina, podemos ver los valores finales de las variables.
Podemos ver findMeInLocals con un valor de 1 y tipo de Integer, y FindMeInLocals2 con un tipo de Rango / Rango. Si hacemos clic en el signo + podemos expandir el objeto y ver sus propiedades, como conteo o columna.