Hola a todos, ¿qué tal estáis?: Espero que bien!
Cuando tenemos que incorporar datos de varias columnas o filas en una celda, solemos usar la función concatenar o el ampersand «&«.
Pero esta tarea se dificulta bastante cuando lo que tenemos que concatenar son informaciones de varios rangos vinculadas a registros duplicados (y tenemos gran cantidad de información).
Esto lo entenderéis mejor con un ejemplo visual. Imaginad que tenemos la información de varios empleados de unos grandes almacenes con el idioma y el nivel asociado:
Como podéis observar, se han abierto tantos registros como idiomas sepa el empleado (habitual en el uso de bases de datos).
Y lo que queremos conseguir es, por ejemplo, para el primer empleado:
Efectivamente, debemos pasar los datos de los rangos vinculados a cada empleado y crear una cadena de texto (string) que pueda expresar la información que necesitamos.
Para ello vamos a usar la siguiente macro que he preparado para ayudarnos en esta tarea:
Sub CONCATENAR_DUPLICADOS_EN_CELDA()
'Declaramos las variables
Dim i As Integer, j As Integer
Dim finRes As Integer, finDat As Integer
Dim sCadena As String, Lista As Range, Unicos As Range
'Borramos datos en hoja RESULTADO
finDat = Application.CountA(Sheets("DATOS").Range("A:A"))
If finDat > 0 Then Sheets("RESULTADO").Range("A1:B" & finDat).Clear
'Pasamos registros únicos de nombres a la columna A de hoja RESULTADO
Set Lista = Sheets("DATOS").Range("A1:A" & finDat)
Set Unicos = Sheets("RESULTADO").Range("A1:A" & finDat)
Lista.AdvancedFilter Action:=xlFilterCopy, CopyToRange:=Unicos, Unique:=1
'Indicamos título y negrita para encabezado segunda columna
With Sheets("RESULTADO")
.Cells(1, 2) = "IDIOMAS Y NIVEL"
.Cells(1, 2).Font.Bold = True
End With
'Iniciamos loop por cada registro único
finRes = Application.CountA(Sheets("RESULTADO").Range("A:A"))
With Sheets("DATOS")
For i = 2 To finRes
'Vaciamos la variable sCadena en cada loop
sCadena = vbNullString
'Iniciamos un segundo loop buscando coincidencia de nombre con la hoja datos
'Si existe componemos un string en variable scadena con los datos que deseamos
For j = 2 To finDat
If Sheets("RESULTADO").Cells(i, 1) = .Cells(j, 1) Then sCadena = sCadena & ", " & .Cells(j, 2) & ": Nivel " & .Cells(j, 3)
Next j
'Pasamos los datos de la variable a la hoja RESULTADO
Sheets("RESULTADO").Range("B" & i) = Trim(Mid((sCadena), 2, Len(sCadena)))
Next i
End With
'Mostramos datos y liberamos variables
Sheets("RESULTADO").Select
Set Lista = Nothing
Set Unicos = Nothing
End Sub
El resultado es el siguiente:
Aunque ya lo comento en el código, básicamente lo que hacemos es grabar en la variable «scadena» toda la información relativa a cada empleado mediante dos loop y luego formateamos según nuestras necesidades.
Es un proceso sencillo y estoy seguro que en más de una ocasión os será de utilidad.
Y eso es todo por hoy, saludos y que tengáis un buen fin de semana!!
Descarga el archivo de ejemplo pulsando en: CONCATENAR INFORMACIÓN DE VARIOS REGISTROS DUPLICADOS EN UNA CELDA
¿Te ha resultado de interés?, puedes apoyar a Excel Signum con una pequeña donación.
¡¡Muchas gracias!!
yo quiero hacer solgo similar pero con un libro de almacen donde tengo dos filas de productos y deseo mostrar en el resumen que marcas poseo sin repetir, con concatenar no me funciona,
los datos son
IZQUIERDA DERECHA
WBRA WBRA
AE AE
GLOB GLOB
CSOL CSOL
WBRA WBRA
AE AE
GLOB GLOB
CSOL CSOL
WBRA WBRA
AE AE
GLOB GLOB
y quisiera que en una celda del resumen me muestre : AE, GLOB, CSOL, WBRA
Hola Gonzalo:
Existen multitud de entradas en la web sobre registros únicos. Por ejemplo: https://excelsignum.com/2017/06/22/extraer-registros-unicos-de-un-rango-de-datos/
Utiliza el buscador y tendrás acceso a todas.
Saludos