Macro que importe información especifica de varios archivos .txt a una misma hoja de Excel.

Necesito su ayuda para crear una macro que me ayude a copiar cierta información de varios archivos .txt a una hoja de Excel.

De cada archivo de txt, necesito los renglones 5 y del 10 en adelante. Esta información varia en cantidad de filas únicamente a partir del renglón 10 en adelante. La información de los primeros 9 renglones, siempre es la misma. Siempre son las mismas columnas y la misma cantidad de información en cada celda.

La información debe comenzar en B2 y ser separada por columnas, el problema es que, por ejemplo la primer columna del txt dice PPPXXPPX0036 y en la siguiente fila dice 985, necesito que esa información aparezca, concatenada en la misma celda, el mismo caso para las columnas C, I y J. Ejemplo:

La información de las 4 primeras filas, no se necesita, de cada uno de los archivos txt, se elimina y la información que quede en la celda B1, (A7714-DK...) se copiara en la columna A, en todas las filas que contengan informacion para el mismo txt, esto sucedera con cada uno de los txt. Tambien se debe copiar la informacion de las columnas B y C en la cantidad de filas que contenga el archivo. Ejemplo: Como debe quedar terminado el archivo.

El otro detalle de algunos de estos archivos txt es que viene información separada y en otros casos diferentes registros dentro de un mismo archivo txt, es decir, existen lineas intermedias que no son necesarias, en este caso, las que dicen SUB TOTAL.

Se necesitaría que la macro ignorara estas filas y no copiara la información, sino continuara en la siguiente linea y copiara en una fila diferente, dentro del archivo de excel, el siguiente registro, como uno nuevo, con la misma dinámica anterior.

Para este ejemplo anterior, la primera y la segunda marca, solo contienen 1 registro, pero en la tercera marca, vienen dos registros, aquí aplicaríamos el auto llenado antes mencionado, copiando la misma información del registro de arriba al siguiente.

Espero me puedan ayudar con mi problema, y disculpen nuevamente la complejidad que este genere... He tratado con algunas macros que he encontrado, pero no hago que se recopile la información como la necesito. De ser necesario, les puedo enviar una carpeta con estos archivos, para mayor facilidad de trabajo.

3 respuestas

Respuesta
3

Listo, ya te mandé lo que solicitabas... quizás era más fácil hacer un collage entre Query y VBA pero al final salió todo con Query, por lo que el archivo hará toda la consolidación sin usar macros.

Eso si, la complejidad que te mencioné me obligó a generar muchas consultas lo que ha ralentizado notablemente la consulta... paciencia!

Jaime muchísimas gracias! Hasta ahora esta trabajando perfectamente con la nueva información que me enviaron. 

Te agradezco mucho tu tiempo y esfuerzo.

Saludos. 

Respuesta
1

La solución es bastante compleja, puesto que deberás usar programación, no macros... Creo que es muy difícil hacerlo con macros, sino imposible.

Por lo que veo, casi todo está en posiciones fijas, por lo que deberías tratar el fichero de texto como si fuese un archivo secuencial y leer carácter a carácter, escogiendo aquellas posiciones que te sean interesantes y pasándolas a otro fichero. -Y te recomiendo un fichero CSV, ya que es importable directamente desde Excel.-

Para que el Excel interprete bien cada celda, basta con separar un dato de otro con un punto y coma ";"

Aquí te dejo un ejemplo de cómo sería el programa...

Sub leerArchivoTxt()
Dim archivo_TXT As String  'ruta y nombre del archivo de texto
Dim archivo_CSV As String  'ruta y nombre del archivo de exportacion CSV
Dim texto As String    'línea de texto a leer/grabar
'Abrir el archivo de texto
archivo_TXT = "C:\Documentos\ArchivoTexto.txt"
Open "C:\Archivo_TXT.txt" For input AS #1 
'Abrir el archivo CSV
archivo_CSV = "C:\Documentos\ArchivoCSV.csv"
Open "C:\Archivo_TXT.txt" For output AS #2 
'Leer y procesar el contenido del archivo
While Not EOF(1) 'la función EOF regresa verdadero al llegar al final del archivo
    Line Input #1, texto  'lee cada una de las líneas del archivo y las almacena en la variable texto
    ...
    ... Aquí debes hacer las operaciones "MID", "LEFT" y "RIGHT" necesarias
 ... para extraer el texto que quieres de la variable "Texto"
    ... Por ejemplo:
    CodigoX = Mid$(texto, 10,15) 'Esto indica que extraiga el texto entre las posiciones 10 y 15 y
                'Y lo guarde en la variable CodigoX
    Print #2, CodigoX & ";" 
Wend
'Cerrar el archivo de entrada
Close #1
'Cerrar el archivo de salida
Close #2
End Sub

Hola Gomzky 

Gracias por responder, pero tengo unas dudas:

En esta parte coloco la ruta de los archivos y los va a leer todos o solo de uno en uno, ahora son varias rutas en diferentes carpetas, voy a tener que estar cambiando el programa a cada rato? 

'Abrir el archivo de texto
archivo_TXT = "C:\Documentos\ArchivoTexto.txt"
Open "C:\Archivo_TXT.txt" For input AS #1

y lo de separar los datos con punto y coma, es dentro de los txt para cada archivo? eso no lo comprendo muy bien. 

Saludos. 

Si son muchos archivos, puedes optar por dos cosas... una es que te pregunte la ruta del archivo cada vez, poniendo un InputBox tal como esto:
RutaArchivo=InputBox("Introduce la Ruta y nombre del Archivo")

y despues, en lugar de decirle la ruta fija, lo cambias por la variable asi:
Open RutaArchivo for input as #1

La otra opción, sería un poco más complicada, pero más efectiva.- Consistiría en tener un archivo de texto con las rutas de todos los archivos que necesites procesar y lees la ruta y nombre del archivo a procesar antes de procesarlo. Sería algo como esto:

Sub leerArchivoTxt()
Dim RutasArchivos as String   'Archivo con las rutas de los archivos para procesar
Dim archivo_TXT As String  'ruta y nombre del archivo de texto
Dim archivo_CSV As String  'ruta y nombre del archivo de exportacion CSV
Dim texto As String    'línea de texto a leer/grabar
Dim RutaArchivo as string
'Abrir el archivo con las rutas
Open RutasArchivos for input as #3
 Line Input #3, RutaArchivo   'Esto lee la ruta del archivo de rutas
'Abrir el archivo de texto
Open RutaArchivo For input AS #1 '--> Esta es la linea que se sustituye <--
While Not Eof(3)    'Ejecuta esto, mientras haya rutas de archivos 
'Abrir el archivo CSV
archivo_CSV = "C:\Documentos\ArchivoCSV.csv"
Open "C:\Archivo_TXT.txt" For output AS #2 
'Leer y procesar el contenido del archivo
While Not EOF(1) 'la función EOF regresa verdadero al llegar al final del archivo
    Line Input #1, texto  'lee cada una de las líneas del archivo y las almacena en la variable texto
    ...
    ... Aquí debes hacer las operaciones "MID", "LEFT" y "RIGHT" necesarias
 ... para extraer el texto que quieres de la variable "Texto"
    ... Por ejemplo:
    CodigoX = Mid$(texto, 10,15) 'Esto indica que extraiga el texto entre las posiciones 10 y 15 y
                'Y lo guarde en la variable CodigoX
    Print #2, CodigoX & ";" 
Wend
'Cerrar el archivo de entrada
Close #1
Wend
'Cerrar el archivo de salida
Close #2
'Cerrar el archivo de rutas
Close #3
End Sub

Se me olvidaba comentarte que el archivo de rutas es un simple TXT con algo como esto:
--------------
"C:\Mis Documentos\Carpeta Archivos\ArchivoTexto1.txt"
"C:\OtraCarpeta\Archivo a procesar2.txt"
"Z:\Otros Archivos\Archivo3.txt"

... Y así sucesivamente...

Hola Gomzky

Te platico, son varios usuarios los que van a usar este programa, ellos deben poder tener la opción de seleccionar los archivos txt que necesitan importar a Excel, pero son varias las carpetas donde van a trabajar, no se puede estar manipulando en cada momento el código, ellos generan los txt a través de otro programa y crean las carpetas donde serán ubicados y pueden llegar a ser hasta 20 carpetas con 100 txt's en cada una de ellas ( esto como un ejemplo exagerado ). 

Por eso la complejidad del programa. 

Disculpa el retraso en contestar... Estuve ocupado estos días.

Quizás, en lugar de un archivo donde se ubican las rutas de los archivos a procesar, lo indicado sería hacer un código extra que lee las carpetas y busca los archivos ubicados en ellas. No es muy difícil de hacer, pero sí le añade una dificultad extra al programa.

Creo que Jaime Segura ya te ha enviado la solución, aunque no puedo ver cuál es lo que él te ha propuesto. -En caso de que necesites ayuda extra para la proposición que yo te indicaba, consúltame...

Gomsky muchas gracias por tu ayuda y por responder mi pregunta, efectivamente Jaime me envío su respuesta y si fue lo que necesitaba!

De igual manera, muchas gracias!

Respuesta
1

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas