COMPROBAR SI UNA CELDA CONTIENE UN CARÁCTER O PALABRA ESPECÍFICA

Hola a todos:

Hace unos días me preguntaban una fórmula para poder averiguar si una celda contiene un carácter o cadena específica. La respuesta es que existen varias y con distinta combinación de fórmulas.

Comenzamos con ejemplo para buscar, imaginad que queremos comprobar si en “Excel Signum” se encuentra la cadena de texto siguiente: “Sig“.

Comenzamos con la fórmula más conocida y que encontraréis en todas las web y manuales. Donde con la función HALLAR buscamos “Sig” en el contenido de la celda y si lo encuentra nos devolverá un número com resultado de la posición. Si utilizamos la función ESNUMERO nos devolverá un verdadero o falso, que combinado con la función SI nos permitirá incluir un texto cuando encuentre el valor.

La función Hallar permite comodines y no distingue entre mayúsculas y minúsculas:

=SI(ESNUMERO(HALLAR("Sig";A1));"Contiene valor";"No lo contiene")

La siguiente fórmula (que es la que suelo usar), se compone de la combinación de CONTAR.SI y SI.

Cuando ejecutamos CONTAR.SI nos va a devolver el número de veces que cuenta el valor buscado, con la función SI indicamos que cuando el resultado sea verdadero (superior a 0) indique que contiene el valor buscado.

Esta fórmula permite comodines y en este caso son necesarios dado que para indicar que busque en todo el contenido de la celda debemos especificar los asteriscos al inicio y al final del valor, pero podríamos especificar que solo sea al inicio o al final. No distingue entre mayúsculas y minúsculas:

=SI(CONTAR.SI(A2;"*Sig*");"Contiene valor";"No lo contiene")

Otra posibilidad es una variante de la primera fórmula pero usando la función ENCONTRAR. Tiene la limitación de no permitir comodines y distingue entre mayúsculas y minúsculas:

=SI(ESNUMERO(ENCONTRAR("Sig";A5));"Contiene valor";"No lo contiene")

Por último, otra función que tampoco permite comodines y se debe respetar las mayçusculas y minúsculas, es la siguiente:

=SI(SUSTITUIR(A4;"Sig";"")<>A4=VERDADERO;"Contiene valor";"No lo contiene")

Aquí, lo que evaluamos es que cuando la fórmula sustituir sea verdadera, es cuando nos indicará que contiene el valor (dado que si lo sustituye es porque lo ha encontrado).

Este sería el resultado:

COMPROBAR SI UNA CELDA CONTIENE UN CARÁCTER O PALABRA ESPECÍFICA

Estoy seguro que existen más combinaciones para obtener el mismo resultado y con otras fórmulas, pero creo que estas cuatro os pueden servir en prácticamente todos los casos.

Y eso es todo, espero que os resulten de utilidad.

Descarga el archivo de ejemplo pulsando en: COMPROBAR SI UNA CELDA CONTIENE UN CARÁCTER O PALABRA ESPECÍFICA

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

Donate Button with Credit Cards

¡¡Muchas gracias!!

Mediante la suscripción al blog, la realización comentarios o el uso del formulario de contacto estás dando tu consentimiento expreso al tratamiento de los datos personales proporcionados según lo dispuesto en la ley vigente (LOPD). Tienes más información al respecto en esta página del blog: Política de Privacidad y Cookies

Anuncios

ORDENAR VALORES UTILIZANDO FÓRMULAS

Hola a todos:

Estos días he recibido multitud de consultas y hoy me gustaría escribir un post muy sencillo sobre la posibilidad de ordenar valores utilizando únicamente fórmulas.

En la consulta inicial me preguntan cómo se pueden ordenar una serie de valores siempre numéricos tanto de menor a mayor como a la inversa, de mayor a menor.

Bien, esto lo podemos hacer con una sencilla fórmula, veamos los datos:

ORDENAR VALORES UTILIZANDO FORMULAS

En este caso es una relación de personas con una cifra que ha alcanzado (de lo que sea, nos vale como ejemplo).

La cuestión es ahora cómo ordenar esos números sin utilizar el filtro o el comando de ordenar de la cinta de opciones.

Pues bien, podemos utilizar la siguiente función:

=K.ESIMO.MAYOR($B$2:B10;FILAS($B$2:B2))

Con  K.esimo.Mayor vamos a obtener el número mayor de un rango, en este caso, al mover la fórmula nos va a ir mostrando el mayor según el rango seleccionado.

Y el resultado será el siguiente:

ORDENAR VALORES UTILIZANDO FORMULAS_1

Como podéis ver, conseguir ordenar el rango de Mayor a Menor. Si necesitamos invertirlo y hacerlo de Menor a Mayor, utilizaremos K.esimo.Menor.

Pero el lector me solicitó si también podía conseguir que se mostrase en otra columna los nombres relacionados con los números ordenados. Y en efecto, sí podemos obtenerlos, y lo vamos a hacer con la siguiente fórmula:

=INDIRECTO(DIRECCION(COINCIDIR(K.ESIMO.MAYOR($B$2:B10;FILAS($B$2:B2));$B$2:B10;0)+1;1))

Dado que con la fórmula inicial podemos ordenar los números en relación a la lista inicial, con la función Coincidir podemos obtener la fila en la que se encuentra nuestro número antes de ordenarlo, y  si sabemos la fila, con la función Dirección podemos obtener la celda que nos interesa de la columna A para obtener el nombre.

Así:

ORDENAR VALORES UTILIZANDO FORMULAS_3

He indicado con flechas en rojo la dirección con la que obtenemos las celdas de referencia que nos interesa.

Ahora, para obtener el nombre, utilizaremos la función indirecto:

ORDENAR VALORES UTILIZANDO FORMULAS_4

Y así, finalmente obtenemos toda la información que necesitamos.

Bien!!

Pero a los pocos días el mismo lector me solicitó si de alguna manera podría incluir rangos dinámicos en ambas fórmulas para no tener que ir actualizando los rangos a mano cada vez que el listado se fuese incrementando.

Pues eso también se puede realizar, la manera es incluyendo la función Desref en las dos fórmulas, y lo haremos sustituyendo en ambas fórmulas la parte que hace referencia a los rangos por:

DESREF($B$2; 0; 0; CONTARA(B:B))

Y así ya podemos obtener la misma información, pero con rangos dinámicos:

Para ordenar:

=K.ESIMO.MAYOR(DESREF($B$2; 0; 0; CONTARA(B:B));FILAS($B$2:B2))

Para obtener los nombres:

=INDIRECTO(DIRECCION(COINCIDIR(K.ESIMO.MAYOR(DESREF($B$2; 0; 0; CONTARA($B:$B));FILAS($B$2:B2));DESREF($B$2; 0; 0; CONTARA($B:$B));0)+1;1);1)

En resumen:

ORDENAR VALORES UTILIZANDO FORMULAS_5

Y eso es todo!. Como podéis observar, lo hemos conseguido.

Es importante comentar que está fórmula es solo válida para datos numéricos y en los que no existen duplicados. Si contamos con duplicados tendríamos que trabajar con una columna auxiliar en la que introducir algún elemento para “desempatar” esos datos, por ejemplo añadiendo una cifra muy pequeña a los números originales.

Descarga el archivo de ejemplo pulsando en: ORDENAR VALORES UTILIZANDO FÓRMULAS

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

Donate Button with Credit Cards

¡¡Muchas gracias!!

Mediante la suscripción al blog, la realización comentarios o el uso del formulario de contacto estás dando tu consentimiento expreso al tratamiento de los datos personales proporcionados según lo dispuesto en la ley vigente (LOPD). Tienes más información al respecto en esta página del blog: Política de Privacidad y Cookies

SUMAS ACUMULADAS POR RANGO SEGÚN CRITERIOS

Hola a todos:

Hoy vamos a seguir con las fórmulas, en concreto con el mundo de las sumas acumuladas y la problemática que surge en determinados casos.

Pongamos un ejemplo visual del problema:

SUMAS ACUMULADAS POR RANGO SEGÚN CRITERIOS

Como podéis observar se trata de obtener el sumatorio de los importes en cada rango en función de si en la columna C hay datos (en este caso, fechas).

Esta tarea es posible que se pueda resolver con una fórmula matricial (tengo pendiente estudiarlo), sin embargo, lo podemos resolver con una combinación de varias fórmulas:

En concreto la fórmula que os propongo es la siguiente:

=SI(FILA(B2)>2;SI.ERROR(SI(C2<>"";SUMA($A$2:INDIRECTO("A"&FILA(B2)));"")-SUMA($B$2:INDIRECTO("B"&(FILA(C2)-1)));"");SI(C2<>"";SUMA($A$2:INDIRECTO("A"&FILA(B2)));""))

Es importante en esta fórmula tener presente el número de fila en el que estamos situados en cada momento, dado que la segunda celda (teniendo en cuenta que tenemos encabezados), la fórmula será diferente a las demás, por ello indico un condicional al inicio de la fórmula dependiendo de si la fila en la que estamos es mayor o menor de 2.

La idea es primero capturar el acumulado desde la fila A2 hasta la fila en la que estamos:

=SUMA($A$2:INDIRECTO("A"&FILA(B2)))

Y luego restar lo que ya hemos acumulado

-SUMA($B$2:INDIRECTO("B"&(FILA(C2)-1)))

De esta forma conseguimos el resultado requerido.

SUMAS ACUMULADAS POR RANGO SEGÚN CRITERIOS_1

Y eso es todo : )

Espero que os sea de utilidad!.

Descarga el archivo de ejemplo pulsando en: SUMAS ACUMULADAS POR RANGO SEGÚN CRITERIOS

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

Donate Button with Credit Cards

¡¡Muchas gracias!!

Mediante la suscripción al blog, la realización comentarios o el uso del formulario de contacto estás dando tu consentimiento expreso al tratamiento de los datos personales proporcionados según lo dispuesto en la ley vigente (LOPD). Tienes más información al respecto en esta página del blog: Política de Privacidad y Cookies

OBTENER EL VALOR DE UNA CELDA SEGÚN EL VALOR MÁXIMO DE UNA MATRIZ CON VARIAS CONDICIONES (PARTE II)

Hola a todos:

Hoy toca un poco de formulación : )

Hace un tiempo ya desarrollé una matricial para obtener el valor de una celda según el valor máximo de otra celda en una matriz. Esto lo podéis encontrar en este post: OBTENER VALOR DE UNA CELDA SEGÚN EL VALOR MÁXIMO DE UNA MATRIZ

En ese ejemplo utilizábamos tan solo un criterio, el valor del ID y en base a eso encontrar el valor de la celda. Pues bien, imaginad que debemos tener en cuenta dos ID´s más (ID2 e ID3).

Esta es la base de cálculo:

OBTENER EL VALOR DE UNA CELDA SEGUN EL VALOR MAXIMO DE UNA MATRIZ CON VARIAS CONDICIONES (PARTE II)

Un ejemplo de lo que necesitaríamos buscar sería, ID1=1321, ID2=1 e ID3=B

Si usamos un filtro veremos los parámetros, y al igual que en el post anterior, según los criterios de los ID tenemos que obtener el valor de Cantidad1 en función del valor máximo de Cantidad2, es decir 27

OBTENER EL VALOR DE UNA CELDA SEGUN EL VALOR MAXIMO DE UNA MATRIZ CON VARIAS CONDICIONES (PARTE II)_1

Pues bien, para conseguir este resultado, utilizaremos la siguiente fórmula matricial:

{=INDIRECTO(DIRECCION(COINCIDIR(MAX(SI(A:A=H1;SI(B:B=H2;SI(C:C=H3;E:E))));E:E;0);4))}

Para comprender las funciones utilizadas y su funcionamiento os remito al post anterior. En este ejercicio, hemos ampliado únicamente la parte de la función que hace referencia a los criterios y con la que obtendremos el valor del campo Cantidad2: 830

{=MAX(SI(A:A=H1;SI(B:B=H2;SI(C:C=H3;E:E))))}

El resto de la matricial detectará la posición de la celda anterior.

El ejercicio quedaría así:

OBTENER EL VALOR DE UNA CELDA SEGUN EL VALOR MAXIMO DE UNA MATRIZ CON VARIAS CONDICIONES (PARTE II)_2

Como habéis podido ver se trata “anidar” varios condicionales dentro de la función MAX y ejecutar matricialmente la función.

Recordad que para introducir las fórmulas matriciales debemos seleccionar la fórmula y presionar: CTRL + MAYUS + ENTRAR

Y esto es todo, espero que os sea de utilidad : )

Descarga el archivo de ejemplo pulsando en: OBTENER EL VALOR DE UNA CELDA SEGÚN EL VALOR MÁXIMO DE UNA MATRIZ CON VARIAS CONDICIONES (PARTE II)

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

Donate Button with Credit Cards

¡¡Muchas gracias!!

Mediante la suscripción al blog, la realización comentarios o el uso del formulario de contacto estás dando tu consentimiento expreso al tratamiento de los datos personales proporcionados según lo dispuesto en la ley vigente (LOPD). Tienes más información al respecto en esta página del blog: Política de Privacidad y Cookies

PROGRAMAR BUSCARV EN VBA

Hola a todos:

En esta web hay dos post dedicados a cómo programar la función Buscarv en VBA.

En el primero de ellos utilizo la notación RC en la fórmula (prácticamente como aparece después de utilizar la grabadora de macros) y aplico la fórmula a un rango determinado de celdas: FUNCIÓN BUSCARV EN VBA

La ventaja de utilizar este método es la rapidez, sin embargo el uso de la notación RC hace que sea complicado el realizar modificaciones de las columnas y celdas que intervienen en el proceso. Además de dejar poco margen para la introducción de condicionales.

En el segundo, utilizo el objeto “WorksheetFunction” para llamar desde VBA a la función Buscarv.  UTILIZAR CUADRO DE DIÁLOGO PARA SELECCIONAR ARCHIVO Y BUSCARV , aquí además utilizo una instrucción for-next para recorrer las celdas en las que necesitamos encontrar y en las que queremos incluir el valor encontrado. Este método es más lento, pero permite introducir otras funciones al proceso de forma muy sencilla, al estar utilizando un bucle y hacer referencias a las celdas.

En el post de hoy os mostraré otra alternativa, muy parecida a la primera, pero que permite que la función sea más fácil de utilizar. Usaré la misma plantilla que para el primer post:

BUSCARV EN VBA_3

Y la macro es la siguiente:

Option Explicit
Sub BUSCARV()
'DECLARAMOS VARIABLES
Dim Fin As Long, Final As Long, i As Long
Dim Titulos As Variant, T_rango As Object
Dim Cl_datos As Long
'Seleccionamos la hoja listado y limpiamos las celdas que tengan contenido
Worksheets("LISTADO").Select
Cl_datos = Application.CountA(Worksheets("LISTADO").Range("a:a"))
Sheets("LISTADO").Range("C2:D" & Cl_datos).Clear
'Determinamos la longitud del rango de los datos con un contarA
Fin = Application.CountA(Worksheets("LISTADO").Range("A:A"))
Final = Application.CountA(Worksheets("DATOS").Range("A:A"))
'Aplicamos la función buscarv para buscar el nombre y si no está que el resultado sea vacío, situamos el resultado en el rango
'B2 en adelante
With Worksheets("LISTADO").Range("B2:B" & Fin)
.Formula = "=IF(ISERROR(VLOOKUP(A2,DATOS!$A$2:$D$" & Final & ",2,0)),"""",VLOOKUP(A2,DATOS!$A$2:$D$" & Final & ",2,0))"
'.Formula = .Value
End With
'Aplicamos la función buscarv para buscar los estudios y si no están que el resultado sea vacío, situamos el resultado en el rango
'C2 en adelante
With Worksheets("LISTADO").Range("C2:C" & Fin)
.Formula = "=IF(ISERROR(VLOOKUP(A2,DATOS!$A$2:$D$" & Final & ",3,0)),"""",VLOOKUP(A2,DATOS!$A$2:$D$" & Final & ",3,0))"
.Formula = .Value
End With
'Aplicamos la función buscarv para buscar si sabe o no inglés y si no está que el resultado sea vacío, situamos el resultado en el rango
'D2 en adelante
With Worksheets("LISTADO").Range("D2:D" & Fin)
.Formula = "=IF(ISERROR(VLOOKUP(A2,DATOS!$A$2:$D$" & Final & ",4,0)),"""",VLOOKUP(A2,DATOS!$A$2:$D$" & Final & ",4,0))"
.Formula = .Value
End With
'Nombramos el encabezado de cada columna
With Worksheets("LISTADO")
Titulos = Array("Nombre", "Estudios", "Ingles")
Set T_rango = Worksheets("LISTADO").Range("B1:D1")
T_rango.Value = Titulos
'Coloreamos de rojo
T_rango.Interior.Color = vbRed
End With
End Sub

Como podéis observar, utilizamos la propiedad “.formula” del rango establecido y la escribimos sin utilizar la notación RC. Así resulta mucho más sencillo determinar qué rango es el que debemos seleccionar.

Este método al igual que el primero permite una mayor rapidez en comparación con el uso de bucles. Y nos aseguramos en pasar a valores el resultado de la fórmula. Si queremos que se quede con la fórmula, simplemente eliminamos esta igualación en todas las líneas del código:

.Formula = .Value

Y eso es todo, simplemente quería dejar en esta web otras forma de hacer el mismo procedimiento.

Espero que os resulta de interés.

Descarga el archivo de ejemplo pulsando en: PROGRAMAR BUSCARV EN 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!!

Mediante la suscripción al blog, la realización comentarios o el uso del formulario de contacto estás dando tu consentimiento expreso al tratamiento de los datos personales proporcionados según lo dispuesto en la ley vigente (LOPD). Tienes más información al respecto en esta página del blog: Política de Privacidad y Cookies

EXTRAER PARTE ENTERA Y DECIMAL DE UN NÚMERO

Hola a todos:

El post de hoy va a ser muy breve, y es que ya lo hemos tratado en alguna ocasión pero desde VBA. Se trata de cómo extraer la parte entera y decimal de un número.

Aunque parece un tema sencillo, no está de más refrescarlo y proponer un ejemplo. Veamos la siguiente lista de números decimales:

EXTRAER PARTE ENTERA Y DECIMAL DE UN NÚMERO

Para obtener la parte entera (sin posibilidad de redondeo), debemos utilizar la función Truncar. Simplemente la aplicaremos al número:

=TRUNCAR(A2)

Y para el primer registro el resultado será: 25

Para obtener la parte decimal, lo haremos obteniendo la diferencia entre el número inicial y el resultado de haber aplicado la función truncar es:

=A2-TRUNCAR(A2)

Por lo que el resultado será: 0,5

EXTRAER PARTE ENTERA Y DECIMAL DE UN NÚMERO_1

Y esto es todo, un post muy breve, pero seguro que os ayuda en algún momento : )

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

Donate Button with Credit Cards

¡¡Muchas gracias!!

Mediante la suscripción al blog, la realización comentarios o el uso del formulario de contacto estás dando tu consentimiento expreso al tratamiento de los datos personales proporcionados según lo dispuesto en la ley vigente (LOPD). Tienes más información al respecto en esta página del blog: Política de Privacidad y Cookies

CONTAR REGISTROS ÚNICOS CON VARIOS REGISTROS II

Hola a todos:

Hace un tiempo escribí un post en el que, mediante fórmulas, contaba registros únicos teniendo en cuenta varios registros: CONTAR REGISTROS ÚNICOS CON VARIOS CRITERIOS.

Pero lo cierto es que en el post, solamente utilizaba un criterio activo en la fórmula. Por dicho motivo he recibido varias consultas solicitando una ampliación de fórmula con un nuevo criterio.

Pues bien, siguiendo el post anterior, he añadido un nuevo criterio al Excel (Criterio2):

contar registros unicos con varios registros ii

Pues bien, el objetivo es contar aquellas áreas donde el criterio y criterio2 sea >=1

La fórmula que voy a utilizar es la siguiente (matricial):

{=CONTAR(1/FRECUENCIA(SI(Hoja1!$A$2:$A$19=F1;SI(Hoja1!$D$2:$D$19>=1;SI(Hoja1!$B$2:$B$19>=1;COINCIDIR(Hoja1!$C$2:$C$19;Hoja1!$C$2:$C$19;0))));FILA($A$2:$A$19)-FILA(DESREF($A$2:$A$19;;;1;))+1))}

Esta fórmula la podemos aplicar para obtener los tres conceptos que necesitamos. Este es el resultado:

contar registros unicos con varios registros ii_

Efectivamente, para el primer caso, tenemos 3 únicos, lo podemos ver utilizando el filtro:

contar registros unicos con varios registros ii_1

Contariamos cada color como un registro único, recordando que los criterios son >=1 en la columna B y D. El registro en blanco no se tiene en cuenta dado que B es igual a 0.

Os recuerdo que las matrices se introducen: seleccionando la fórmula y luego presionando CTRL + MAYUS + ENTRAR.

Y esto es todo, espero que con esta ampliación sea de mayor utilidad.

Descarga el archivo de ejemplo pulsando en: CONTAR REGISTROS ÚNICOS CON VARIOS REGISTROS II

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

Donate Button with Credit Cards

¡¡Muchas gracias!!

Mediante la suscripción al blog, la realización comentarios o el uso del formulario de contacto estás dando tu consentimiento expreso al tratamiento de los datos personales proporcionados según lo dispuesto en la ley vigente (LOPD). Tienes más información al respecto en esta página del blog: Política de Privacidad y Cookies