Saltar al contenido

Funcion moda condicional en un bucle


Recommended Posts

publicado

Buenas tardes,

Ante todo, muchas gracias por vuestra página Web, que me ha permitido avanzar bastante en el fascinante mundo de la programación VBA, pero no lo suficiente, ya que no fui capaz de resolverla esta duda que les envío a continuación:

Tengo una serie de datos de diferentes respuestas, agrupados por columnas (a partir de la D) y quisiera obtener sus modas, es decir el valor que más se repite, en función de que la clase a la que pertenecen, la cual la tengo definida en la columna D.

[TABLE]

[TR]

[TD]Columna

[/TD]

[TD] D

[/TD]

[TD]E

[/TD]

[TD]F

[/TD]

[TD]G

[/TD]

[TD]H

[/TD]

[TD]I

[/TD]

[TD]J

[/TD]

[TD]K

[/TD]

[TD]L

[/TD]

[/TR]

[TR]

[TD]Dato Fila 2

[/TD]

[TD]OP_1

[/TD]

[TD]A

[/TD]

[TD]A

[/TD]

[TD]A

[/TD]

[TD]A

[/TD]

[TD]C

[/TD]

[TD]A

[/TD]

[TD]A

[/TD]

[TD]A

[/TD]

[/TR]

[TR]

[TD]Dato Fila 3

[/TD]

[TD]OP_2

[/TD]

[TD]B

[/TD]

[TD]B

[/TD]

[TD]A

[/TD]

[TD]C

[/TD]

[TD]A

[/TD]

[TD]B

[/TD]

[TD]C

[/TD]

[TD]D

[/TD]

[/TR]

[TR]

[TD]Dato Fila 4

[/TD]

[TD]OP_2

[/TD]

[TD]A

[/TD]

[TD]B

[/TD]

[TD]D

[/TD]

[TD]B

[/TD]

[TD]D

[/TD]

[TD][/TD]

[TD]A

[/TD]

[TD]C

[/TD]

[/TR]

[TR]

[TD]Dato Fila 5

[/TD]

[TD]OP_1

[/TD]

[TD]A

[/TD]

[TD]A

[/TD]

[TD]B

[/TD]

[TD][/TD]

[TD][/TD]

[TD][/TD]

[TD][/TD]

[TD][/TD]

[/TR]

[TR]

[TD]Dato Fila 6

[/TD]

[TD]OP_1

[/TD]

[TD]B

[/TD]

[TD]C

[/TD]

[TD]C

[/TD]

[TD]C

[/TD]

[TD]C

[/TD]

[TD]B

[/TD]

[TD]C

[/TD]

[TD]D

[/TD]

[/TR]

[TR]

[TD]Dato Fila 7

[/TD]

[TD]OP_1

[/TD]

[TD]A

[/TD]

[TD]B

[/TD]

[TD]B

[/TD]

[TD]B

[/TD]

[TD]B

[/TD]

[TD]A

[/TD]

[TD]B

[/TD]

[TD]A

[/TD]

[/TR]

[TR]

[TD]Dato Fila n

[/TD]

[TD]OP_2

[/TD]

[TD]A

[/TD]

[TD]A

[/TD]

[TD]D

[/TD]

[TD]B

[/TD]

[TD]A

[/TD]

[TD]C

[/TD]

[TD]A

[/TD]

[TD]C

[/TD]

[/TR]

[TR]

[TD]Resultado

esperado

[/TD]

[TD][/TD]

[TD][/TD]

[TD][/TD]

[TD][/TD]

[TD][/TD]

[TD][/TD]

[TD][/TD]

[TD][/TD]

[TD][/TD]

[/TR]

[TR]

[TD]Moda OP_1

[/TD]

[TD][/TD]

[TD]A

[/TD]

[TD]A

[/TD]

[TD]B

[/TD]

[TD]A

[/TD]

[TD]C

[/TD]

[TD]A

[/TD]

[TD]A

[/TD]

[TD]A

[/TD]

[/TR]

[TR]

[TD]Moda OP_2

[/TD]

[TD][/TD]

[TD]A

[/TD]

[TD]B

[/TD]

[TD]D

[/TD]

[TD]B

[/TD]

[TD]A

[/TD]

[TD]B

[/TD]

[TD]A

[/TD]

[TD]C

[/TD]

[/TR]

[/TABLE]

Lo que busco es una función ModeIFs similar a CountIfs que he creado para contar los datos dentro de un bucle, que les adjunto a continuación, pero no he encontrado nada parecido:


Dim VOPTC As Range
Dim VLIST As Range

Set VOPTC = Worksheets("Datos").Range("D:D")
Set VLIST = Worksheets("Datos").Range("D:D").Offset(0, i)

' Resultado en la variable SA, SB....etc

For i = 1 To 25 Step 1
SA = Application.WorksheetFunction.CountIfs(VLIST, "=A", VOPTC, "=OP_1")
Worksheets("Estadisticas").Cells(8, i + 1).Value = SA
SB = Application.WorksheetFunction.CountIfs(VLIST, "=A", VOPTC, "=OP_2")
Worksheets("Estadisticas").Cells(9, i + 1).Value = SB
Next
[/CODE]

Muchas gracias por vuestro aporte,

Cordialmente,

E. Cabaleiro (Peperoni)

Invitado Cacho R
publicado

Hola! José Emilio

Estoy en desacuerdo con tres de los resultados esperados que indicas:

OP_1 / H

OP_1 / K

OP_2 / J

pues -entiendo- que allí no hay una moda establecida.

En todo caso y cuando no hay una moda establecida: ¿Qué resultado quieres obtener?

Saludos, Cacho R.

publicado

Hola,

Ante todo, muchas gracias por tu interés.

El ejemplo es una parte de la hoja que tiene más de 200 líneas con las distintos respuestas de un examen tipo test (A, B, C, D o en blanco), por lo que cuando se calcula la moda se puede dar que la letra A y la letra B sea el valor más repetido, por ejemplo para la opción 1, en la columna "J".

En este caso cualquier valor sería válido, pero creo que Excel da el primero que encuentra.

De todas formas, lo que me interesa es calcular para cada una de las opciones, cual es el valor de la respuesta que más se repite.

Espero haber disipado tus dudas,

Un saludo,

Peperoni.

Invitado Cacho R
publicado
... Espero haber disipado tus dudas ...

Mmmmm... La verdad es que no: ¡No me las has disipado! :disgust: jajaja :highly_amused: jajaja

___

Vamos de nuevo con la pregunta:

... En todo caso y cuando no hay una moda establecida: ¿Qué resultado quieres obtener?...

Por ejemplo y como te lo mencioné previamente, en OP_2 / J tienes: B y C como únicas respuestas: ¿Qué resultado quieres obtener? (me puse "monotemático, ¿Verdad?)

publicado

Hola,

Como indique anteriormente, cualquier valor sería válido. No obstante, una pequeña argumentación

He probado con números en Excel y por ejemplo, para el conjunto de números (1,1,2,2,2,1,3,3) en la que los valores 1 y 2 se encuentran repetidos 3 veces cada uno, la respuesta de Excel para a función MODA.UNO de estos números es 1.

Tambien es cierto que para que funcione, en el caso de los números, tiene que haber como mínimo 2 valores repetido de al menos una de los valores, es decir que la función MODA.UNO de (1,2,3) daría error.

En el ejemplo, al haber copiado solamente las primeras líneas no se cumple estrictamente esta premisa, por lo que se pueden añadir más líneas para que sea representativo. En formulario que tengo, al tener más de 10 filas este requisito se cumple siempre.

En resumen, si aplicamos la misma lógica que usa Excel para los números, si se encuentran las letras B y C repetidas, al menos 2 veces, la respuesta debería ser el orden alfabetico, es decir la B.

Espero esta vez, haber clarificado las dudas iniciales.

Un saludo y gracias por vuestra ayuda,

Peperoni,

Invitado Cacho R
publicado
... Espero esta vez, haber clarificado las dudas iniciales...

¡Qué bueno, José!... ¡Veo que estuviste "haciendo los deberes"! (jajajaja :disgust: jajaja).

Tengo una buena idea de como implementarlo, así que a más tardar el lunes te muestro una forma de hacerlo.

Saludos, Cacho R.

publicado
¡Qué bueno, José!... ¡Veo que estuviste "haciendo los deberes"! (jajajaja:disgust: jajaja).

Hola a tod@s,

Como continuación de la realización de los deberes, he encontrado una forma equivalente de obtener la moda. Son unas pocas líneas más de código, pero al final el resultado es lo que cuenta.

Usando la función que comentaba al principio de este post, CountIfs, cuento el número de veces que sale cada respuesta, almaceno este valor en las variables SA, SB, SC, SD y SN, de modo que me permite obtener el valor máximo con la función MAX y asignarle con la rutina Select Case el valor de la respuesta que más ha salido.

Simple, pero eficaz. Les adjunto el código de esta parte.

 
'Moda Opcion A

ModaA = Application.Max(SA, SB, SC, SD, SN)

Select Case ModaA
Case SA
Worksheets("Estadisticas").Cells(4, i + 1).Value = "A"
Case SB
Worksheets("Estadisticas").Cells(4, i + 1).Value = "B"
Case SC
Worksheets("Estadisticas").Cells(4, i + 1).Value = "C"
Case SD
Worksheets("Estadisticas").Cells(4, i + 1).Value = "D"
Case SN
Worksheets("Estadisticas").Cells(4, i + 1).Value = "N"
End Select
[/CODE]

Nota: Por si alguno lo pregunta, para los casos repetidos, o cuando no hay una moda establecida, en caso de encontrar el mismo valor máximo en dos variable, sale la primera de ellas.

No obstante, como pasa en todo lenguaje de programación, se admiten otras opciones más simples para resolver el mismo problema, ya que la pregunta inicial era encontrar una función equivalente a CountIfs, pero para la moda . :courage:

Agradeciendo vuestro interés, sobre todo el de Cacho R., por animarme a encontrar una solución antes del lunes…..

Saludos cordiales,

Peperoni

Archivado

Este tema está ahora archivado y está cerrado a más respuestas.

×
×
  • Crear nuevo...

Información importante

Echa un vistazo a nuestra política de cookies para ayudarte a tener una mejor experiencia de navegación. Puedes ajustar aquí la configuración. Pulsa el botón Aceptar, si estás de acuerdo.