CONCATENAR INFORMACIÓN DE VARIOS REGISTROS DUPLICADOS EN UNA CELDA

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:

CONCATENAR INFORMACION DE VARIOS REGISTROS DUPLICADOS EN UNA CELDA

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:

CONCATENAR INFORMACION DE VARIOS REGISTROS DUPLICADOS EN UNA CELDA2.jpg

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:

CONCATENAR INFORMACION DE VARIOS REGISTROS DUPLICADOS EN UNA CELDA3

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.

Donate Button with Credit Cards

¡¡Muchas gracias!!

 

Anuncios

EXTRAER CUALQUIER PALABRA DE UNA CADENA DE TEXTO

Hola de nuevo a todos 🙂

Espero que hayáis tenido unas estupendas vacaciones 🙂 Yo ya las he finalizado y empiezo de nuevo con nuevas energías.

En el post de hoy vamos a introducirnos en el mundo de las fórmulas para mostrar cómo podemos obtener (extraer) cualquier palabra que nos propongamos en una cadena de texto y con una única fórmula.

Vamos a imaginar que tenemos los siguientes datos y que queremos extraer el número de experimento, los grados y las atmósferas:

EXTRAER CUALQUIER PALABRA DE UNA CADENA DE TEXTO

Esto se puede realizar con una macro, siempre que contemos con la misma estructura, de lo contrario, en programación puede suponer un desarrollo mayor.

Para poder comenzar la extracción solo vamos a necesitar una fórmula en la que combinaremos y anidaremos varias funciones. Para extraer la palabra que queremos, debemos conocer el número de ocupa en el texto, es decir: el número de experimento sería la sexta palabra, los grados la octava y las atmósferas la onceaba.

La única particularidad es que en la estructura de la fórmula, debemos indicar siempre un número menos del que tiene la palabra a extraer, por ejemplo, para extraer el número de experimento, que es la sexta palabra, debemos indicar en la fórmula el 5:

=EXTRAE(EXTRAE(EXTRAE(SUSTITUIR(A2;" ";"*";5);1;LARGO(A2));ENCONTRAR("*";SUSTITUIR(A2;" ";"*";5));LARGO(A2));2;ENCONTRAR(" ";EXTRAE(EXTRAE(SUSTITUIR(A2;" ";"*";5);1;LARGO(A2));ENCONTRAR("*";SUSTITUIR(A2;" ";"*";5));LARGO(A2)))-2)

Solo debemos indicarlo en la función SUSTITUIR, (que os marco en rojo).

Para extraer los grados, debemos indicar el 7 en la fórmula, dado que la palabra ocupa el octavo lugar:

=EXTRAE(EXTRAE(EXTRAE(SUSTITUIR(A2;" ";"*";7);1;LARGO(A2));ENCONTRAR("*";SUSTITUIR(A2;" ";"*";7));LARGO(A2));2;ENCONTRAR(" ";EXTRAE(EXTRAE(SUSTITUIR(A2;" ";"*";7);1;LARGO(A2));ENCONTRAR("*";SUSTITUIR(A2;" ";"*";7));LARGO(A2)))-2)

Para extraer las atmósferas, debemos indicar el 10 en la fórmula, dado que la palabra ocupa el onceavo lugar:

=EXTRAE(EXTRAE(EXTRAE(SUSTITUIR(A2;" ";"*";10);1;LARGO(A2));ENCONTRAR("*";SUSTITUIR(A2;" ";"*";10));LARGO(A2));2;ENCONTRAR(" ";EXTRAE(EXTRAE(SUSTITUIR(A2;" ";"*";10);1;LARGO(A2));ENCONTRAR("*";SUSTITUIR(A2;" ";"*";10));LARGO(A2)))-2)

El resultado, después de aplicar la fórmula en cada columna, es el siguiente:

EXTRAER CUALQUIER PALABRA DE UNA CADENA DE TEXTO1

Como habéis podido comprobar, hemos realizado un ejercicio muy habitual cuando trabajamos con cadenas de texto y sin tener que utilizar código. Además podemos trabajar aunque la estructura no sea igual en todos los casos, solo tenemos que indicar el número de la palabra que queremos extraer para conseguirlo.

Y esto ha sido todo por hoy, aún tengo bastante lío con las consultas pendientes y tengo que darle duro.

Como siempre, os dejo el archivo de ejemplo. Espero que os sea de utilidad 🙂

Descarga el archivo de ejemplo pulsando en: EXTRAER CUALQUIER PALABRA DE UNA CADENA DE TEXTO

 
¿Te ha resultado de interés?, puedes apoyar a Excel Signum con una pequeña donación.

Donate Button with Credit Cards

¡¡Muchas gracias!!

EXTRAER INFORMACIÓN ESPECÍFICA DE UNA CADENA DE DATOS

Hace un par de días recibí una consulta sobre un tema que había tratado en un post anterior: EXTRAER NÚMEROS Y TEXTO DE UNA CADENA DE DATOS ALFANUMÉRICA en el que realizaba un pequeño proceso para extraer todos los elementos numéricos y alfabéticos contenidos en una cadena alfanumérica.

Pues bien, un lector me envío la siguiente consulta que reproduzco literalmente:

“Esta macro funciona perfecto, pero quisiera saber si se puede adecuar para que extraiga los datos numéricos de estén definidos con el símbolo $
Ejemplo: tengo un texto de la siguiente forma ADFR45FGF$4510ASD3 Solo se necesita que la formula extraiga el valor de $4510 y que no tenga en cuenta los demás datos numéricos ni alfabéticos.”

Así pues, lo que necesitamos es una macro que sea capaz de extraer determinada información dentro de una cadena de texto:  en este caso el símbolo “$” y los siguientes caracteres numéricos consecutivos, y en caso de ser una letra (u otro caracter no numérico), simplemente no extraer nada.

Para realizar este trabajo debemos pensar y echar mano de funciones como “hallar” para determinar en el lugar de la cadena en el que se encuentra “$”, o lo que es lo mismo, en VBA la función “Search”. Una vez que tenemos este dato, resulta sencillo generar un código que permita extraer los datos hasta llegar al dólar y condicionando a que lo que extraemos sea numérico.

El último paso es invertir los datos extraídos, y ya tenemos la información.

Os dejo aquí la función ya comentada en cada uno de los pasos:

Function extrae_cadena(Micelda As String)
Dim numeros As String, i As Integer, j As Integer
Dim largo As String
'contamos hasta el $
dolar = Application.WorksheetFunction.Search("$", Micelda)
'extraemos los datos desde el dolar en adelante
largo = Trim(Mid(Micelda, dolar, 1000))
'iniciamos bucle para extraer los caracteres de la cadena anterior
fin = Len(largo)
For i = fin To 1 Step -1
'si es $ o número lo extraemos, pero si es letra no extraemos
If (Mid(largo, i, 1)) = "$" Or IsNumeric((Mid(largo, i, 1))) Then
numeros = numeros & Mid(largo, i, 1)
Else
numeros = ""
End If
Next
'invertimos el orden de los datos con otro bucle secundario
sCadena = Len(numeros)
For j = 1 To sCadena
Resultado = Mid(numeros, j, 1) & Resultado
Next j
'y ya tenemos la información
extrae_cadena = Resultado
End Function

Con esta función ya podemos extraer los datos de forma directa, tecleando en una celada la función “extrae_cadena()” y seleccionando la celda que contiene los datos.

extraer-informacion-especifica-de-una-cadena-de-datos1

También lo podéis automatizar con una macro, para darle al botón y que se extraigan los datos en la columna “B”:

Sub extrae_num()
'Ejecutamos proceso que recorre todos los datos
Dim c As Integer
With Sheets(1)
fin = Application.CountA(.Range("A:A"))
For c = 2 To fin
'Aplicamos formato texto a las celdas de la columna 2
.Cells(c, 2).NumberFormat = "@"
'aplicamos funcion extrae_cadena e insertamos resultado
.Cells(c, 2) = extrae_cadena(.Cells(c, 1))
Next
End With
End Sub

En ambos casos el resultado será el mismo, es decir extraeremos la información según los datos que nos han solicitado:

extraer-informacion-especifica-de-una-cadena-de-datos2

Y he dejado la primera celda con los datos de la consulta del lector. El resultado es el solicitado: $4510

Es un pequeño ejemplo, pero os puede ser de utilidad, dado que aquí aunque usamos el $, se puede usar cualquier otro símbolo, numero o parámetro.

Os dejo como siempre el ejemplo:

Descarga el archivo pulsando en: EXTRAER INFORMACIÓN ESPECÍFICA DE UNA CADENA DE DATOS