Real, y afortunadamente, algunos de mis lectores (lisa y llanamente) me están haciendo romper la cabeza. Me plantearon algo que se resuelve muy fácilmente con Macros... pero no... nada de macros en este caso. Tiene ser llevado a cabo con funciones. Antes de seguir, quiero dar las gracias por todos los mensajes, ya que me sacan la telaraña de mis, pocas ya, neuronas.
Según el archivo adjunto que recibo en mi correo (que proviene de una direccion de mail con nombre y apellido (sin firmar), y por cuestiones de privacidad no publico) la cuestión es la siguiente: dentro de un local llevan códigos alfanuméricos de productos, por ejemplo abc345. Y tenemos que extraer solamente la parte alfabética: abc.
Y como hago para hacerle entender a Excel donde empiezan los números en una cadena alfanumérica?
abc345
[+/-] Ver el resto / OcultarBué, después de renegar un buen rato se me ocurrió una solución. Pero utiliza muchas funciones y, encima, matriciales, así que primero haré el "paso a paso", por que estimo no servirá de nada mostrar una "megaformula" o "superfunción" si no explico el por qué de cada una de sus partes.
Si tenemos un gran problema, dividamoslo en varios mas pequeños, que es la forma en la cual pude resolver esta cuestión.
Como primer medida vamos a distribuir nuestro código en distintas celdas:
En la columna B analizaremos si cada caracter es o nó un número, con la función =ESNUMERO()
es poco.. pero en B ya sabemos que en la cuarta posición de la matriz (cadena de texto) comienzan los valores numéricos.
Claro, a "ojo" sabemos que es la cuarta posición. Ahora hay que convertir ese "ojo" en un valor concreto, que no es nada mas ni nada menos que la posición del primer "VERDADERO" dentro de la matriz. A esto lo conseguimos usando la funcion:
=COINCIDIR(valor buscado, matriz, [tipo de coincidencia])
para facilitar la interpretación de la sintaxis: voy a buscar a VERDADERO (primer argumento de la función), dentro de A1:A6 (segundo argumento) y especifico que la búsqueda debe ser exacta (tercer agumento, un 0)
Veamos en la imagen como queda:
exacto: en C1 tenemos la posición en la cual está el primer verdadero... que es equivalente al primer número detectado dentro de la matriz.
Siguiendo con nuestro "paso a paso", ahora nos restaría extraer la parte de la cadena que solo contiene letras. Y si, adivinaron, lo hacemos con la funcion:
=EXTRAE(texto, posicion inicial, cantidad de caracteres)
la posición inicial, en este ejemplo, siempre será 1. Y la cantidad de caracteres vendrá dada por el resultado obtenido en C1, menor 1. Veamos:
ya está. verán que dentro de EXTRAE() puse la cadena "abc345", cuando en realidad ese dato debería tomarlo de una celda. Pero valga el ejemplo.... por que para complicarla, sigan leyendo.
Con una pequeña modificación podríamos dar por finalizado este trabajo: en A2 ingreso la siguiente función y luego la copio y pego hasta donde la longitud de mi código así lo requiera:
=EXTRAE($A$1;FILA(A1);1)
en A1 ingreso el código alfanumerico. a partir de A2 lo degloso caracter x caracter, con la función arriba expuesta.
A partir de este cambio todo el proceso se automatiza. Solo resta cambiar el primer parámetro de la función que tenemos en D2:
el primer argumento ahora es A1 (el código alfanumérico en cuestión).
Vamos a cambiar el valor de A1 y notarán como en D2 obtenemos automaticamente la parte alfabética del código:
funciona.
Desde ya que para realizar un proceso transparente a nuestros usuarios finales, todo esto deberá estar en una hoja, y reflejar los resultados en otra, para "profesionalizar" el trabajo.
Y todo esto se puede realizar sin columnas ni desgloses adicionales, solo con funciones matriciales. Pero mañana modifico la entrada y lo agrego, ya que ahora es muy tarde y el tema tiene sus complicaciones.
Les dejo el link al archivo con la primer parte de este ejercicio.
Les dejo el link al archivo con la primer parte de este ejercicio.
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Si hasta ahora las cosas parecían un poco complicadas, veamos que pasa a partir de esta segunda entrada. La solución anterior es totalmente viable y factible de ser aplicada, aunque como habrán visto requiere de muchas columnas y celdas auxiliares. Manejando un poco la lógica y las funciones matriciales lograremos que Excel nos devuelva el resultado en una sola celda, sin necesidad de apoyarnos en otras.
Vimos que a nuestro código lo cargábamos en una "matriz", es decir, un conjunto de celdas:
Podemos obviar ese paso, cargando cada letra en una matriz "virtual", la cual luego recorreremos mediante el uso de funciones matriciales. En este punto necesito solicitarles algo: vayan probando en su planilla el "paso a paso", así comprenden bien que hace cada función involucrada. Nombran al rango A1 con el nombre "codigo", evitando tener que poner $A$1:
nos situamos en A1 y en el cuadro "nombre" (coloreado de amarillo) hacemos lo indicado.
Recuerden que al hablar de funciones matriciales, debemos presionar CTROL + SHIFT + ENTER al momento de ingresarlas a la celda.
1) Cargar el código alfanumérico en una matriz virtual: esto se logra mediante la funcion =FILA(). Si, esa simple función que generalmente solo sirve para devolver el numero de fila de la celda referenciada es muy poderosa utilizada de otra forma.
Con =FILA($1:$10) estoy creando una matriz virtual de 10 posiciones. Como desconocemos el largo del código (no sabemos si tendrá 5, 10 o 35 caracteres), vamos a utilizar a INDIRECTO() y LARGO(), por lo que la primer parte de la función es:
=FILA(INDIRECTO("$1:$"&LARGO(codigo)))
2) Ya tengo una matriz cuya primer posición es 1, y la última variará según la longitud del código. Ahora debo ir extrayendo caracter por caracter, lo cual se consigue así:
=EXTRAE(codigo;FILA(INDIRECTO("$1:$"&LARGO($A$1)));1)
Utilizo a la función del punto 1 como argumento de EXTRAE(texto, posicion inicial, cantidad de caracteres). Verán que el ultimo argumento de EXTRAE() es 1, ya que los voy individualizando de a uno.
3) Debo ahora corroborar si cada caracter es o nó numérico, por cuanto anido:
=ESNUMERO(EXTRAE(codigo;FILA(INDIRECTO("$1:$"&LARGO(codigo)));1))
Esto me crea una matriz VERDADERO/FALSO, ya que las funciones van leyendo cada caracter y evaluando si es o nó un dato numérico. Pero hay otro problema: por mas que sean números, Excel lo tomará como letra... lo solucionamos muy sencillamente: antes de que entre en acción ESNUMERO(), lo multiplico por 1:
=ESNUMERO(1*EXTRAE(codigo;FILA(INDIRECTO("$1:$"&LARGO(codigo)));1))
4) Bueno ya tenemos nuestra matriz verdadero / falso completa. Si el resultado en la posicion 1 de la matriz arroja texto, en dicho lugar habrá un falso. Y viceversa. Ahora necesito ubicar en que posición de esa matriz está el primer VERDADERO (que es el primer numero que aparece en nuestro código alfanumérico). Y lo logramos anidando otra función:
=COINCIDIR(VERDADERO;ESNUMERO(1*EXTRAE(codigo;FILA(INDIRECTO("$1:$"&LARGO(codigo)));1));0)
El tercer y útlimo argumento de COINCIDIR() es un 0, ya que buscamos una coincidencia exacta. Si lo omitimos, por lo menos en mi planilla... no funcionó
En C1 vemos el resultado de lo obtenido hasta el momento:
exacto. el 0 (primer numero del código) se encuentra en la novena posición.
5) Incorporando ahora la función IZQUIERDA(texto, cantidad de caracteres) obtendremos la tan ansiada cadena solo alfabética del código. En C1 vimos que el 0 ocupa la novena posición, por cuanto restaremos 1, así tomamos los primeros 8 digitos:
=IZQUIERDA(codigo;COINCIDIR(VERDADERO;ESNUMERO(1*EXTRAE(codigo;FILA(INDIRECTO("$1:$"&LARGO(codigo)));1));0)-1)
El resultado final:
Y probando con otro código:
Se que es un tema complicado y requiere de cierta experticia en el manejo de funciones (comunes y matriciales), pero haciendo el "paso a paso" en sus hojas de cálculo lograrán dominarlo. Como dice un viejo amigo mío "-Si lo hago yo, lo hace cualquiera." Y no duden que así es.
Es bueno que no se encasillen en este ejemplo y vean que realmente es útil para muchas cosas, ya que reemplazando convenientemente los parámetros nos sirve para evaluar cualquier dato y obtener resultados sorprendentes. O aprovechar los ya obtenidos: si en D2 introduzco:
=DERECHA(codigo;(LARGO(codigo)-LARGO(C2)))
me quedo con la parte numérica del código, sin necesidad de repetir extensas y complicadas funciones:
Bien, esto podría no tener fin si seguimos con los ejemplos. Queda abierto el post a las consultas y, como siempre, aqui va el link al archivo.
Suerte... y viva Excel.
- Obtener enlace
- X
- Correo electrónico
- Otras aplicaciones
Etiquetas
Funciones
Etiquetas:
Funciones
- Obtener enlace
- X
- Correo electrónico
- Otras aplicaciones
En una matriz obtener las filas donde se repite un valor dado. Con esos valores devolver otro de la primera columna de la matriz a poder ser sin macros.
ResponderEliminarGracias
Juanjo
juanjo: esto que transcribo a continuación lo entiendo: "En una matriz obtener las filas donde se repite un valor dado", pero la segunda parte no.
ResponderEliminar"con esos valores devolver otro de la primera columna...". esta parte me pierde, no comprendo lo que me solicitás.
al pié del formulario hay una direccion de mail, haceme llegar el archivo o escribí otra entrada detallándome un poco mejor el tema, así puedo contestar todo en un solo post.
gracias por tu comentario.
Hola
ResponderEliminarEn una celda tengo una cadena de texto y dos numeros EJM: SEIS ( 63.000 ) KM 60.701 como se hace para dejar cada numero en una celda y el texto en otra.
boa144@hotmail.com
te envié un mail a la dirección que especificaste, solicitándote algunos detalles mas sobre tu consulta. quedo al aguardo de tus noticias
ResponderEliminarmuchas gracias.
otra entrada parecida, que seguro les vendrá bien a los que están trabajando en este tipo de proyectos: http://damianexcel.blogspot.com/2011/12/uso-bastante-avanzado-de-funciones.html
ResponderEliminar