Jump to content
gonza

Agrupar datos repetidos de una lista y concatenar valores

Recommended Posts

Hola, buen día! Tengo la siguiente tabla

image.thumb.png.4495cacc455bcc208335673c354a8df9.png

el lado izquierdo es como tengo mi tabla original. De lado derecho asi es como quiero que quede el resultado.

quiero que por cada llave repetida me concatene los valores,  si no se repite solo me ponga el valor actual de esa llave.

En esta liga del mismo foro vi este tema parecido donde se usan matrices y diccionarios: 

Me podrían ayudar a modificar este código para mis propósitos.

Manejo miles de registros en excel, y creo el uso de diccionarios es lo mas adecuado para agilizar la concatenación de los valores; porque tengo una macro pero es a nivel celda(no uso matrices ni diccionarios) y al ejecutarla tarda muchísimas horas. Quiero ver si con el uso de diccionarios mejora el tiempo de ejecución.

adjunto el archivo de excel.

slds!!!

 

Prueba_Conca.xlsx

Share this post


Link to post
Share on other sites

Hola,

Pues me asombre con la forma de programar de @johnmpl, en mi muestra con 10,000 registros se tarda 10s en una máquina rápida, en la lenta 23s. En la muestra de Johnmpl no se tarda ni un segundo 0.9s en la lenta y 0.03s en la rápida.

La clave esta en ordenar los datos (ya hay una macro que se encarga de esto), si están desordenados si se tarda 5 minutos en una maquina rápida. Y es otra Macro.

Saludos.

P.D.: Tuve que quitar la hoja donde tenia los 10,000 Registros, por que no sube por aquí. SOLO MODIFIQUE EL EJEMPLO DE Johnmpl.

OrdenarConcatenacion_2_Johnmpl - copia.xlsm

Share this post


Link to post
Share on other sites

A mi no me pasa ese error, esa macro lo que hace es Ordenar los datos por la columna A, La hice con la Grabadora de Macros.

Bueno, solo cambia la linea:

Call Macro1

por:

Range("A1").Sort Key1:=Range("A2"), Order1:=xlAscending, Header:=xlYes

 

Ya la macro1 no es necesaria.

 

Saludos.

Share this post


Link to post
Share on other sites

Hice el cambio y si funcionó. Lo voy a probar con un archivo de miles de registros y te digo como se comportó.

Una duda; por que aparece el sig msgbox cada que ejecuto la macro...?

image.png.288c3f6054f0d474508234be3e9808b1.png

 

Share this post


Link to post
Share on other sites

Jajaja ahora si me hiciste reír, es el que mide el tiempo en segundos de lo que tarda la Macro en terminar.       .07s

El propósito es que veas el código proporcionado y trates de entenderlo, investigar sobre las funciones o métodos que ahí se utilizan y de esa forma tu puedas hacer los tuyos propios, es como el que ayer presentaste de Johnmpl, yo no lo había utilizado e investigue y entendí lo que hace y como lo hace y por eso pude hacer las modificaciones. Ayúdame con esto si? 

Ya si no entiendes algo especifico del código, pregunta y se te responderá.

No se trata de copiar y pegar, si para ti te funciona dímelo.

Saludos.

Share this post


Link to post
Share on other sites

una disculpa jajajjaj no había visto que trae dos módulos de código; solo estaba viendo el módulo 2.😬

Ya lo probe y si funciona a la perfeccion. muchas gracias!!!!

 

jajaj slds!!!

Share this post


Link to post
Share on other sites

Hola @gonza

Como puedes notar, ya tienes variedad de ayudas, así es éste foro!, de hecho hay muchos temas similares al tuyo con diferente programación 

Y esperando no haber llegado tarde a este concierto (de aportes) , te adjunto el mío 

Por hoy no se me antojó usar ni matrices ni diccionario:ph34r:

Saludos a todos! 

Agrupar datos VBA_GP.zip

Share this post


Link to post
Share on other sites
En 16/5/2019 at 15:18 , gonza dijo:

Manejo miles de registros en excel, y creo el uso de diccionarios es lo mas adecuado para agilizar la concatenación de los valores; porque tengo una macro pero es a nivel celda(no uso matrices ni diccionarios) y al ejecutarla tarda muchísimas horas. Quiero ver si con el uso de diccionarios mejora el tiempo de ejecución.

Hola @gonza,

Cuantos miles de registros manejas en promedio? Pregunto esto por dos observaciones que tengo... Para empezar este es el código de mi propuesta:

Option Explicit

Sub test()
Dim datos As Variant
Dim aux() As Variant
Dim i As Long
Dim j As Long
Dim k As Variant
Dim fila As Long

Debug.Print Time
Range("F:I").Delete
With Range("A1").CurrentRegion
  .Range("F:J").CurrentRegion.Delete
  .Columns(1).Copy .Range("F1")
  .Range("F1").CurrentRegion.RemoveDuplicates 1, xlYes
  .Rows(1).Copy Range("F1")
  datos = .Offset(1).Value
  fila = .Range("F1").CurrentRegion.Rows.Count
  ReDim aux(1 To fila - 1, 1 To 4)
End With

For i = LBound(datos) To UBound(datos)
  k = Evaluate("MATCH(" & datos(i, 1) & ",OFFSET(F1:F" & fila & ",,,,1),0)")
  If IsNumeric(k) Then
    If aux(k - 1, 1) = "" Then
      aux(k - 1, 1) = datos(i, 1)
      aux(k - 1, 2) = datos(i, 2)
      aux(k - 1, 3) = datos(i, 3)
      aux(k - 1, 4) = datos(i, 4)
    Else
      aux(k - 1, 2) = aux(k - 1, 2) & "," & datos(i, 2)
      aux(k - 1, 3) = aux(k - 1, 3) & "," & datos(i, 3)
      aux(k - 1, 4) = aux(k - 1, 4) & "," & datos(i, 4)
    End If
  End If
Next

Range("F2").Resize(UBound(aux), 4).Value = aux
Debug.Print Time
End Sub

No están rápida como la proporcionada por @Leopoldo Blancas (la cual todavía podría optimizarse...)

Respecto a las observaciones:

  • Hice una prueba con mi macro con una cantidad de 100 mil registros (repitiendo las 10 llaves) y cambiando el delito, narcótico y auto por letras que genera de manera aleatoria. Algunas de las macros se quedan pensando, la de Leopoldo se comporta raro con esa cantidad de registros.
  • Dependiendo la cantidad de registros que se maneje, sobre todo si se repite bastante una clave obviamente se va a tener una cadena enorme de caracteres en delito, narcótico, auto pudiendo toparse con el limite de los 32767 caracteres que puede contener una celda. A mi me paso con esa cantidad de registros y eso que use letras para los tres campos. Solo para que valides el largo de las cadenas generadas por la macro que elijas utilizar Gonza.

Saludos!

Share this post


Link to post
Share on other sites

hola ..gracias a todos por sus aportes. 

manejo alrededor de 300 mil registros(a veces más). De hecho me han sugerido usar otro tipo de herramienta(R, phyton, ...etc) para cuando sean grandes cantidades de registros; ya que las macros se vuelven muy lentas al manejar estas cantidades de registros.

saludos!!!!

 

Share this post


Link to post
Share on other sites
En 18/5/2019 at 4:35 , ikanni dijo:

hola

corrí la macro, me parece excelente; solo que me dí cuenta de que no concatena los valores de celdas del "idllave" que ya se hayan tomado en cuenta anteriormente; o sea, no concatena valores de celdas si el "contenido" de la celda esta repetido. Me podrías ayudar por favor a que me concatene los contenidos de las celdas independiente de lo que este capturado en éstas.

pongo la imagen para mayor comprensión. En el resultado deseado de la llave 1547: robo a casa, robo a negocio, robo a casa

y así para el resto de los registros.

image.thumb.png.38b9628d0f595875c002ccba5d9b2c2a.png

slds!

 

Share this post


Link to post
Share on other sites
Hace 2 horas, gonza dijo:

hola ..gracias a todos por sus aportes. 

manejo alrededor de 300 mil registros(a veces más). De hecho me han sugerido usar otro tipo de herramienta(R, phyton, ...etc) para cuando sean grandes cantidades de registros; ya que las macros se vuelven muy lentas al manejar estas cantidades de registros.

saludos!!!!

Hazlo con Phyton es más rápido.

Saludos.

Share this post


Link to post
Share on other sites
En 23/5/2019 at 11:16 , ikanni dijo:

Aiva!!!! tienes razon Gonza. pues aquí lo tienes. Nada había que hacerle un pequeño arreglo, lo siento se me paso.

 

Prueba_Conca_Ik.xlsm 25 kB · 3 downloads

Hola

Ya quedó por fin!!!!

Tomé la primer macro que me mandaste y solo comentarice la linea que manda llamar a la función para validar el contenido de la llave.

image.thumb.png.d0776c52227d9e2f149ab9d3331f6f06.png

Asi, ignora lo que haya en la celda y concatena el contenido de ésta.

Y esta super rápido el proceso!!!! 

Excelente foro....muchas gracias a todos por sus aportes. Me han ayudado mucho a aprender cosas nuevas de las macros.

saludos a todos!!!!! Muchas gracias!!!!!!👍

Share this post


Link to post
Share on other sites
En 22/5/2019 at 17:15 , Leopoldo Blancas dijo:

Hazlo con Phyton es más rápido.

Saludos.

@Leopoldo Blancas eres programador Python? Sin duda es una buena alternativa al igual que Ruby (el cual se me hace mas elegante).

Pero creo que una mejor alternativa para este problema es AWK... Sobre todo para procesar archivos de texto, incluso aquellos que excedan el millón de registros.

BEGIN {FS="\t"}
{ if (NR > 1) {
    llaves[$1]++;
    for(i=2; i<=NF; i++) datos[$1,i] = datos[$1,i] $i ", "
  }
}
END {for(llave in llaves) {
  reg = llave "\t"
  for(j=2; j<=4; j++) reg = reg "\t" substr(datos[llave,j],1,length(datos[llave,j])-2)
  print reg
  }
}

Saludos!

Share this post


Link to post
Share on other sites
Hace 25 minutos , digitalboy dijo:

@Leopoldo Blancas eres programador Python?

Solo me doy las 3 (Lenguaje de Chamaco, disculpa si no entiendes.), como aquí en VBA-Excel.

Hace 26 minutos , digitalboy dijo:

Pero creo que una mejor alternativa para este problema es AWK...

Pues si, pero el problema no es el Lenguaje de Programación... el problema es @gonza, ya que por lo visto no entiende ni lo que le compartimos, el solo copia y pega, eso creo yo. Y no es malo pero hay que estudiar un rato para entender y hacer cosas por uno mismo.

Saludos.

Share this post


Link to post
Share on other sites

Holas!

He tenido una semana pesadita [con mi cierre mensual]...

En 24/5/2019 at 10:58 , gonza dijo:

Me han ayudado mucho a aprender cosas nuevas de las macros.

saludos a todos!!!!! Muchas gracias!!!!!!👍

Asi es @gonza Vba es un lenguaje muy amplio y rico para Excel, partiendo que puedes usar miles de filas, también se puede trabajar mediante matrices como te lo han mostrado, pero ademas algo que debes saber y que te indicaron, es sobre la limitación de las celdas respecto a su contenido y concatenar muchos criterios, te puede resultar en error por esa misma razón

Adjunto otro aporte, para tu colección y la del foro

 

Saludos 

Agrupar datos Matriz VBA_GP.zip

Share this post


Link to post
Share on other sites
Guest
This topic is now closed to further replies.



×
×
  • Create New...

Important Information

Privacy Policy