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