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.

  • 109 ¿Te parecen útiles los tips de las funciones? (ver tema completo)

    1. 1. ¿Te parecen útiles los tips de las funciones?


      • No
      • Ni me he fijado en ellos

  • Current Donation Goals

    • Raised 0.00 EUR of 130.00 EUR target
  • Archivos

  • Estadísticas de descargas

    • Archivos
      187
    • Comentarios
      97
    • Revisiones
      28

    Más información sobre "Un juego del Rabino en Excel"
    Última descarga
    Por pegones1

    1    1

  • Crear macros Excel

  • Mensajes

    • Vale mil gracias, en vdd se agradece todo el apoyo y comentarios
    • Hola nuevamente. Por eso la importancia de lo que mencionas tú como "ruta relativa". Tal cual comentas, y aún sin llegar a algunos detalles importantes para ayudarte, en realidad tal cual te comenté le día miércoles, pues sí podías hacer como comentabas, era cosa de obtener los Id de Windows (como tú los llamas) y la ruta de OneDrive en casa usuario y eso sí se puede obtener con VBA y luego pasarlo a PQ, pero medio que te cerraste en que "PQ no puede trabajar con rutas relativas", cosa cierta pero siempre hay formas. Si SAP puede o no guardar en OneDrive o SharePoint, pues si está mapeado en la PC ¡claro que se puede! Pero bueno, creo que si te es útil tu propia propuesta ¡avanza con eso!
    • Perdona @Abraham Valencia pero he estado liado estos días. En realidad todo el problema se reduce a estos dos problemas: Problema 1: El script que "fabrica" SAP y que luego "pego" en la macro, no es capaz de  guardar archivos en SharePoint. He estado buscando, y en realidad muchas personas tienen ese problema (no poder guardar un Excel en SAP a través de VBA). Eso muy probablemente sean problemas de permisos, que no puedo cambiar (no soy administrador de nada). Como no puedo solucionarlo así, paso al plan B, que es guardar en Excel que me genera SAP en el ordenador de cada usuario que ejecute la plantilla (y que sí está guardada en SharePoint), para después con PowerQuery llamar a ese Excel (el export). Para ello, pretendo guardar el export, en la ruta relativa "C:\..\..\..\OneDrive - NombreEmpresa\Documentos\SAP\SAP GUI" donde los \..\..\..\ saltan las rutas personales de cada usuario (tipo C:\users\IDusuario\). Eso lo hace bien, y el archivo se guarda en la ruta de cada usuario que lo usa, pero surge el problema 2 Problema 2: PowerQuery no trabaja con rutas relativas del tipo  "C:\..\..\..\OneDrive - NombreEmpresa\Documentos\SAP\SAP GUI" necesita que sea del tipo fija "C:\users\IDusuario\OneDrive - NombreEmpresa\Documentos\SAP\SAP GUI" pero claro, IDusuario es diferente para cada usuario.   Pero escribiendo todo esto, creo que he dado con una posible solución, no grabar el export en una ruta de usuario, sino en una en la raiz de C:, que siempre será igual para todos los usuarios, del tipo C:\Sap\export.xlsx que seria igual en todos los ordenadores. Asi sí podría decirle a PowerQuery que vaya siempre a la ruta C:\Sap\ que existirá en todos los ordenadores. Mañana intentaré hacer pruebas, aunque mi solución ideal seria que se pudiera guardar en el SharePoint. Saludos.
    • Hola La opción brindada por @torquemada es correcta, funciona, pero hay algunos inconvenientes que (desde mi punto de vista) no la convierten en mi primera elección. Los inconvenientes son: Tendrías que ir columna por columna haciendo los reemplazos, claro que no se harían a mano sino que utilizarías la opción reemplazar o la opción texto en columnas, aun asi demorará un poquito y será trabajoso. Cada vez que descargues otro listado, tendrás que volver a realizar los reemplazos. Me parece una mejor propuesta lo siguiente: Descarga los movimientos a un archivo de Excel Desde tu control de pagos (otro archivo) cargas los movimientos del archivo descargado mediante Power Query Power Query hará los reemplazos y reconocerá todo correctamente (sin que tengas que hacer nada especial) Cuando descargues los movimientos un día posterior, solamente tendrás que hacer clic en "Actualizar" y todo funcionará en automático
    • Hola a todos, Efectivamente, me temo que tal como trabajan las funciones =HOY() y/o =AHORA() (volátiles), sólo con macros puedes obtener soluciones. Un recurso pedestre podría ser, cada vez que quieras que se fije un dato, te sitúes en esa celda y pulses F2, F9 e INTRO.  Pero claro, puede ser un inconveniente si hay que hacerlo repetitivamente en muchas ocasiones,.............. en fin, lo comento sólo como posibilidad. Saludos,
  • Visualizado recientemente

    • No hay usuarios registrado para ver esta página.
×
×
  • 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.