elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.


Tema destacado: Guía actualizada para evitar que un ransomware ataque tu empresa


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación General
| | |-+  Excel 2013 indicar celda "contigua" al 2ndo máximo valor, repetible.
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Excel 2013 indicar celda "contigua" al 2ndo máximo valor, repetible.  (Leído 1,800 veces)
Tachikomaia


Desconectado Desconectado

Mensajes: 1.606


Hackentifiko!


Ver Perfil
Excel 2013 indicar celda "contigua" al 2ndo máximo valor, repetible.
« en: 23 Agosto 2025, 03:50 am »

Tengo unas celdas así:

y otras así:


Quiero que en las que puse 1ero aparezca, en una lo de fondo rojo que tenga mejor promedio, y en la otra lo de fondo rojo que tenga el 2ndo mejor promedio, pudiendo ser igual, o sea, el 2ndo máximo que encuentre.

Le dije a GPT el problema:
esto
=INDICE(B131:B138; COINCIDIR(MAX(L131:L138); L131:L138; 0))
y esto
=INDICE(B131:B138; COINCIDIR(K.ESIMO.MAYOR(L131:L138;2); L131:L138; 0))
me están dando el mismo resultado, no debería ¿qué pasa?

Vean que en la 1er imagen los resultados son los mismos, pero el 2ndo debería ser Patada agachado.

Citar
Hay dos escenarios típicos en los que ambas fórmulas pueden devolver lo mismo:

1) El 2.º mayor “con repetidos” es igual al máximo 
   - Si en L131:L138 hay al menos dos celdas con el valor máximo, entonces:
     - MAX(L131:L138) = 19 (por ejemplo)
     - K.ESIMO.MAYOR(L131:L138;2) también = 19
   - En ese caso, ambas COINCIDIR buscan 19 y, por diseño, COINCIDIR(...;0) devuelve la primera aparición del valor en el rango. Resultado: mismas filas, mismo INDICE.

2) Datos no numéricos/formato o espacios influyen en el cálculo 
   - Si hay textos que parecen números, errores, celdas vacías con espacios, etc., pueden afectar a K.ESIMO.MAYOR/ MAX o a COINCIDIR. Pero lo habitual es el caso 1.

Cómo obtener el “segundo mayor distinto” (sin repetir el máximo):
- Fórmula matricial en Excel 2013 (confirmar con Ctrl+Shift+Enter):
  =INDICE(B131:B138; COINCIDIR(MAX(SI(L131:L138<MAX(L131:L138); L131:L138)); L131:L138; 0))

- Alternativa separando el valor y luego buscando:
  1) En una celda auxiliar: =MAX(SI(L131:L138<MAX(L131:L138); L131:L138))  Confirmar con Ctrl+Shift+Enter.
  2) Luego: =INDICE(B131:B138; COINCIDIR(celda_aux; L131:L138; 0))

Si lo que quieres es “segundo con repetidos” pero devolver la segunda ocurrencia del mismo máximo, COINCIDIR por sí sola no devuelve la segunda coincidencia. Puedes usar una clave auxiliar (por ejemplo, agregar un pequeño ajuste por fila) o una fórmula que ubique la n‑ésima aparición. Por ejemplo, para devolver la fila de la 2.ª aparición del máximo:

- Fórmula matricial para la posición de la 2.ª coincidencia:
  =PESTAÑA(FILA(L131:L138)-MIN(FILA(L131:L138))+1; 2; SI(L131:L138=MAX(L131:L138); FILA(L131:L138)-MIN(FILA(L131:L138))+1))
  Luego úsala dentro de INDICE. Si prefieres, te la adapto completa a tu rango y separadores.

Creo que entiendo el problema "por diseño, COINCIDIR(...;0) devuelve la primera aparición del valor en el rango"
pero las soluciones me parecen bastante raras, aunque le pedí una más simple ¿se les ocurre?

Básicamente es:
- Buscar 2ndo máximo valor en un rango.
- Anotar en qué celda está.
- Restar columnas a esa posición.


En línea

EdePC
Moderador Global
***
Desconectado Desconectado

Mensajes: 2.242



Ver Perfil
Re: Excel 2013 indicar celda "contigua" al 2ndo máximo valor, repetible.
« Respuesta #1 en: 24 Agosto 2025, 21:01 pm »

Esas cosas siempre tienen un grado de complejidad si lo quieres hacer con fórmulas, y está bien para quienes dominan las formulas madre de Excel y/o trabajan con datos que cambian constantemente en vivo. PERO no creo que sea tu caso SALVO quieras aprender y profundizar en el uso de fórmulas y matrices.

Lo normal y que cualquiera puede hacer es ordenar los datos con la herramienta Ordenar, tanto mejor si tu "tabla de datos" es una Tabla porque ya tiene los botones de Ordenar y Filtrar, en tu imagen de arriba solo resta poner =L131 y =L132 respectivamente:

Sin Tabla (empezar la selección desde la celda o columna que será la base de la ordenación):



Con Tabla:



Desventajas:

- No son automáticas, debes asegurarte de volver a Ordenar luego de ingresar/cambiar los datos
- Modifican el orden original de tus datos, dependerá si te importa o no cambiar el orden perdiendo el orden original

Ventajas:

- Es facilísimo

---

Ahora bien, si lo quieres hacer con fórmulas hay pasos que tienes que seguir y dominar:

1. Obtener el número de orden que ocupa un valor dentro de un rango de valores ordenados, en tu caso de mayor a menor. La forma convencional de hacer esto es tomar un valor dentro de un rango de valores y contar la cantidad de valores que son mayores, si dicha cantidad es 0 implica que estamos ante el valor mayor, si la cantidad es 1 será el segundo mayor, y así sucesivamente. Entonces, si le sumamos a esa cantidad: +1 obtendremos su número de orden, porque si la cantidad fue 0 implica que es el primer lugar, si la cantidad fue 1 implica que es el segundo lugar, etc

2. Valores repetidos, si es el caso hay que decidir que orden tendrán los valores repetidos, por lo general se suele usar una condición adicional que actúe sobre otra columna, por ejemplo si fuera una tabla de nombres y apellidos, y se desea ordenar por los nombres:

carlos | lópez
maría | tórres
carlos | flores

- Tenemos problemas con el nombre "carlos" ya que se repite, Si hiciéramos el paso 1 obtendríamos:

carlos | lópez | 1
maría | tórres | 3
carlos | flores | 1

- La solución está en hacer una condición adicional para comprobar el orden de los apellidos dándoles valores igual que en el paso 1 pero sin sumarles el +1, y al final contar/sumar ambos números de orden para obtener un número de orden sin repeticiones

carlos | lópez | 2
maría | tórres | 3
carlos | flores | 1

- Para tu caso puedes comprobar el orden de los valores de la columna "ataque tipo avanzado" correspondiente a los valores repetidos, justo como se hizo con el ejemplo de nombres y apellidos

- Su funcionamiento es sencillo, solo hay que despejar los valores repetidos y al resultante asignarle un número de orden, esta vez no sumaremos el +1 para que empiece en 0, al final se suma ese orden obtenido al número de orden del paso 1:

-- Despejado

carlos | lópez
carlos | flores

-- Número de orden con respecto al apellido

carlos | lópez | 1
carlos | flores | 0

-- Sumado al número de orden del paso 1:

carlos | lópez | 1 + 1
carlos | flores | 0 + 1

-- De esa manera "carlos flores" queda en primer lugar (1) y "carlos lópez" en segundo (2)

3. Localizar el valor de la columna requerida a partir de lo calculado anteriormente, en los pasos anteriores se obtiene el número de orden para cada fila, ya solo falta obtener que número de fila tiene el número de orden 1 y 2

carlos | lópez | 2
maría | tórres | 3
carlos | flores | 1

- Tan simple como decirle que primero quiero el valor de la columna de apellidos cuyo número de orden es 1, y luego quiero el valor de la columna apellidos cuyo número de orden es 2. Listo, esos serán los 2 primeros apellidos ordenados por nombres de forma ascendente.

carlos | flores | 1
carlos | lópez | 2

---

Resolución:

Paso 1: Basta con usar una columna auxiliar, por ejemplo la que está al lado (M131) y aplicar la función =CONTAR.SI($L$131:$L$137;">"&L132)+1

Paso 2: Como hay valores repetidos modificamos la fórmula con la segunda condición:

=CONTAR.SI($L$131:$L$137;">"&L132)+1+CONTAR.SI.CONJUNTO($L$131:$L$137;L132;$B$131:$B$137;"<"&B132)

- Con CONTAR.SI.CONJUNTO se pueden hacer varias condiciones que van reduciendo el rango de datos para la subsiguiente condición, lo primero era despejar los repetidos, eso se hace con la parte en rojo:

CONTAR.SI.CONJUNTO($L$131:$L$137;L132;$B$131:$B$137;"<"&B132)

- Una vez despejado/marcado los repetidos aplicamos la condición: $B$131:$B$137;"<"&B132 que similar al paso 1 ordenará los valores de la columna "ataque tipo avanzado" pero esta vez de menor a mayor (a-z), todo esto considerando el despeje anterior, es decir, solo las filas correspondientes a los repetidos, de esta manera se obtiene un segundo orden que se puede sumar al CONTAR.SI inicial y tener un orden secuencial sin repeticiones SALVO que también haya repeticiones en la columna de la segunda condición XD, si es el caso hay que agregar más condiciones con más columnas o especificar una condición personal.

Paso 3: Primero hay que localizar el número de fila dentro de un rango que tiene el número de orden 1 (el valor mayor), esto se hace con la fórmula COINCIDIR, una vez obtenido el número de fila solo queda obtener el valor de la columna "ataque tipo avanzado" con la fila hallada con COINCIDIR, esto se hace con INDICE, lo mismo para el número de orden 2 (segundo mayor) todo sería:

=INDICE(B131:B137;COINCIDIR(1;M131:M137;0))
=INDICE(B131:B137;COINCIDIR(2;M131:M137;0))

- Pues ya está, esto todo SI vas a usar la columna auxiliar que se ha creado en M131, pero si no quieres columna auxiliar se tiene que juntar todo, usar matrices donde las fórmulas esperan valores simples y obviamente presionar Ctrl + Shift + Enter para que haga valer las matrices que se han puesto en lugar de los valores simples, en resumen:



- La fórmula es:

=INDICE(B131:B137;COINCIDIR({1;2};CONTAR.SI(L131:L137;">"&L131:L137)+1+CONTAR.SI.CONJUNTO(L131:L137;L131:L137;B131:B137;"<"&B131:B137);0))

- Como ves, se han reemplazado todas las referencias a valores simples por rangos para que trabaje de manera matricial, incluso se ha reemplazado el número 1 o 2 que antes se usaba en dos fórmulas aparte, por una matriz manual de tal manera que el resultado a devolver también sea una matriz de dos filas que son justo las filas que hay que seleccionar para poner el resultado en ellas.

- Si no se conoce bien las matrices no se va a entender XD, pero puedo dar una explicación sencilla con la parte de CONTAR.SI(L131:L137;">"&L131:L137) que supongo que es una parte fácil de entender.

-- La función CONTAR.SI(rango;condición) tiene una par de argumentos base, primero un rango y luego la condición, dicha condición que se espera de valor simple, sin embargo yo le he puesto una condición de rango, por haber hecho esto ya se convierte en una fórmula matricial al que se tiene que presionar Ctrl + Shift + Enter y que además devuelve la matriz resultante.

-- Lo normal sería que dicha función tome un rango y una condición, lo que hará es tomar uno a uno los valores del rango, compararlos usando la condición y si se cumple cuenta +1:

CONTAR.SI(A1:A3;"<"&A1)

carlos | lópez | 0
maría | tórres | 2
carlos | flores | 0

1. Toma el primer miembro del rango (A1) y compara si es menor que A1, si es menor +1, sino 0
2. Toma el segundo miembro del rango (A2) y compara si es menor que A1, si es menor +1, sino 0
3. Toma el tercer miembro del rango (A3) y compara si es menor que A1, si es menor +1, sino 0

En los casos anteriores da 0;0;0 se cuentan y da 0, ahora la siguiente:

CONTAR.SI(A1:A3;"<"&A2)

1. Toma el primer miembro del rango (A1) y compara si es menor que A2, si es menor +1, sino 0
2. Toma el segundo miembro del rango (A2) y compara si es menor que A2, si es menor +1, sino 0
3. Toma el tercer miembro del rango (A3) y compara si es menor que A2, si es menor +1, sino 0

En los casos anteriores da 1;0;1 se cuentan y da 2

Como se ve se tiene que poner una fórmula por fila, es como hacer un bucle simple:

=CONTAR.SI(A1:A3;"<"&A1)

Código
  1. rango = ["carlos", "maría", "carlos"]
  2.  
  3. valor = rango[0] //"carlos"
  4. contar1 = 0
  5. for (var i = 0; i < rango.length; i++) {
  6.  if (rango[i] < valor) {
  7.    contar1++
  8.  }
  9. }
  10.  
  11. valor = rango[1] //"maría"
  12. contar2 = 0
  13. for (var i = 0; i < rango.length; i++) {
  14.  if (rango[i] < valor) {
  15.    contar2++
  16.  }
  17. }
  18.  
  19. valor = rango[2] //"carlos"
  20. contar3 = 0
  21. for (var i = 0; i < rango.length; i++) {
  22.  if (rango[i] < valor) {
  23.    contar3++
  24.  }
  25. }

Devuelve un solo valor cada uno (contar1, contar2, contar3) y la comparación es simple, rango vs valor, y hay que hacer lo mismo con cada valor. Al final devuelve contar1 = 0; contar2 = 2; contar 3 = 0

Pero si usamos otro rango en lugar del valor simple (A1 => A1:A3):

CONTAR.SI(A1:A3;"<"&A1:A3)

Código
  1. rango1 = ["carlos", "maría", "carlos"]
  2. rango2 = ["carlos", "maría", "carlos"]
  3. contar = [0,0,0]
  4. for (var i = 0; i < rango1.length; i++) {
  5.  for (var j = 0; j < rango2.length; j++) {
  6.    if (rango1[j] < rango2[i]) {
  7.      contar[i]++
  8.    }
  9.  }
  10. }

Devuelve un array contar = [0,2,0], más simple, más directo PERO devuelve una matriz de valores que se deben tratar como tales

---

Otra opción es utilizar las nuevas fórmulas de filtro dinámicas que trae las nuevas versiones de Excel, creo que del 2021 para arriba


« Última modificación: 24 Agosto 2025, 21:16 pm por EdePC » En línea

Tachikomaia


Desconectado Desconectado

Mensajes: 1.606


Hackentifiko!


Ver Perfil
Re: Excel 2013 indicar celda "contigua" al 2ndo máximo valor, repetible.
« Respuesta #2 en: 26 Agosto 2025, 09:40 am »

Mientras más automatizado mejor, hasta cierto punto, así que opto por la solución 2, no quiero ordenar la tabla cada vez que agregue datos, pero me diste una idea: ¿No se puede hacer un batch que busque los valores, o haga que Excel ordene esos valores de la tabla?
Doble clic es más fácil que seleccionar datos, hacer clic, esperar a que aparezca el menú...

No sabía eso de insertar una tabla en la tabla xD ¿seguro que no se ordenan automáticamente una vez lo indicas? En la imagen aparece una flechita hacia abajo.

No entiendo cómo funciona esto:
- La solución está en hacer una condición adicional para comprobar el orden de los apellidos dándoles valores igual que en el paso 1 pero sin sumarles el +1, y al final contar/sumar ambos números de orden para obtener un número de orden sin repeticiones

carlos | lópez | 2
maría | tórres | 3
carlos | flores | 1
Supongo que pones la fórmula más adelante.

Citar
- Su funcionamiento es sencillo, solo hay que despejar los valores repetidos y al resultante asignarle un número de orden, esta vez no sumaremos el +1 para que empiece en 0, al final se suma ese orden obtenido al número de orden del paso 1:
Idem...

Ya veo, pero ni idea cómo lo despejas.

No me funciona bien esto:
=CONTAR.SI($L$131:$L$137;">"&L132)+1

Decidí ampliar el rango, puse:
=CONTAR.SI($L$124:$L$137;">"&L125)+1

Pero supongo que no es el problema.

Te muestro:


La fila de Ataque tipo puñetazo es la 124.

Puse:
=CONTAR.SI($L$124:$L$137;">"&L125)+1
en la celda M124.
En la M125 la copié, quedó:
=CONTAR.SI($L$124:$L$137;">"&L126)+1
¿está bien que se cambie el 125?

Creo que había un error, cambié L125 por 124 y se arregló. Entiendo que la fórmula cuenta las veces que hay un valor mayor que el correspondiente a esa fila, no en la siguiente como estanba.

Ok.

¿Por qué se pone ">"&L124 en vez de >L124?

A ver, en el rango $L$124:$L$137 contar los valores si son >124. Luego sumar 1. No entiendo por qué las cosas raras...
CONTAR.SI(rango;condición para que se cuente)+1


Le pedí a GPT que explique la 2nda fórmula que pones:
(...)
CONTAR.SI.CONJUNTO($L$131:$L$137;L131;$B$131:$B$137;"<"&B131)
Aquí se manejan empates.
Cuenta cuántas filas tienen:
El mismo valor en L que L131 (empate en la métrica principal), y
Un valor en B estrictamente menor que B131.
Es decir, entre los empatados en L, cuenta cuántos “van antes” de L131 según un criterio secundario: B más pequeño.

No entiendo bien cómo es que hace eso...
CONTAR.SI.CONJUNTO(rango;valor;rango 2;condición a cumplir)
no lo capto...
La sintaxis de CONTAR.SI.CONJUNTO en español es:

CONTAR.SI.CONJUNTO(rango_criterios1; criterio1; [rango_criterios2; criterio2]; ...)

Cómo funciona:

rango_criterios1: el rango donde se evaluará el criterio1.
criterio1: la condición que deben cumplir las celdas de rango_criterios1 (puede ser un valor, una referencia, o una cadena con operadores como ">5", "<="&A1, etc.).
Puedes añadir más pares rango_criteriosN; criterioN. Excel solo contará la fila si TODAS las condiciones se cumplen simultáneamente (AND lógico, por filas).
No es “primero cuenta en el rango1 y luego en el rango2”. Más bien:

Recorre las filas en paralelo.
Para cada fila i, verifica: ¿la celda de rango_criterios1 cumple criterio1 Y la celda de rango_criterios2 cumple criterio2 Y ...?
Si sí, suma 1. Si no, no.

Aplicado a tu caso:
CONTAR.SI.CONJUNTO($L$131:$L$137; L131; $B$131:$B$137; "<"&B131)

rango_criterios1 = $L$131:$L$137
criterio1 = L131 (equivale a “igual a L131”)
rango_criterios2 = $B$131:$B$137
criterio2 = "<"&B131 (equivale a “estrictamente menor que B131”)
Cuenta cuántas filas, entre las 131–137, cumplen simultáneamente:

En la columna L: valor igual al de L131
Y en la columna B: valor menor que B131


Bien, pensé que CONJUNTO era como conjunto de datos, es más bien conjunto de condiciones que deben cumplirse.

Parece que funciona bien, pongo la tabla entera para descargar:
https://docs.google.com/spreadsheets/d/1xp_RAVCm3FwYSdTmqJWxRudvgQsqCrgQ/edit?usp=sharing&ouid=109273743447273895658&rtpof=true&sd=true

¿Podría ponerse que el 2ndo criterio en vez de orden alfabético sea órden de aparición? O sea, si está una fila antes, va antes.

Ahora no pero supongo que voy a leer más sobre fórmulas matriciales, por curiosidad.
« Última modificación: 26 Agosto 2025, 09:43 am por Tachikomaia » En línea

Tachikomaia


Desconectado Desconectado

Mensajes: 1.606


Hackentifiko!


Ver Perfil
Re: Excel 2013 indicar celda "contigua" al 2ndo máximo valor, repetible.
« Respuesta #3 en: 28 Agosto 2025, 21:35 pm »

Me dijeron una forma más sencilla de hacerlo, básicamente:
=JERARQUIA.EQV(Q124;$Q$124:$Q$138;0)+CONTAR.SI($Q$124:Q124;Q124)-1

JERARQUIA.EQV genera una lista ordenada de mayor a menor (si pones el argumento 0) y te da la posición (en la lista) del valor que le digas:
=JERARQUIA.EQV(valor a buscar;rango en donde buscar;modo)

Luego se le suma las repeticiones que se encuentren hasta la fila en cuestión, restando 1 para que su propio valor no se cuenta. Eso hace que los valores repetidos más abajo tengan más repeticiones que los mismos de arriba, haciendo que el resultado sea mayor.

Pero acabo de notar un posible error... si un valor tiene muchos repetidos le suma mucho y entonces puede que quede con una posición mayor a la que debe, pero por lo que veo eso no ocurre, no sé por qué  :huh:
Acá está la explicación:
hay un detalle clave: el primer término no es “orden correlativo”, sino el RANK (jerarquía) del valor dentro del rango, y el segundo término cuenta cuántas veces ya apareció ese mismo valor arriba. Juntos generan una secuencia sin saltos.

Desglosando tu fórmula:
=JERARQUIA.EQV(Q124;$Q$124:$Q$138;0) + CONTAR.SI($Q$124:Q124;Q124) - 1

JERARQUIA.EQV(Q124;$Q$124:$Q$138;0) devuelve el rango (1 = mayor, 2 = segundo mayor, etc.). Los empates comparten el mismo rango.
CONTAR.SI($Q$124:Q124;Q124) cuenta cuántas veces aparece el valor de Q124 desde la primera fila del rango hasta la fila actual, es decir, la ocurrencia k-ésima de ese valor (1 para la primera vez que aparece, 2 para la segunda, etc.).
Restar 1 ajusta para que la primera ocurrencia no sume nada extra.
Qué produce en un ejemplo:
Supón el rango tiene: 9, 9, 9, 8 (de mayor a menor en términos de valor, no necesariamente ordenados en filas). Los rangos por JERARQUÍA son:

Para 9: 1 (todos los 9 tienen rango 1)
Para 8: 4 (porque hay tres valores mayores: los tres 9; con JERARQUIA.EQV se salta de 1 a 4 en el siguiente valor distinto)


Tabla:
https://docs.google.com/spreadsheets/d/1AFqhW9Hld7eykWAVfcVSQIeIoym7oWW8/edit?usp=sharing&ouid=109273743447273895658&rtpof=true&sd=true
En línea

EdePC
Moderador Global
***
Desconectado Desconectado

Mensajes: 2.242



Ver Perfil
Re: Excel 2013 indicar celda "contigua" al 2ndo máximo valor, repetible.
« Respuesta #4 en: 29 Agosto 2025, 15:26 pm »

Citar
Me dijeron una forma más sencilla de hacerlo, básicamente:
=JERARQUIA.EQV(Q124;$Q$124:$Q$138;0)+CONTAR.SI($Q$124:Q124;Q124)-1

JERARQUIA.EQV genera una lista ordenada de mayor a menor (si pones el argumento 0) y te da la posición (en la lista) del valor que le digas:
=JERARQUIA.EQV(valor a buscar;rango en donde buscar;modo)

JERARQUIA.EQV es de las "nuevas" fórmulas que ponen para intentar ser más legibles, como desventaja es que solo funciona con valores numéricos, la fórmula madre CONTAR.SI hace exactamente lo mismo con más lógica, estas dos formulas son completamente equivalentes, aparte de que CONTAR.SI funciona con números y texto:

  A        B          C
 +-----------------------------  
1|     JERARQUIA.EQV   CONTAR.SI
2| 9         1            1
3| 9         1            1
4| 9         1            1
5| 8         4            4


=JERARQUIA.EQV(A2;$A$2:$A$5;0)

=CONTAR.SI($A$2:$A$5;">"&A2)+1

Citar
Luego se le suma las repeticiones que se encuentren hasta la fila en cuestión, restando 1 para que su propio valor no se cuenta. Eso hace que los valores repetidos más abajo tengan más repeticiones que los mismos de arriba, haciendo que el resultado sea mayor.

Pero acabo de notar un posible error... si un valor tiene muchos repetidos le suma mucho y entonces puede que quede con una posición mayor a la que debe, pero por lo que veo eso no ocurre, no sé por qué  :huh:

No hay error porque está usando rangos dinámicos CONTAR.SI($Q$124:Q124;Q124), ves que $Q$124 inmoviliza esa coordenada, pero Q124 no está inmovilizado, por eso al arrastrar la fórmula $Q$124 se mantendrá mientras que Q124 se irá incrementando por cada celda que se arrastre aumentando el rango dinámicamente, el último Q124 es la condición, es decir, cuenta cuantas apariciones del valor último (Q124) hay en el rango dinámico $Q$124:Q124

Teniendo todo lo anterior claro, puedes utilizar:

=CONTAR.SI($A$2:$A$5;">"&A2)+CONTAR.SI($A$2:A2;A2)

---
Otra opción por la que podrías optar es usar Macros, siempre hay gente purista que lo quiere hacer todo con fórmulas madre, otros con fórmulas matriciales, otros todo con tablas dinámicas, otros todo con macros, etc, es una locura XD, pero es bueno conocer un poco de todo.



Con darle click derecho al nombre de la hoja, Ver código abres el editor de macros, arriba tienes el ámbito (General y Worksheet), se elige Worksheet que corresponde a la Hoja actual, luego se elige el evento, se utilizará Change porque este se ejecuta cada vez que hay cambios en alguna celda de la hoja

El código es:

Código
  1. Private Sub Worksheet_Change(ByVal Target As Range)
  2.  Application.EnableEvents = False
  3.  promedios = Range("L131:L137").Value
  4.  ataqueTipos = Range("B131:B137").Value
  5.  For i = 2 To UBound(promedios)
  6.    For j = 1 To UBound(promedios) + 1 - i
  7.      If promedios(j, 1) < promedios(j + 1, 1) Then
  8.        tmp = promedios(j, 1)
  9.        promedios(j, 1) = promedios(j + 1, 1)
  10.        promedios(j + 1, 1) = tmp
  11.        tmp = ataqueTipos(j, 1)
  12.        ataqueTipos(j, 1) = ataqueTipos(j + 1, 1)
  13.        ataqueTipos(j + 1, 1) = tmp
  14.      End If
  15.    Next
  16.  Next
  17.  Range("B127") = ataqueTipos(1, 1)
  18.  Range("B128") = ataqueTipos(2, 1)
  19.  Application.EnableEvents = True
  20. End Sub

1. Indica el tipo de estructura (Private Sub) en este caso es una Procedimiento (función que no devuelve valor), el nombre es Worksheet_Change (puede ser cualquiera, pero el nombre por defecto ya es bastante claro al dar a entender que corresponde al evento Change de la Hoja), luego están los argumentos del Procedimiento, por defecto está el argumento de nombre Target de tipo (As) Range (rango de celdas) y se pasa por valor (ByVal)

2. Esta línea desactiva los eventos, claro, sino cualquier cambio en el Excel volvería a llamar a este Procedimiento, incluso este Procedimiento puede hacer cambios y no queremos que se re-llame, al menos no hasta terminar

3 y 4. Declaro dos variables Array, el primero para guardar los "promedios", y el otro para guardar los "ataques tipos", los Range siempre devuelven Arrays bidimensionales (Fila, Columna), además estos Arrays empezarán con índice 1 en lugar de 0

5 al 16. Es el famoso algoritmo de ordenación Burbuja, los bucles en las Macros de Excel (VBA) tienen diferente sintaxis a las que ya conoces, For inicializar_variable To valor_maximo_de_variable, por ejemplo el clásico for (i = 0; i < 10; i++) en VBA es: For i = 0 To 9, no requiere el i++ porque se sobreentiende que la variable debe aumentar de uno en uno con cada iteración

Ubound devuelve el último índice de un Array, si el Array es: vocales = ("a", "e", "i", "o", "u"), UBound(vocales) devolverá 4 porque se sobreentiende que el array vocales empieza con índice 0:

vocales(0) = "a"
vocales(1) = "e"
vocales(2) = "i"
vocales(3) = "o"
vocales(4) = "u"

Ah, y los Arrays en VBA usan paréntesis en lugar de corchetes como se puede ver. Considerando que Range devuelve un Array bidimensional y que además el primer índice empieza en 1, sería algo así suponiendo que las vocales están en el rango "A1:A5" :

vocales = Range("A1:A5")

Es lo mismo que:

vocales(1,1) = "a"
vocales(2,1) = "e"
vocales(3,1) = "i"
vocales(4,1) = "o"
vocales(5,1) = "u"

Recuerda: vocales(fila, columna), si usas UBound(vocales) devuelve el último índice del array, es decir 5

El Algoritmo de Ordenación es muy popular así que no lo explicaré, salvo las líneas 11, 12 y 13 porque lo que hacen es replicar esa misma ordenación con el Array "ataqueTipos" para replicar esa ordenación, también decir que en todos los casos se está índicando el 1 en por ejemplo promedio(j,1) porque el Array es bidimensional pero como solo tiene una Columna y no necesitamos más, ponemos 1, solo varía la Fila

17 y 18 Escriben el primer y segundo valor del Array ordenado en la celda de resultados

19 Vuelve a activar los eventos

---
Adjunto el archivo de excel para que lo revises, y otra cosa importante de las Macros es que para que se conserven debes guardar el archivo como .xlsm en lugar de .xlsx, el propio excel te lo recordará, aparte de los permisos y confianza en las macros claro, esa es la desventaja de las macros, muy escandalosas

https://mega.nz/file/0wYUwajC#ulsigtqFbg-HURicEbyU8zLyTYgq8dpBN3CWIhE3vYk
En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines