CONTAR PALABRAS ESPECÍFICAS EN UNA CADENA DE TEXTO CON VBA

Hola a todos!

Esta temporada estoy bastante liado programando varios algoritmos de Inteligencia Artificial, y aunque es una programación bastante compleja, lo realmente complicado es poder dedicar tiempo a desarrollar estos códigos.

Pero aún así siempre tendré un momento para escribir nuevas publicaciones y compartirlas con todos vosotros.

En el post de hoy me gustaría mostrar un método para contar las veces que se repite una palabra específica en el una cadena de texto. Algo así como un “contar.si” pero con la diferencia que no estamos contando en un rango, sino en una variable string.

Partiendo de esta base, podemos hacerlo de varias formas, pero la de hoy en mi opinión sería la más eficiente, dado que evitamos utilizar bucles.

Para el ejemplo que os voy a poner empezaré desde el inicio, es decir, pasando los datos de un rango a una cadena de texto, esta sería la información de la hoja:

CONTAR PALABRAS ESPECIFICAS EN UNA CADENA DE TEXTO CON VBA

Se trata de la información sobre la presión arterial de varios pacientes de una clínica. Para el ejemplo utilizaremos la siguiente macro:

Sub CONTAR_STRING()
'Declaramos variable
Dim final As Long, i As Long
Dim sCadena As String, Contar As Long
'Trabajamos con la "Hoja1"
With Sheets("Hoja1")
final = Application.CountA(.Range("A:A"))
'Componemos cadena de texto
For i = 2 To final
ipalabra = ipalabra & "|" & .Cells(i, 2)
Next i
'Eliminamos espacio en blanco del inicio
sCadena = Trim(Mid(ipalabra, 2, Len(ipalabra)))
'Contamos el número de veces que se repite una palabra
Contar = UBound(Split(sCadena, "BAJA"))
End With
End Sub

sCadena será la variable a la que finalmente pasemos los datos de la cadena de texto, aquí podéis ver el contenido:

CONTAR PALABRAS ESPECIFICAS EN UNA CADENA DE TEXTO CON VBA1.jpg

Y ahora para contar las veces que se repite una palabra específica, por ejemplo “BAJA”, vamos a utilizar la siguiente línea de código:

Contar = UBound(Split(sCadena, "BAJA"))

y el resultado es que la palabra BAJA se repite 5 veces:

CONTAR PALABRAS ESPECIFICAS EN UNA CADENA DE TEXTO CON VBA2

Con una sola línea nos evitamos utilizar un loop y conseguimos mayor eficiencia en nuestros procesos.

Aunque este código es muy sencillo, este método de contar resulta muy interesante para grandes procesos o complejos algoritmos.

Y eso es todo, espero que os haya gustado!. En el archivo de prueba no hay botón de ejecutar, os dejo el código para que lo analicéis o probéis ejecutando la macro con “F8”.

Descarga el archivo de ejemplo pulsando en: CONTAR PALABRAS ESPECÍFICAS EN UNA CADENA DE TEXTO CON VBA

 

¿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

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!!

 

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