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

VBA Print # vs Write # en Excel — escribe un archivo de texto o CSV (y por qué el tuyo tiene comillas alrededor de todo)

|

VBA Print # vs Write # en Excel — escribe un archivo de texto o CSV (y por qué el tuyo tiene comillas alrededor de todo)

TL;DRPrint # y Write # escriben en un archivo con estilos opuestos. Print # escribe el texto exactamente como se ve — sin comillas, sin comas, tú insertas los delimitadores. Write # escribe formato máquina — cada cadena entre comillas, comas entre valores, fechas en #...# — hecho para que lo relea Input #. Usar Write # para un CSV legible por humanos es la razón de que el tuyo esté lleno de comillas; usa Print # y construye la línea tú mismo.

' Write # - formato maquina, comillas alrededor de cada cadena:
Write #n, "Ann", "Rome", 42      ' el archivo obtiene:  "Ann","Rome",42

' Print # - tu controlas la disposicion, sin comillas:
Print #n, "Ann" & "," & "Rome" & "," & 42   ' el archivo obtiene:  Ann,Rome,42

Una vez que una macro puede abrir un canal, la siguiente decisión es qué aspecto deben tener los bytes en disco — y VBA te da dos instrucciones que responden a esa pregunta de formas completamente opuestas. Print # escribe lo que ves; Write # escribe lo que un programa puede volver a parsear. Elige la equivocada y el archivo es técnicamente válido pero inútil para quien lo abra después: un CSV ahogado en comillas, o un «CSV» cuyas columnas están todas en una sola celda. Saber qué instrucción produce qué bytes es todo el oficio.

Lo que aprenderás

  • El modelo mental — Print # escribe lo que ves, Write # escribe lo que un programa relee
  • Por qué Write # pone comillas alrededor de cada cadena (y cuándo eso es exactamente lo correcto)
  • Por qué una coma en una lista de Print # inserta zonas de impresión, no comas de CSV
  • Cómo construir una línea de CSV limpia con Print # y tus propios delimitadores
  • Por qué For Output trunca mientras For Append añade
  • La trampa regional de la coma decimal, y por qué la escritura built-in es ANSI y no UTF-8

El modelo mental: formato de visualización vs formato máquina

La idea que zanja casi toda pregunta de «¿por qué mi archivo tiene ese aspecto?»: Print # y Write # sirven a dos lectores distintos.

  • Print # escribe formato de visualización. Pone el texto en disco exactamente como aparecería en una celda o en un MsgBox — sin comillas, sin separadores automáticos, sin marcadores de tipo. decides la disposición.
  • Write # escribe formato máquina. Envuelve cada cadena en comillas, separa los valores con comas, escribe las fechas como #2026-01-31#, True como #TRUE# y Empty como #NULL#. Es un formato de serialización, diseñado para que Input # pueda releer exactamente los mismos valores.

Así que la elección nunca es cuestión de gusto — es cuestión de quién lee el archivo después. Un programa que va a volver a parsearlo con Input # quiere Write #. Un humano, Excel o cualquier otra herramienta quiere Print #.

Por qué Write # llena tu CSV de comillas

Esta es la queja número uno, y no es un bug — es Write # haciendo su trabajo:

Write #n, "Ann", "Rome", 42
' archivo:  "Ann","Rome",42

Esas comillas son deliberadas: permiten a Input # distinguir una cadena que contiene una coma ("Rome, Italy") de dos campos separados. Perfecto para ir y volver de VBA a VBA; equivocado para un informe que abre una persona. Cuando alguien pregunta «por qué mi CSV exportado está lleno de comillas», la respuesta es siempre la misma — el código usó Write # cuando quería Print #.

Write # es la herramienta correcta en exactamente una situación: escribiste el archivo con Write # y lo vas a releer con Input #, enteramente dentro de VBA. Para cualquier cosa que abra un humano o Excel, echa mano de Print #.

Por qué una coma en Print # no es una coma de CSV

El arreglo obvio — «usa simplemente Print # con comas» — tiene su propia trampa, porque la coma significa algo distinto en una lista de Print #:

Print #n, "Ann", "Rome", 42     ' NO es Ann,Rome,42

Una coma entre elementos en una lista de Print # inserta una zona de impresión — un tabulador cada 14 caracteres aproximadamente, un vestigio de la impresión por consola. Así que la línea de arriba sale con huecos anchos, no con comas, y tu «CSV» se abre como una única columna destrozada. El arreglo es dejar de permitir que Print # inserte separadores y construir la línea entera tú mismo:

Print #n, "Ann" & "," & "Rome" & "," & 42   ' Ann,Rome,42  - una sola cadena que controlas

Concatena los campos con el delimitador literal que quieras, pasa a Print # una única cadena, y obtienes exactamente esos bytes. Un punto y coma final (Print #n, s;) suprime el salto de línea cuando necesitas ensamblar una línea por partes.

Construir una fila de CSV real con Print

Juntándolo todo, el patrón fiable de «escribir un CSV» une cada fila en una sola cadena y deja que Print # la emita al pie de la letra:

Sub ExportRange(ByVal rng As Range, ByVal path As String)
    Dim n As Integer, r As Range, cell As Range, line As String
    n = FreeFile
    Open path For Output As #n              ' trunca; usa Append para anadir
    For Each r In rng.Rows
        line = ""
        For Each cell In r.Cells
            line = line & cell.Value & ","  ' tu delimitador, tus reglas
        Next cell
        If Len(line) > 0 Then line = Left(line, Len(line) - 1)  ' elimina la coma final
        Print #n, line                      ' una fila completa, exactamente como se construyo
    Next r
    Close #n
End Sub

Esta es la forma que toma casi toda exportación de CSV de producción, porque es la única manera de controlar con precisión las comillas y los delimitadores. Si un campo puede contener él mismo una coma, envuelve ese campo en comillas tú mismo — esa es una decisión que Print # te deja a ti, que es justo el punto.

Output trunca, Append añade — y las trampas de región y codificación

Dos detalles más deciden si el archivo es correcto:

  • ModoFor Output reescribe el archivo desde vacío en cada ejecución; For Append añade al final. Un log continuo como C:\Logs\run.log debe abrirse For Append, o cada ejecución borra la anterior.
  • Coma decimal — en un sistema alemán, francés o español, CStr(3.5) puede producir 3,5, cuya coma choca con tu delimitador de CSV y parte un número en dos columnas. Fuerza un punto con Format(x, "0.00") o Str(x) (que siempre usa .), o envuelve los campos numéricos en comillas.
  • Codificación — el Print # built-in escribe ANSI, no UTF-8. El texto acentuado o no latino (é, ü, 日本語) se escribe en la página de códigos del sistema y se corrompe cuando el archivo se abre como UTF-8. Para salida Unicode, usa ADODB.Stream o el CreateTextFile(path, True, True) del FileSystemObject.

El veredicto honesto: elige según quién lee el archivo

Print # y Write # no son intercambiables, y toda la decisión se reduce a una pregunta:

  • Write # solo para ir y volver de VBA a VBA → sus comillas, comas y marcadores #...# existen para que Input # pueda reconstruir los valores exactos. Un humano nunca debería verlos.
  • Print # para todos los demás → construye cada línea tú mismo con los delimitadores que quieras; una coma en una lista de Print # es una zona de impresión, no un separador.
  • Append para acumular, Output para reescribir → el modo decide si el historial sobrevive.
  • Fuerza . y ve a UTF-8 para un CSV de verdad → protege la trampa regional de la coma decimal y la trampa de codificación ANSI antes de que el archivo salga de tu máquina.

La señal más clara de que has echado mano de la instrucción equivocada son comillas que no pediste. Si aparecen, escribiste con Write #; cambia a Print # y hazte dueño de la disposición.

Cómo ayuda ExcelMaster

Exportar datos limpios significa saber que Write # envuelve todo en comillas para Input #, que una coma en Print # es una zona de impresión y no un separador, que For Output borra el archivo mientras For Append lo hace crecer, y que una coma decimal o la codificación ANSI pueden corromper un CSV en silencio — mucho criterio para «escribir un archivo».

ExcelMaster escribe la exportación que se abre limpia. Describe el trabajo — «guarda este rango como un CSV» o «añade una línea a un log en cada ejecución» — y produce el constructor de líneas de Print # con los delimitadores correctos, el modo correcto y un formato de números seguro para la región, anclado a ThisWorkbook.Path. Tú describes el archivo que una persona o un programa necesita leer; él escribe el código que produce exactamente esos bytes.

Preguntas frecuentes

¿Cuál es la diferencia entre Print # y Write # en VBA?

Print # escribe el texto exactamente como aparece — sin comillas y sin separadores, así que tú controlas la disposición. Write # escribe formato legible por máquina — cada cadena envuelta en comillas, comas entre valores y fechas en #...# — diseñado para que lo relea Input #. Usa Print # para cualquier cosa que abra un humano o Excel, y Write # solo para archivos que vas a releer en VBA con Input #.

¿Por qué mi CSV de VBA está lleno de comillas?

Porque el código usó Write #, que deliberadamente envuelve cada cadena en comillas para que Input # pueda volver a parsearla. Eso es correcto para ir y volver de VBA a VBA pero equivocado para un informe. Cambia a Print # y construye cada fila tú mismo — Print #n, a & "," & b — para obtener un CSV limpio sin comillas de más.

¿Por qué Print # no separa mis valores con comas?

Una coma entre elementos en una lista de Print # inserta una zona de impresión (un tabulador cada 14 caracteres aproximadamente), no una coma de CSV, así que los campos salen con huecos anchos en una sola columna. Pasa a Print # una única cadena concatenada en su lugar — Print #n, a & "," & b & "," & c — para que los delimitadores sean exactamente los que escribiste.

¿Cómo escribo un archivo de texto sin sobrescribirlo en VBA?

Ábrelo For Append en lugar de For Output. For Output trunca el archivo a vacío antes de escribir, así que cada ejecución borra el contenido anterior; For Append crea el archivo si falta y si no añade al final. Toma el número de canal de FreeFile y ciérralo con Close #n cuando termines.

¿Cómo escribo UTF-8 o caracteres acentuados en un archivo en VBA?

El Print # y el Write # built-in escriben ANSI en la página de códigos del sistema, así que el texto acentuado o no latino se corrompe cuando el archivo se lee como UTF-8. Para salida Unicode usa ADODB.Stream, o el CreateTextFile(path, True, True) del FileSystemObject, donde el último argumento pide Unicode. Fuerza también un punto decimal con Format(x, "0.00") para que una coma decimal regional no rompa tus delimitadores.

Probado en

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

Guías relacionadas: VBA FreeFile & Open · VBA Read Text File · VBA FileSystemObject · VBA Save Workbook · VBA CurDir