🚀The world's best VBA AI has evolved. ExcelMaster is now an autonomous Agent.Read more →
Back to Blog

VBA Debug.Print en Excel — por qué tu salida va a una ventana que no puedes ver

|

VBA Debug.Print en Excel — por qué tu salida va a una ventana que no puedes ver

TL;DRDebug.Print expr escribe una línea en la Immediate Window y deja que la macro siga ejecutándose. Sin ventana emergente, sin pausa — justo lo contrario de MsgBox. Eso lo convierte en la forma correcta de ver un bucle transmitir sus valores. La pega: la Immediate Window está cerrada por defecto, así que la queja número uno — Debug.Print no hace nada — es casi siempre salida que no puedes ver. Pulsa Ctrl+G para abrirla. Cuando necesites que el registro sobreviva a la sesión, deja de imprimir en la ventana y escribe en un archivo en su lugar.

Sub DebugPrintBasics()
    Dim i As Long
    For i = 1 To 3
        Debug.Print "row " & i, Cells(i, 1).Value   ' fluye a la Immediate Window
    Next i
    Debug.Print "done"                              ' sin ventana emergente, la macro nunca se pausa
End Sub
' No ves nada? La Immediate Window esta cerrada. Pulsa Ctrl+G.

Lo que aprenderás

  • El modelo mental — Debug.Print es un registro silencioso y no bloqueante, no un diálogo
  • Los tres observadores de poder creciente, y qué pregunta responde cada uno
  • Por qué Debug.Print parece no hacer nada (y el arreglo con Ctrl+G)
  • Por qué la Immediate Window descarta en silencio tu salida más temprana
  • Por qué imprimir una expresión puede desencadenar efectos secundarios reales
  • Debug.Print frente a MsgBox, y cuándo el registro debe convertirse en un archivo de verdad

Debug.Print es una línea de registro. Añade texto a la Immediate Window y devuelve el control a tu código de inmediato — la macro no se detiene, no aparece nada y nadie tiene que hacer clic en nada. Esa única propiedad es toda la razón de que exista. Cuando diagnosticas un bucle, quieres ver 5000 valores pasar volando en un panel con desplazamiento, no hacer clic en «OK» 5000 veces.

Así que la pregunta correcta en tu cabeza nunca es «¿cómo muestro este valor?» — para eso está MsgBox. Es «¿cómo registro un valor sin interrumpir la ejecución?». Todo lo de abajo se desprende de ese único encuadre: como Debug.Print nunca bloquea, su salida tiene que vivir en algún sitio al que vas a mirar, y ese sitio es una ventana que Excel mantiene oculta hasta que la pides.

Los tres observadores, de poder creciente

Debug.Print es el primer peldaño de una escalera. Cuando una macro se porta mal, no te faltan pistas — es que no estás mirando. VBA te da tres formas de mirar, cada una respondiendo una pregunta distinta y cada una mintiéndote a su manera:

Observador La pregunta que responde Su mentira característica
Debug.Print ¿Qué valores hubo mientras se ejecutaba? Imprime en una ventana que está cerrada por defecto
Immediate Window ¿Qué es verdad ahora mismo, en esta pausa? Una consulta con ? en realidad ejecuta el código
Breakpoint + F8 ¿En qué línea va mal? Desaparecen cuando cierras el libro

Echa mano del pasivo y estás adivinando qué línea se rompió; echa mano del pesado y estás recorriendo 10 000 iteraciones a mano. La habilidad está en saber si necesitas ver los valores o encontrar la línea. Debug.Print responde la pregunta más laxa — te muestra qué pasó después del hecho — lo que lo hace el más rápido de usar y el más fácil de mirar sin ver.

Trampa 1: imprime en una ventana que está cerrada por defecto

El informe número uno de «Debug.Print no funciona» no es un fallo en tu código. Los valores se están imprimiendo exactamente como los escribiste — en un panel que nunca has abierto.

Sub WhereDidItGo()
    Debug.Print "I am running fine"   ' esta linea funciona
End Sub                                ' solo que no ves donde aterrizo

La Immediate Window se abre con Ctrl+G (o Ver > Immediate Window) dentro del editor de VBA. Hasta entonces, cada Debug.Print tiene éxito en silencio y tú concluyes que no pasó nada. Antes de añadir un solo MsgBox para «comprobar si el código se ejecuta», abre la Immediate Window — nueve de cada diez veces tu evidencia ya estaba ahí.

Trampa 2: la ventana descarta en silencio tu salida más temprana

La Immediate Window no es un registro infinito. Guarda solo las últimas ~200 líneas; las líneas más antiguas se salen por arriba y desaparecen. En una prueba pequeña nunca lo notas. En un bucle de 10 000 filas, las filas que más quieres — las primeras, donde el patrón suele romperse — son las primeras en descartarse.

Sub LosesTheStart()
    Dim i As Long
    For i = 1 To 10000
        Debug.Print i, Cells(i, 1).Value   ' al final, las filas 1..9800 ya no estan
    Next i
End Sub

Cuando necesitas el historial completo — cada fila, en orden, conservado tras la ejecución — Debug.Print es la herramienta equivocada. Abre un archivo de texto y usa Print # en su lugar, que no tiene límite de búfer y deja un archivo que puedes volver a abrir (VBA Print y Write). Debug.Print es para un vistazo; un archivo es para dejar constancia.

Trampa 3: imprimir una expresión puede disparar efectos secundarios reales

«Registrar es pasivo» solo es cierto cuando lo que registras es pasivo. Debug.Print evalúa su argumento, así que si imprimes el resultado de una función, esa función se ejecuta — con todas sus consecuencias.

Debug.Print DeleteOldRows()   ' esto ELIMINA filas, luego imprime el recuento
Debug.Print Cells(1, 1).Value ' esto es genuinamente pasivo - solo lee un valor

Imprimir DeleteOldRows() para «ver cuántas eliminaría» las elimina de verdad. Limita los argumentos de Debug.Print a variables simples y lecturas de propiedades, y nunca hagas pasar por él una función con efectos secundarios solo para inspeccionar el valor de retorno. Si no te queda otra, captura primero el resultado en una variable y luego imprime la variable.

Debug.Print frente a MsgBox

Parecen intercambiables — ambos te muestran un valor — pero son opuestos, y elegir el equivocado es su propia categoría de dolor:

Debug.Print MsgBox
¿Bloquea la macro? No, sigue ejecutándose Sí, espera un clic
Adónde va Immediate Window (solo desarrollo) A la pantalla, para cualquiera
En un bucle Transmite miles de líneas Un diálogo modal por iteración
Historial Con desplazamiento (últimas ~200 líneas) Se pierde en cuanto haces clic en OK

La regla se escribe sola: si necesitas ver algo mientras desarrollas, Debug.Print. Si una persona en producción necesita ver algo, eso es un mensaje de verdad — MsgBox para una pregunta genuina, o una actualización de estado (VBA MsgBox). Lo único que nunca debes hacer es depurar un bucle con MsgBox; así es como un diagnóstico de cinco segundos se convierte en hacer clic en OK cuatrocientas veces.

Consejo para una salida legible: separa los valores con ; para concatenarlos apretados, o con , para alinearlos en tabuladores — Debug.Print i; x; y frente a Debug.Print i, x, y.

La opinión: Debug.Print es un registro, no un registrador

Debug.Print se gana su sitio como la forma más rápida de vigilar valores durante el desarrollo, y casi siempre es la respuesta correcta frente a MsgBox para cualquier cosa que se repita. Pero es una línea de registro, no un sistema de registro. En el momento en que necesitas que la salida sobreviva a la sesión, lleve una marca de tiempo o venga de una macro que corre en la máquina de otra persona sin el editor de VBA abierto, se te ha quedado pequeño.

Dos hábitos lo mantienen honesto. Primero, quita Debug.Print del código que entregas o enciérralo tras una constante como Const DEBUG_MODE As Boolean = False — dejado en un bucle caliente, sigue formateando cadenas y escribiendo en el búfer en cada llamada, lo que es un coste real y medible. Segundo, cuando el requisito es un registro duradero y no un vistazo, cambia a Print # y un archivo de texto. El trabajo de Debug.Print termina en el momento en que cierras el editor de VBA; no le pidas que sea tu rastro de auditoría.

Cuando todo el trabajo es encontrar el fallo — descríbelo en su lugar

La mitad de las veces la tarea real no es «imprime este valor» sino «encuentra la única fila entre 8000 donde el total deja de cuadrar, y dime qué tiene de diferente». Para cuando has salpicado Debug.Print por una macro de 200 líneas, la has vuelto a ejecutar, has desplazado una Immediate Window truncada y has reconstruido el patrón a ojo, la instrumentación ha costado más que el arreglo. ExcelMaster te deja enunciar ese objetivo en español llano — «encuentra cada fila donde la columna E no sea igual a C más D, y muéstrame esas filas» — y genera Python que lee los datos, respalda tu archivo primero, aplica la comprobación y te devuelve las filas exactas que fallan. Tú describes la pregunta; él se encarga de mirar.

Preguntas frecuentes

¿Adónde va la salida de Debug.Print en VBA?

A la Immediate Window del editor de VBA. Ábrela con Ctrl+G o Ver > Immediate Window. La salida solo es visible ahí — nunca aparece en la hoja ni en un diálogo — y por eso una Immediate Window cerrada es la razón habitual de que Debug.Print parezca no hacer nada.

¿Por qué Debug.Print no muestra nada?

Casi siempre porque la Immediate Window está cerrada (pulsa Ctrl+G), o porque tu salida se desplazó más allá del búfer de unas 200 líneas, o porque la macro lanzó un error antes de llegar a la línea. Confirma que la ventana está abierta y añade un marcador Debug.Print "reached here" para comprobar que el camino del código se ejecuta de verdad.

¿Cuál es la diferencia entre Debug.Print y MsgBox?

Debug.Print escribe en silencio en la Immediate Window y deja que la macro siga; MsgBox detiene la macro con un diálogo modal que debes cerrar. Usa Debug.Print para bucles e historial de valores durante el desarrollo, y MsgBox solo cuando una persona de verdad necesita ver o responder algo.

¿Cómo imprimo varios valores en una línea en VBA?

Sepáralos con un punto y coma o una coma: Debug.Print i; x; y concatena los valores apretados, mientras que Debug.Print i, x, y los alinea en tabuladores (columnas). Usa ; para filas compactas y , para una tabla legible en la Immediate Window.

¿Debo dejar Debug.Print en el código de producción?

No. Quítalo, o enciérralo tras una constante como Const DEBUG_MODE As Boolean = False. Aunque parezca inofensivo, sigue evaluando su argumento y escribiendo en el búfer limitado de la Immediate Window en cada llamada, lo que ralentiza un bucle caliente. Para una salida que deba persistir, registra en un archivo con Print # en su lugar.

Probado en

Probado en: Excel 365 (Windows 11), VBA 7.1 — última verificación el 05/09/2026.

Guías relacionadas: VBA Immediate Window · VBA Breakpoint · VBA MsgBox · VBA Print y Write · VBA Bucle For