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

  • Ayúdanos a mejorar la comunidad

    • Donaciones recibidas este mes: 0.00 EUR
      Objetivo: 130.00 EUR
  • Archivos

  • Estadísticas de descargas

    • Archivos
      188
    • Comentarios
      98
    • Revisiones
      29

    Más información sobre "Cambios en el Control Horario"
    Última descarga
    Por pegones1

    4    1

  • Crear macros Excel

  • Mensajes

    • Hola, veo que tienes 365, así que esta forma funcionará   Almacen.xlsx
    • Buenos días  @LeandroA espero estes bien Tengo un caso idéntico al planteado en la siguiente pregunta: Sin embargo, a diferencia de quien planteo originalmente la pregunta al correr el código no obtengo ningún resultado podrían ayudarme a resolver este inconveniente y que al hacer click en el Botón Guardar (CommandButton3) del Formulario RCS (frmrcs) el archivo pdf quede configurado con orientación vertical, márgenes superior, inferior, derecho e izquierdo = 1 y en página tamaño carta. Si acaso influye uso Microsoft Excel LTSC MSO (versión 2209 Compilación16.0.1.15629.20200) de 64 bits Mucho le sabre agradecer la ayuda que me pueda dar  RCS PRUEBA - copia.xlsm
    • @JSDJSDCon gusto mi estimado Para la opción 1: Sub Surtirhastadondealcanse() Dim ws As Worksheet Set ws = ThisWorkbook.Sheets(1) Dim filaInicio As Integer: filaInicio = 4 Dim filaFin As Integer: filaFin = 7 Dim colInventario As Integer: colInventario = 2 Dim colSolicitudesInicio As Integer: colSolicitudesInicio = 4 ' Columna C Dim colResultadoInicio As Integer: colResultadoInicio = 9 ' Columna I Dim colTotalSurtido As Integer: colTotalSurtido = 12 ' Columna L Dim colFinalInventario As Integer: colFinalInventario = 13 ' Columna M Dim numClientes As Integer: numClientes = 3 Dim fila As Integer, i As Integer For fila = filaInicio To filaFin Dim inventario As Double inventario = Val(ws.Cells(fila, colInventario).Value) Dim solicitudes(1 To 3) As Double Dim surtido(1 To 3) As Variant Dim totalSurtido As Double: totalSurtido = 0 ' Leer solicitudes For i = 1 To numClientes If IsNumeric(ws.Cells(fila, colSolicitudesInicio + i - 1).Value) Then solicitudes(i) = CDbl(ws.Cells(fila, colSolicitudesInicio + i - 1).Value) Else solicitudes(i) = 0 End If surtido(i) = "POR FALTA STOCK" Next i ' Surtir de acuerdo al inventario disponible For i = 1 To numClientes If solicitudes(i) > 0 Then If inventario >= solicitudes(i) Then surtido(i) = solicitudes(i) inventario = inventario - solicitudes(i) totalSurtido = totalSurtido + solicitudes(i) ElseIf inventario > 0 Then surtido(i) = inventario totalSurtido = totalSurtido + inventario inventario = 0 Else surtido(i) = "POR FALTA STOCK" End If End If Next i ' Escribir resultados en las columnas correspondientes para cada cliente For i = 1 To numClientes With ws.Cells(fila, colResultadoInicio + i - 1) If surtido(i) = "POR FALTA STOCK" Then .Value = surtido(i) .Font.Color = vbRed Else .Value = surtido(i) .Font.Color = vbBlack End If End With Next i ' Escribir total surtido y existencia final ws.Cells(fila, colTotalSurtido).Value = totalSurtido ws.Cells(fila, colFinalInventario).Value = inventario Next fila MsgBox "Resultado surtido cargado con éxito...", vbInformation End Sub Para la opción 2:   Sub surtirenpartesiguales() Dim ws As Worksheet Set ws = ThisWorkbook.Sheets(1) Dim filaInicio As Integer: filaInicio = 13 Dim filaFin As Integer: filaFin = 16 Dim colInventario As Integer: colInventario = 2 Dim colSolicitudesInicio As Integer: colSolicitudesInicio = 4 ' Columna C Dim colResultadoInicio As Integer: colResultadoInicio = 9 ' Columna I Dim colTotalSurtido As Integer: colTotalSurtido = 12 ' Columna L Dim colFinalInventario As Integer: colFinalInventario = 13 ' Columna M Dim numClientes As Integer: numClientes = 3 Dim fila As Integer, i As Integer For fila = filaInicio To filaFin Dim inventario As Double inventario = Val(ws.Cells(fila, colInventario).Value) Dim solicitudes(1 To 3) As Double Dim surtido(1 To 3) As Variant Dim totalSurtido As Double: totalSurtido = 0 Dim totalPedido As Double: totalPedido = 0 ' Leer solicitudes For i = 1 To numClientes If IsNumeric(ws.Cells(fila, colSolicitudesInicio + i - 1).Value) Then solicitudes(i) = CDbl(ws.Cells(fila, colSolicitudesInicio + i - 1).Value) totalPedido = totalPedido + solicitudes(i) Else solicitudes(i) = 0 End If surtido(i) = 0 Next i ' Si hay suficiente inventario, surtir lo que el cliente pide If inventario >= totalPedido Then For i = 1 To numClientes If solicitudes(i) > 0 And inventario >= solicitudes(i) Then surtido(i) = solicitudes(i) inventario = inventario - solicitudes(i) totalSurtido = totalSurtido + solicitudes(i) End If Next i Else ' Reparto base igualitario Dim baseSurtido As Long baseSurtido = Int(inventario / numClientes) For i = 1 To numClientes If solicitudes(i) > 0 Then If solicitudes(i) <= baseSurtido Then surtido(i) = solicitudes(i) inventario = inventario - solicitudes(i) totalSurtido = totalSurtido + solicitudes(i) Else surtido(i) = baseSurtido inventario = inventario - baseSurtido totalSurtido = totalSurtido + baseSurtido End If End If Next i ' Repartir sobrante restante uno por uno, respetando lo pedido Do While inventario > 0 For i = 1 To numClientes If surtido(i) < solicitudes(i) Then surtido(i) = surtido(i) + 1 totalSurtido = totalSurtido + 1 inventario = inventario - 1 If inventario = 0 Then Exit For End If Next i Loop End If ' Escribir resultados en las columnas correspondientes para cada cliente For i = 1 To numClientes With ws.Cells(fila, colResultadoInicio + i - 1) If surtido(i) = 0 Then .Value = "POR FALTA STOCK" .Font.Color = vbRed Else .Value = surtido(i) .Font.Color = vbBlack End If End With Next i ' Escribir total surtido y existencia final ws.Cells(fila, colTotalSurtido).Value = totalSurtido ws.Cells(fila, colFinalInventario).Value = inventario Next fila MsgBox "Resultado surtido cargado con éxito...", vbInformation End Sub Saludos, Diego
    • Buenos dias.  Estoy trabajando en una hoja para poder llevar un control de un pequeño almacén.  Tengo un pedido con varias líneas y "lotes" y necesito sacar las ubicaciones que coincidan con la referencia y lote que pone en el pedido. El problema viene cuando tengo la misma referencia y mismo lote en ubicaciones diferentes y necesito sacar la información en columnas diferentes. No se si  me he explicado bien, pero creo que con el ejemplo adjunto se entiende mejor. Agradecería mucho si me pudieran ayudar  Libro1.xlsx
    • Exelente solución mil gracias 
  • 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.