TL;DR —
Print #yWrite #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 releaInput #. UsarWrite #para un CSV legible por humanos es la razón de que el tuyo esté lleno de comillas; usaPrint #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 Outputtrunca mientrasFor Appendañ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 unMsgBox— sin comillas, sin separadores automáticos, sin marcadores de tipo. Tú 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#,Truecomo#TRUE#yEmptycomo#NULL#. Es un formato de serialización, diseñado para queInput #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:
- Modo —
For Outputreescribe el archivo desde vacío en cada ejecución;For Appendañade al final. Un log continuo comoC:\Logs\run.logdebe abrirseFor Append, o cada ejecución borra la anterior. - Coma decimal — en un sistema alemán, francés o español,
CStr(3.5)puede producir3,5, cuya coma choca con tu delimitador de CSV y parte un número en dos columnas. Fuerza un punto conFormat(x, "0.00")oStr(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, usaADODB.Streamo elCreateTextFile(path, True, True)delFileSystemObject.
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 queInput #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
