Saltar al contenido

Importar TXT a Excel en celdas no adyacentes


bomec

Recommended Posts

publicado

Estimados foreros:

Acudo a su maestría para ver si me pueden ayudar con un problema de importación de TXT a Excel que tengo. He reutilizado, adaptándola, una macro que creó el maestro @Haplox y que mostró en este foro para otro compañero con un problema parecido al que ahora planteo. Aprovecho para agradecerle su propuesta, porque me ha sido muy útil.

A lo que vamos...

Verán, tengo un archivo de texto delimitado por puntos y coma, el cual quiero importar a una hoja de Excel, pero los datos de cada fila del TXT deben situarse en celdas NO contiguas. He retocado la macro de @Haplox, pero no logro que la importación se realice como yo necesito (se importan los datos en celdas contiguas, cuando yo necesito que la importación se realice de otro modo). Les adjunto un archivo de Excel con la importación tal como queda con mi macro (adaptación de la de Haplox) y en ese mismo archivo, un poco más abajo, les muestro el modo en que debería quedar la importación. Adjunto también el archivo de texto desde el que realizar la importación, para que vean la estructura de este.

En resumen, la macro debe recorrer las filas del archivo de texto y colocar cada campo en una celda NO contigua. En todo caso, el patrón siempre se repetirá.

Les quedaría muy agradecido si me dijeran cómo corregir la macro para conseguir lo que necesito.

Desde ya mil gracias por adelantado.

 

Datos.txt

Importar TXT en celdas no contiguas.xlsm

Invitado Cacho R
publicado

Hola! bomec. Intenta con lo que sigue:

Sub Importar_TXT()
Dim mFile, iLine, Mat(1 To 2, 1 To 2)

mFile = "Selecciona el archivo a importar"
MsgBox mFile & "..."
mFile = Application.GetOpenFilename("txt Files (*.txt), *.txt", Title:=mFile)
If mFile = False Then Exit Sub
Application.ScreenUpdating = False

Close
Open mFile For Input As #82
Do Until EOF(82)
  Line Input #82, iLine
  iLine = Split(iLine, ";")
  Mat(1, 1) = iLine(0): Mat(1, 2) = iLine(1): Mat(2, 2) = iLine(2)
  Cells(Rows.Count, "a").End(xlUp).Offset(3).Resize(2, 2) = Mat
Loop
Close
Application.ScreenUpdating = True
End Sub

 

publicado

Muchas gracias @Cacho R. El código funciona bien para lo que quiero hacer, pero me surge un pequeño problema. Yo querría que la primera celda en la que empieza a importarse el código fuera, por ejemplo, la celda B7 y a partir de ahí se siguiera el patrón de importación. Con el código que me propones, la importación comienza desde principio del archivo (celda A1, aunque realmente empieza a importar en la A3 por el offset que incluye el código). ¿Habría algún modo sencillo de resolver esto? Es decir, que yo pueda decidir a partir de qué celda debe empezar a importarse el primer campo del TXT.

Gracias por adelantado.

Invitado Cacho R
publicado

Después que el código terminó de ejecutarse, podrías eliminarle las primeras 2, 3, 5 o 7 filas: Rows("1:5").Delete

 

publicado

Muchas gracias por tu respuesta @Cacho R, pero eso no puedo hacerlo, porque justo las filas que hay por encima contienen información que no puedo borrar. Por eso necesito una fórmula que me permita empezar a importar el TXT desde una celda concreta, para que pueda ir de ahí hacia abajo.

Invitado Cacho R
publicado

Sube al Foro -nuevamente- dos archivos: el txt y el Excel con el resultado definitivo esperado puesto que no te entendí nada...

Y de paso no dejes de advertir que esta pérdida de tiempo la has generado tú al subir al Foro un modelo que no responde a tu necesidad real (lo que no sería un problema si supieses adecuar correctamente lo que te pasé: ¿Lección aprendida, mi estimado?...).

Saludos, Cacho R.
.

publicado

Estimado @Cacho R:

Vuelvo a subir los dos archivos. Espero que ahora quede más claro lo que necesito.

En el Excel, verás varias celdas de fondo verde (5 bloques de 5 celdas cada uno). A cada uno de esos bloques deben ir a parar los datos de cada una de las filas del TXT. En las celdas verdes verás el orden en que deben llegar los datos.

Lamento mucho haberte hecho perder el tiempo. No era mi intención.

Sí he adecuado en cierta medida lo que me pasaste (podrás comprobarlo en el código del Excel), lo que ocurre es que mis conocimientos (lamentablemente) son limitados. Por esa razón precisamente me dirijo al foro, para aprender de quien sabe y mejorar. Y espero poder seguir haciéndolo.

De nuevo, gracias por tu tiempo. Y sí, descuida, he aprendido la lección.

Cordialmente.

 

Datos.txt

Importar TXT en celdas no contiguas 2.xlsm

Invitado Cacho R
publicado
Hace 5 horas, bomec dijo:

Y sí, descuida, he aprendido la lección.

¿Sí?... :blink: :wacko:  Bueno... veamos:

- Tu nuevo archivo excel está pletórico de celdas con textos del tipo: campo1, campo2 o campo3.
- Eso no tendría nada de malo si no fuese que nada de eso existe en tus dos archivos de texto subidos al Foro ni en tu archivo de Excel inicial.

- ¿Qué significa "eso"?...
¡Qué pretendes que "adivine" como se relaciona esta nueva info con la anterior!

En verdad prefiero emplear mis dotes adivinatorios en "algo" más útil, por lo que esperaré a que subas al Foro lo pedido.
Esto es: un archivo Excel que contenga en alguna de sus hojas la distribución de la info del archivo de texto que deseas importar, ¿Comprendes?... ¿No es difícil, verdad?

Saludos, Cacho R.
.
 

publicado

¡Vaya, @Cacho R! De verdad que no pensaba que mis archivos eran tan difíciles de entender. Lo siento.

Vuelvo a subirlos con la esperanza de que esta vez se ajusten exactamente a lo que solicitas. A ver si a la tercera he aprendido la lección...

Nuevamente, te agradezco a ti (o a cualquier otra persona que participe) el tiempo que dedicáis a ayudar a quien sabe menos.

Saludos cordiales.

Datos.txt

Importar TXT en celdas no contiguas 3.xlsm

Invitado Cacho R
publicado
Hace 12 horas, bomec dijo:

A ver si a la tercera he aprendido la lección...

¡Esta vez "te salió" impecable! (Jajjjajaja)... ¡Dame un rato, por favor!

Invitado Cacho R
publicado

Ok, entonces: ¿Podrías probar lo que sigue?...

Sub Importar_txt()
Dim Tmp, Rng As Range, Mat
'---------------\
ChDrive ThisWorkbook.Path: ChDir ThisWorkbook.Path
Tmp = "Selecciona el archivo 'txt' a procesar"
MsgBox Tmp & "..."
Tmp = Application.GetOpenFilename("txt Files (*.txt), *.txt", Title:="<" & Tmp & ">")
If Tmp = False Then Exit Sub
'---------------/

Set Rng = Range("b7")
Close: Open Tmp For Input As #82

'---------------\
Do Until EOF(82)
  ReDim Mat(1 To 2, 1 To 6)
  Line Input #82, Tmp
  Tmp = Split(Tmp, ";")
  Mat(1, 1) = Tmp(0): Mat(2, 1) = Tmp(1)
  Mat(1, 4) = Tmp(2): Mat(1, 6) = Tmp(3)
  Mat(2, 6) = Tmp(4): Rng.Resize(2, 6) = Mat
  Set Rng = Rng.Offset(4)
Loop
'---------------/
Close: Set Rng = Nothing: Mat = Empty
End Sub

 

publicado

Bueno, @Cacho R: en primer lugar, me alegro de que esta vez me "saliera" impecable la subida de archivos. :D

En segundo lugar y más importante: ¡mil gracias por tu código, que funciona a las mil maravillas! Es exactamente lo que necesitaba. Resulta, además, sencillo de entender y creo que sabré modificarlo si en el futuro necesitara hacer algún cambio en la hoja con la que estoy trabajando. 

Así que de nuevo gracias por tu tiempo y por compartir tu saber con los que aún estamos aprendiendo, con muchas ganas e interés, te lo aseguro.

Espero poder contar con tu ayuda (y con la del resto de participantes en el foro) más adelante si la necesitara.

Por mi parte, podemos dar el tema por resuelto y cerrado.

Cordialmente.

Invitado Cacho R
publicado
Hace 41 minutos , bomec dijo:

... me alegro de que esta vez me "saliera" impecable la subida de archivos. :D

En segundo lugar y más importante: ¡mil gracias por tu código, que funciona a las mil maravillas! Es exactamente lo que necesitaba.

¿Viste?... ¿Viste?...

Preguntar con claridad y adjuntar los archivos con la info adecuada es "la llave" para que se te entienda adecuadamente.

Saludos y hasta la próxima.
Cacho R.

 

  • Silvia bloqueó este tema

Archivado

Este tema está ahora archivado y está cerrado a más respuestas.

×
×
  • Crear nuevo...

Información importante

Echa un vistazo a nuestra política de cookies para ayudarte a tener una mejor experiencia de navegación. Puedes ajustar aquí la configuración. Pulsa el botón Aceptar, si estás de acuerdo.