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

VBA FreeFile y la instrucción Open en Excel — obtén un número de archivo, abre un archivo de texto (no un libro)

|

VBA FreeFile y la instrucción Open en Excel — obtén un número de archivo, abre un archivo de texto (no un libro)

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úmero n es un manejador al que se refieren después cada Print #n y Close #n — tómalo de FreeFile, nunca codifiques #1 a fuego. Dos archivos con #1 fijo lanzan error 55, For Output trunca a vacío un archivo existente, y un canal que olvidas cerrar con Close permanece 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 — FreeFile te entrega un número de canal; captúralo en una variable
  • Por qué codificar #1 a fuego lanza error 55 en 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 Open no es Workbooks.Open
  • Por qué un canal que nunca cierras con Close bloquea el archivo hasta que Excel se cierra
  • El patrón de limpieza con On Error que 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 existente For Output borra 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 lanza error 53 File not found, así que protégelo primero con Dir.
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 fuegon = FreeFile una vez, luego usa #n en todas partes. Un #1 literal es un error 55 latente.
  • Conoce tu modoFor Append hace crecer un archivo; For Output lo borra primero; For Input necesita que el archivo exista.
  • La instrucción no es el métodoOpen abre un canal de texto; Workbooks.Open abre un libro.
  • Cierra siempre → pon Close #n en un manejador On Error para 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