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

Anuncios

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

 

COMBINAR LA FUNCIÓN HALLAR Y LA FUNCIÓN LARGO

En esta entrada he querido combinar diferentes fórmulas para mostrar el uso combinado de la función “Hallar” y la función “Largo”. Estas funciones no las suelo utilizar mucho, pero he de reconocer que son de vital importancia en según que ocasión nos encontremos. Por ejemplo, hoy voy a realizar el mismo trabajo que en su momento ilustré con la entrada: SEPARAR NOMBRE Y APELLIDOS EN EXCEL. HERRAMIENTA TEXTO EN COLUMNAS, y para ello voy a necesitar urgentemente un listado de personas con nombre y apellidos para realizar el ejemplo. Como no los voy a escribir de uno en uno, voy a bajar la información del INE, ahí podéis encontrar información de nombres de niñas y niños, y una relación de hasta 25884 apellidos.

Para realizar este ejemplo voy a echar mano de la función “aleatorio ()”, así si alguno de vosotros aún trabaja en excel 2003 podrá ver cómo funciona la fórmula (iba a utilizar la función “aleatorio.entre”, pero ya la mostré en la entrada de la LOTERIA y solo funciona de 2007 en adelante).

Lo primero que voy a hacer es confeccionar varias columnas, en una pondré los 200 nombres (hombres y mujeres) y al lado los numeraré para otorgarles un ID, en la otra columna pondré los 25.884 apellidos y también los numeraré con un ID, así:

FUNCION HALLAR&LARGO_1

El siguiente paso será generar aleatoriamente con estos datos, nombres y apellidos para poder realizar el ejemplo. Para hacerlo debemos introducir la fórmula aleatorio(), esta función nos va a dar un número mayor o igual a 0 y menor que 1, para poder trabajar con este resultado debemos multiplicar el decimal por tantos registros como tenga el listado, es decir por 200 en un caso y por 25.884 por otro y luego redondear para eliminar los decimales. Así vamos crear nuestras tres columnas con nombre, primer apellido y segundo apellido, os dejo los pasos con el ejemplo del nombre y las fórmulas utilizadas, donde la última será un “buscarv” desde el ID volátil que acabamos de crear al ID fijo del principio:

FUNCION HALLAR&LARGO_2

Una vez que repitamos el mismo proceso para los apellidos habremos confeccionado nuestro propio generador de nombres y apellidos, y que además de servirnos para el ejemplo de hoy, nos será útil para crear bases de datos en las que trabajar  🙂

La información resultante será la siguiente, en azul está el nuevo nombre y apellidos que se generan de forma aleatoria (cada vez que interactuamos con los datos del libro los datos se actualizan).

FUNCION HALLAR&LARGO_3

Estos datos están en la hoja2 de nuestro libro. Para poder realizar el ejemplo los voy a llevar a la Hoja1 y lo haré con la función “concatenar” construyendo el nombre con la siguiente sintaxis:
=CONCATENAR(Hoja2!M2;" ";Hoja2!Q2;", ";Hoja2!I2) es decir: concatenar (primer apellido, segundo apellido, ", ", nombre)

Y así tendré mis 200 nombres para poder trabajar con ellos. En la siguiente imagen podéis ver el resultado de fórmula concatenar y en azul el resultado de la combinación de “hallar” con “largo” para extraer el nombre y apellidos.

FUNCION HALLAR&LARGO_4

Para extraer el nombre vamos a usar:
=EXTRAE(A2;HALLAR(",";A2)+1;LARGO(A2)) donde vamos a utilizar la función hallar para encontrar la longitud desde el inicio del nombre (incluyendo espacios vacíos) hasta la coma, luego utilizaremos la función largo para indicar la longitud total del nombre.

Finalmente con la función extraer, indicaremos que el nombre de A2, donde la posición inicial para extraer es HALLAR(",";A2)+1 (aquí debemos siempre sumar 1 para que no muestre la coma) y el número de caracteres que queremos extraer lo obtendremos con la función largo LARGO(A2) que nos indicará punto final de referencia a extraer.

Para extraer los apellidos vamos a usar:
=EXTRAE(A2;1;HALLAR(",";A2)-1) aquí no tendremos que usar la función largo () dado que ya sabemos donde se encuentra el final de los elementos a extraer, es decir, la longitud hasta la "," menos 1 carácter.

Como consejo final, os recomiendo que cuando trabajéis con este tipo de fórmulas, en el resultado final siempre utilicéis la función Espacios(), dado que evitará que queden espacios vacíos antes de comenzar el texto y al final, dejando solo los intermedios. En resumen, las fórmulas completas serían estas:

=ESPACIOS(EXTRAE(A2;HALLAR(",";A2)+1;LARGO(A2))) Extraer Nombre
=ESPACIOS(EXTRAE(A2;1;HALLAR(",";A2)-1)) Extraer Apellidos

FUNCION HALLAR&LARGO_5

Pues esto ha sido todo por hoy (que no es poco), hemos aprendido a generar una base de datos aleatoria de nombres y apellidos, a combinar las funciones “extraer”, “espacios”, “hallar” y “largo” y sobre todo, pasar un rato interesante.

Descarga el archivo de ejemplo pulsando en: COMBINAR FUNCION HALLAR & LARGO