TL;DR — Para leer o escribir un archivo de texto con el VBA built-in abres un canal numerado:
Open path For Output As #n. El númerones un manejador al que se refieren después cadaPrint #nyClose #n— tómalo deFreeFile, nunca codifiques#1a fuego. Dos archivos con#1fijo lanzanerror 55,For Outputtrunca a vacío un archivo existente, y un canal que olvidas cerrar conClosepermanece bloqueado hasta que Excel se cierra.
Sub WriteReport()
Dim n As Integer
n = FreeFile ' obtiene el siguiente numero de canal libre
Open "C:\Reports\out.txt" For Output As #n
Print #n, "Hello" ' cada escritura se refiere a ese numero
Close #n ' libera siempre el canal
End Sub
Alcanzar un archivo de texto en VBA no empieza por el texto — empieza por un número. La instrucción
Open conecta tu archivo a un canal, y a partir de ese momento cada escritura, lectura y cierre nombra
el canal por su número, no por su ruta. FreeFile existe para entregarte un número que es seguro usar.
Acierta con esa única idea y toda la API de archivos built-in deja de ser engorrosa; fállala —
eligiendo tú mismo el número — y has escrito un bug que solo aparece en cuanto un segundo archivo está
abierto.
Lo que aprenderás
- El modelo mental —
FreeFilete entrega un número de canal; captúralo en una variable - Por qué codificar
#1a fuego lanzaerror 55en cuanto hay dos archivos abiertos - Los tres modos —
For Output(trunca),For Append(añade),For Input(lee) — y cuál borra datos en silencio - Por qué la instrucción
Openno esWorkbooks.Open - Por qué un canal que nunca cierras con
Closebloquea el archivo hasta que Excel se cierra - El patrón de limpieza con
On Errorque siempre libera el canal
El modelo mental: FreeFile te entrega un número de canal
La idea clave es que la E/S de archivos built-in funciona a través de un canal, y el canal se
identifica con un entero pequeño. Open ... As #n vincula tu archivo al número n; a partir de ahí,
Print #n, Input #n y Close #n hablan todos con ese archivo por su número. La ruta aparece
exactamente una vez — en el Open.
FreeFile devuelve el siguiente número de canal que no está en uso en ese momento. La regla que hace
tropezar a la gente: guárdalo antes de abrir. Hasta que un archivo esté realmente abierto en ese
número, FreeFile sigue devolviendo el mismo valor, así que debes capturarlo una vez y reutilizar la
variable:
Dim n As Integer
n = FreeFile ' capturalo UNA sola vez
Open "C:\data.txt" For Output As #n
' ... usa #n ...
Close #n
Piensa en FreeFile como «dame un canal libre» y en n como el ticket. Nunca graparías dos clientes al
mismo número de ticket; FreeFile es cómo evitas hacer eso con los archivos.
Por qué codificar #1 a fuego lanza error 55
El atajo cotidiano — Open path For Output As #1 — funciona perfectamente en una demo, porque solo hay
un archivo abierto en todo momento. Se convierte en un bug en el instante en que una rutina abre un
segundo archivo (o llama a otra rutina que lo hace) mientras #1 sigue abierto:
Open "a.txt" For Output As #1
Open "b.txt" For Output As #1 ' error 55 - "File already open"
error 55 significa «ese número de canal ya está en uso». Macros anidadas, un logger que escribe
mientras tu rutina principal tiene su propio archivo abierto, un bucle que olvida cerrar — todos
colisionan en el número fijo. FreeFile elimina toda la clase de bug porque nunca reparte un número que
ya esté ocupado:
Dim nA As Integer, nB As Integer
nA = FreeFile: Open "a.txt" For Output As #nA
nB = FreeFile: Open "b.txt" For Output As #nB ' un numero distinto y libre
En el momento en que escribes un #1 literal, has decidido el número de canal a mano — que es
exactamente la decisión que FreeFile fue construido para tomar por ti.
Los tres modos: Output trunca, Append añade, Input lee
Open ... For <mode> toma uno de tres modos para texto secuencial, y elegir el equivocado es la forma
más común de perder datos:
For Output— crea el archivo si no existe, y lo trunca a vacío si ya existe. Abrir un archivo existenteFor Outputborra su contenido antes de que escribas una sola línea. Este es el clásico bug de «mi archivo de log se borra una y otra vez».For Append— crea el archivo si falta, si no añade al final. Esto es lo que quieres para un log continuo.For Input— abre un archivo existente para leer; un archivo que falta lanzaerror 53 File not found, así que protégelo primero conDir.
Open logPath For Append As #n ' conserva el historial
Open logPath For Output As #n ' MISMO archivo - borra antes el historial
Los dos modos de escritura parecen casi idénticos y hacen cosas opuestas a un archivo existente. Si un
archivo debe crecer con el tiempo, siempre es For Append; For Output es para un archivo que piensas
reescribir desde cero en cada ejecución.
La instrucción Open no es Workbooks.Open
Open es una instrucción que conecta un archivo de texto a un número de canal. No tiene nada que ver
con cargar una hoja de cálculo. Abrir un .xlsx con Open ... For Input te da los bytes crudos de un
contenedor zip, no un libro del que puedas leer celdas:
Open "Book.xlsx" For Input As #n ' bytes crudos - NO un libro utilizable
Para cargar un libro de verdad usas el método Workbooks.Open, que
devuelve un objeto Workbook con hojas y celdas. La colisión de nombres es una fuente frecuente de
confusión: Open (la instrucción) es para canales de texto; Workbooks.Open (el método) es para
libros. Si tu archivo es un .csv que quieres como filas y columnas, abrirlo como libro suele ser
más simple que parsear el texto tú mismo.
Por qué un canal sin cerrar bloquea el archivo
Cada Open debe emparejarse con un Close. Un canal que nunca cierras mantiene el archivo
bloqueado — no puedes reabrirlo, borrarlo con Kill, ni abrirlo en
Excel — hasta que el libro o el propio Excel se cierren. La trampa es un error entre Open y Close:
el error salta por encima de tu línea Close, y el canal se fuga.
La forma robusta pone el Close en un manejador de errores para que se ejecute tanto si la escritura
tiene éxito como si falla:
Sub SafeWrite(ByVal path As String, ByVal text As String)
Dim n As Integer
n = FreeFile
On Error GoTo Cleanup
Open path For Output As #n
Print #n, text
Cleanup:
Close #n ' se ejecuta en exito Y en error
End Sub
Close #n libera un canal; un Close a secas sin número cierra todos los archivos abiertos de
golpe, lo que es un último recurso útil pero tosco. Consulta On Error para el
patrón completo de limpieza garantizada.
El veredicto honesto: FreeFile, una variable y un Close garantizado
La API built-in Open/Close es rápida y sin dependencias — solo te pide que respetes el canal. Cuatro
reglas la cubren:
- Nunca codifiques el número a fuego →
n = FreeFileuna vez, luego usa#nen todas partes. Un#1literal es unerror 55latente. - Conoce tu modo →
For Appendhace crecer un archivo;For Outputlo borra primero;For Inputnecesita que el archivo exista. - La instrucción no es el método →
Openabre un canal de texto;Workbooks.Openabre un libro. - Cierra siempre → pon
Close #nen un manejadorOn Errorpara que un fallo a mitad de escritura no pueda dejar el archivo bloqueado.
El único hábito que previene la mayoría de los bugs de archivos es la primera línea de cada rutina:
n = FreeFile. Elige el número a mano y habrás escogido la única cosa que VBA estaba listo para escoger
correctamente por ti.
Cómo ayuda ExcelMaster
Escribir un archivo de texto de forma segura significa tomar el número de canal de FreeFile en lugar
de codificar #1 a fuego, elegir For Append sobre For Output cuando el historial debe sobrevivir, y
garantizar un Close incluso cuando una escritura falla — tres detalles alrededor de una instrucción que
parece que debería solo abrir un archivo.
ExcelMaster escribe la rutina de
manejo de archivos que no se fugará ni borrará nada. Describe el trabajo — «añade cada ejecución a un log
junto al libro» o «exporta este rango a un archivo de texto» — y produce la captura de FreeFile, el
modo correcto y el Close garantizado, anclado a ThisWorkbook.Path. Tú
describes el archivo que quieres; él escribe el código que abre el canal correctamente y siempre lo
libera.
Preguntas frecuentes
¿Qué hace FreeFile en VBA?
FreeFile devuelve el siguiente número de canal de archivo que no está en uso en ese momento, para que
puedas abrir un archivo sin adivinar un número. Captúralo en una variable antes de abrir el archivo —
n = FreeFile: Open path For Output As #n — porque FreeFile sigue devolviendo el mismo valor hasta que
un archivo está realmente abierto en ese número. Usar FreeFile en lugar de un #1 fijo previene el
error 55 File already open cuando hay más de un archivo abierto a la vez.
¿Cómo abro un archivo de texto en VBA?
Usa la instrucción Open con un modo y un número de canal: Open "C:\data.txt" For Input As #n, donde
n = FreeFile. Usa For Output para crear o sobrescribir, For Append para añadir al final, y For Input para leer. Emparéjalo siempre con Close #n cuando termines. Ten en cuenta que esto abre un canal
de texto; para cargar una hoja de cálculo usa Workbooks.Open en su
lugar.
¿Por qué VBA da error 55 File already open?
Porque el número de canal que pasaste a Open ya está en uso — casi siempre porque el código codifica
#1 a fuego y un segundo Open lo reutiliza antes de cerrar el primero. Reemplaza cada número literal
por n = FreeFile capturado en su propia variable, y cierra cada canal con Close #n en cuanto
termines, para que los números nunca se reserven dos veces.
¿For Output borra el archivo existente en VBA?
Sí. Abrir un archivo existente For Output lo trunca a vacío antes de que escribas nada — su
contenido anterior desaparece. Si quieres conservar el contenido previo y añadirle más, abre el archivo
For Append en su lugar. For Output es solo para archivos que piensas reescribir desde cero en cada
ejecución.
¿Qué pasa si no cierro un archivo en VBA?
El archivo permanece bloqueado en su canal — no puedes reabrirlo, borrarlo con
Kill, ni abrirlo en Excel — hasta que el libro o Excel se cierren. Para
evitar una fuga cuando un error interrumpe una escritura, pon Close #n en una sección de limpieza
On Error para que se ejecute tanto si la escritura tiene éxito como si falla.
Probado en
Probado en: Excel 365 (Windows 11), VBA 7.1 — última verificación el 25/08/2026.
Guías relacionadas: VBA Print # vs Write # · VBA Read Text File · VBA Open Workbook · VBA FileSystemObject · VBA On Error
