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

VBA leer un archivo de texto en Excel — Line Input vs Input #, y el bucle EOF que no pierde filas

|

VBA leer un archivo de texto en Excel — Line Input vs Input #, y el bucle EOF que no pierde filas

TL;DR — Leer un archivo de texto tiene tres herramientas. Line Input # lee una línea cruda en una cadena (la divides tú mismo). Input # parsea campos delimitados directamente en variables (solo seguro en archivos que produjo Write #). Input(LOF(f), #f) lee el archivo entero de una vez. Itera con Do Until EOF(f) — comprueba EOF antes de cada lectura, o te pasas del final y te topas con el error 62.

Dim n As Integer, line As String
n = FreeFile
Open "C:\data.txt" For Input As #n
Do Until EOF(n)                 ' comprueba el final ANTES de leer
    Line Input #n, line         ' una linea cruda en una cadena
    Debug.Print line
Loop
Close #n

Una vez que un archivo está abierto en un canal, releerlo parece trivial — hasta que las columnas salen desordenadas o el bucle se deja la última fila. Ambos problemas vienen de elegir el lector equivocado. VBA te da tres, y no son intercambiables: uno te entrega la línea cruda, otro intenta parsearla por ti, y otro lee todo de una vez. El oficio está en emparejar el lector con cómo se escribió el archivo — y en saber que Input # y Write # son una pareja, igual que Line Input # y Print #.

Lo que aprenderás

  • El modelo mental — tres lectores, y elegir mal desordena tus datos
  • Line Input # — la línea cruda que divides tú mismo (el valor por defecto seguro)
  • Input # — el parser que es el gemelo de Write # (y se atraganta con un CSV plano)
  • El bucle Do Until EOF(), y el error de uno en uno que lanza error 62
  • Input(LOF(f), #f) — leer el archivo entero en una sola cadena
  • Cuándo es mejor abrir un CSV como libro que parsearlo a mano

El modelo mental: tres lectores, uno que encaja con tu archivo

La idea que previene la mayoría de los bugs de lectura: el lector debe coincidir con cómo se escribió el archivo.

  • Line Input # lee una línea como cadena cruda, con el salto de línea eliminado. No hace parseo — tú decides cómo dividirla. Predecible, y nunca malinterpreta tus datos.
  • Input # lee una lista de valores ya parseada directamente en variables, usando las mismas reglas de comillas y comas que escribe Write #. Es el gemelo exacto de Write #.
  • Input(LOF(f), #f) (la función, no la instrucción) lee el archivo entero en una sola cadena en una llamada.

Así que la regla de emparejamiento cae de inmediato: un archivo escrito con Write # se lee con Input #; un archivo escrito con Print # (o por cualquier otro programa) se lee con Line Input # y lo divides tú. Cruza las parejas — dale un CSV plano a Input # — y los campos aterrizan en las variables equivocadas.

Line Input #: la línea cruda que divides tú mismo

Line Input # es el caballo de batalla y el valor por defecto seguro. Lee exactamente una línea en una cadena, y lo que hagas después depende de ti:

Dim parts() As String
Line Input #n, line
parts = Split(line, ",")        ' TU eliges el delimitador

Como nunca parsea, nunca adivina mal. Lo único que hay que vigilar es que un Split(line, ",") ingenuo también divide las comas que están dentro de un campo entrecomillado ("Rome, Italy" se convierte en dos partes). Si tus datos tienen comas entrecomilladas, o parseas las comillas correctamente o — normalmente más simple — dejas que lo haga Excel, cubierto más abajo.

Input #: el gemelo de Write # (y por qué destroza un CSV plano)

Input # lee valores parseados directamente en variables tipadas:

Dim name As String, city As String, age As Long
Input #n, name, city, age       ' espera "Ann","Rome",42  (formato Write #)

En un archivo que produjo Write #, esto es perfecto y rápido — las comillas le dicen a Input # dónde empieza y termina cada cadena. En un CSV plano (Ann,Rome,42) normalmente aún funciona, pero se rompe en cuanto un campo contiene una coma sin comillas, un apóstrofo o una comilla suelta: los campos se desplazan, una " inicia una cadena que nunca se cierra, y el resto de la fila aterriza en las variables equivocadas. Por eso Input # solo es seguro en archivos escritos por Write #. Para cualquier otra cosa, Line Input # más tu propia división es la elección honesta.

El bucle EOF y el error de uno en uno que lanza error 62

No sabes cuántas líneas tiene un archivo, así que lees hasta el final — y la prueba del final es donde vive el bug clásico. Comprueba EOF antes de cada lectura:

Do Until EOF(n)          ' correcto: comprueba, LUEGO lee
    Line Input #n, line
    ' ... procesa la linea ...
Loop

La forma rota lee primero y comprueba después, así que intenta una lectura más allá de la última línea y lanza error 62 Input past end of file:

Do While Not EOF(n)
    ' ... procesa ...
    Line Input #n, line   ' en la pasada final esto lee mas alla del final -> error 62
Loop

EOF(n) devuelve True una vez que se ha leído la última línea. Pon la comprobación de EOF al principio del bucle para que se dispare antes de la lectura que se pasaría. Este único orden arregla el bug de «mi bucle se deja o duplica la última fila».

Input(LOF(f), #f): leer el archivo entero de una vez

Cuando quieres el archivo entero como una sola cadena — para buscar en él, contar algo, o entregárselo a un parser — léelo en una única llamada:

Dim whole As String
whole = Input(LOF(n), #n)        ' LOF(n) = longitud del archivo en bytes

LOF devuelve la longitud del archivo, e Input(length, #n) lee esa cantidad de caracteres. Es la forma más rápida de cargar un archivo pequeño o mediano, a costa de mantenerlo entero en memoria — bien para unos pocos megabytes, un desperdicio para un log gigante que solo necesitas recorrer línea a línea. Para eso, quédate con el bucle Line Input #.

Cuándo saltarse el parseo y abrir el libro en su lugar

Si el archivo es en realidad una hoja de cálculo — un .csv que quieres como filas y columnas, con las comas entrecomilladas gestionadas correctamente — parsear el texto a mano es el camino difícil. Workbooks.Open lee un CSV en una hoja real, gestiona las reglas de comillas por ti, y te deja leer Cells(r, c) directamente:

Dim wb As Workbook
Set wb = Workbooks.Open("C:\data.csv")   ' Excel parsea el CSV por ti

Reserva los lectores de texto built-in para trabajo de texto genuino — logs, archivos de ancho fijo, configuración, o ir y volver de VBA a VBA con Write #/Input #. Para datos tabulares destinados a celdas, abrir el libro es más simple y más correcto. Ten en cuenta que la lectura built-in es ANSI, así que un archivo UTF-8 con caracteres acentuados necesita ADODB.Stream o el FileSystemObject para leerse correctamente.

El veredicto honesto: Line Input por defecto, Input # solo para archivos de Write

Tres lectores, y la elección no es cuestión de velocidad — es cuestión de coincidir con quien escribió:

  • Line Input # es el valor por defecto → te entrega la línea cruda y nunca lee mal; la divides tú, así que mantienes el control.
  • Input # solo para archivos de Write # → es el gemelo de Write # y se desordena en un CSV plano con comas sin comillas o comillas sueltas.
  • Comprueba EOF al principio del bucle → leer-y-luego-comprobar se pasa de la última línea y lanza error 62.
  • Datos tabulares → abre el libro → deja que Excel gestione las comillas del CSV en lugar de parsearlas a mano.

La señal más clara de que elegiste el lector equivocado son columnas aterrizando en las variables equivocadas. Cuando eso pasa, le diste a Input # un archivo que no escribió; cambia a Line Input # y divídelo tú mismo.

Cómo ayuda ExcelMaster

Releer un archivo significa emparejar el lector con quien escribió — Input # para archivos de Write #, Line Input # para todo lo demás — poner la comprobación de EOF antes de la lectura para que no se pierda la última fila, y saber cuándo abrir el CSV como libro le gana a parsear el texto a mano. Eso es mucho criterio para «leer un archivo».

ExcelMaster escribe el lector que coincide con tu archivo. Describe el trabajo — «importa este log a una hoja» o «lee cada línea y extrae las filas de error» — y produce el bucle Do Until EOF con Line Input #, la división correcta y un Close, o abre el CSV como libro cuando ese es el camino más limpio — anclado a ThisWorkbook.Path. Tú describes los datos que necesitas; él escribe el código que lee cada fila exactamente una vez.

Preguntas frecuentes

¿Cómo leo un archivo de texto línea a línea en VBA?

Ábrelo For Input, luego itera con Do Until EOF(n) y Line Input #n, line para leer una línea cruda en cada pasada, y Close #n cuando termines. Toma el número de canal de FreeFile. Pon la comprobación de EOF al principio del bucle, antes de la lectura, para que el bucle no intente una lectura más allá de la última línea y lance el error 62.

¿Cuál es la diferencia entre Line Input # e Input # en VBA?

Line Input # lee una línea cruda en una cadena y te deja el parseo a ti, así que nunca lee mal tus datos. Input # parsea campos delimitados directamente en variables usando las reglas de comillas y comas que escribe Write #, así que solo es fiable en archivos que produjo Write #. Para un CSV plano, usa Line Input # y divide la línea tú mismo.

¿Por qué mi bucle de lectura de VBA se salta o duplica la última línea?

Porque la comprobación de EOF está en el lugar equivocado. Si lees primero y compruebas EOF después, el bucle o se pasa de la última línea — lanzando error 62 Input past end of file — o la gestiona mal. Usa Do Until EOF(n) al principio del bucle para que la prueba de fin de archivo se ejecute antes de cada Line Input #.

¿Cómo leo un archivo de texto entero en una sola cadena en VBA?

Usa la función Input con LOF: whole = Input(LOF(n), #n) después de abrir el archivo For Input. LOF devuelve la longitud del archivo en bytes e Input(length, #n) lee esa cantidad de caracteres en una llamada. Es la forma más rápida de cargar un archivo pequeño o mediano, pero mantiene el archivo entero en memoria, así que usa el bucle Line Input # para archivos muy grandes.

¿Cómo leo un archivo CSV en VBA?

Si el CSV son datos tabulares destinados a celdas, la forma correcta más simple es Workbooks.Open, que parsea las reglas de comillas y te da una hoja real para leer con Cells(r, c). Si debes parsear el texto directamente, usa Line Input # y divide cada línea, gestionando tú mismo las comas entrecomilladas — y echa mano de ADODB.Stream o del FileSystemObject si el archivo es UTF-8, ya que la lectura built-in es ANSI.

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 Print # vs Write # · VBA Open Workbook · VBA FileSystemObject · VBA Dir