Visual Basic para Aplicaciones - Comparar entre si el valor de 20 variables

Life is soft - evento anual de software empresarial
 
Vista:
sin imagen de perfil
Val: 9
Ha mantenido su posición en Visual Basic para Aplicaciones (en relación al último mes)
Gráfica de Visual Basic para Aplicaciones

Comparar entre si el valor de 20 variables

Publicado por Francisco (3 intervenciones) el 20/05/2019 13:49:00
Hola a todos a ver si me podeis ayudar.
necesito comparar entre si el valor que han obtenido 20 variables para saber si alguno de sus valores se repite y de ser asi, cuantas veces se repite ese valor.
esta es la cadena:

y = (abc + abd + abe + abf + acd + ace + acf + ade + adf + aef + bcd + bce + bcf + bde + bdf + bef + cde + cdf + cef + def) / 20

Se me ocurre una forma de comparar entre si, todos los valores que han obtenido cada una de las variables. Pero eso me llevaria a realizar un programa con 190 lineas o una macro de ese tamaño. Esto seria con la condicion if.

Ej:
if abc = abd then contador = contador +1
Elseif abc = abe then contador = contador + 1
Elseif abc = abf then contador = contador +1

Y así sucesivamente. cuando acabase de comparar la variable abc empezaria con abd y despues abe .....etc

Hay alguna forma mas sencilla de hacerlo?

Gracias
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
Imágen de perfil de MIGUEL
Val: 424
Bronce
Ha mantenido su posición en Visual Basic para Aplicaciones (en relación al último mes)
Gráfica de Visual Basic para Aplicaciones

Comparar entre si el valor de 20 variables

Publicado por MIGUEL (121 intervenciones) el 20/05/2019 18:46:42
Desde mi punto de vista sería con un array

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
Sub comparar()
Dim compara(19) as double'o integer o string o el que mejor se te acomode
Dim contador as byte
Compara(0)=abc
Compara(1)=abd
Compara(2)=abe
'y así hasta llegar a:
Compara(19)=def
Contador = 0
'despues entra el bucle for
For i =1 to 19
     If compara(0) = compara(i) Then
           contador = contador + 1
     End if
Next i
Msgbox "la variable" & compara(0) & "se repite" & contador & "veces"
End Sub

Es un poco larga pero ya no son 190 lineas

Saludos
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar
sin imagen de perfil
Val: 9
Ha mantenido su posición en Visual Basic para Aplicaciones (en relación al último mes)
Gráfica de Visual Basic para Aplicaciones

Comparar entre si el valor de 20 variables

Publicado por Francisco (3 intervenciones) el 20/05/2019 23:30:17
Muchas gracias, me ha sido muy util tu respuesta.
lo he probado y funciona solo he tenido que hacer unas pequeñas modificaciónes para que funcionara como necesitaba.
he anidado dos bucles For Nest y a quedado asi:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
compara(0) = abc: compara(1) = abd: compara(2) = abe: compara(3) = abf: compara(4) = acd
compara(5) = ace: compara(6) = acf: compara(7) = ade: compara(8) = adf: compara(9) = aef
compara(10) = bcd: compara(11) = bce: compara(12) = bcf: compara(13) = bde: compara(14) = bdf
compara(15) = bef: compara(16) = cde: compara(17) = cdf: compara(18) = cef: compara(19) = def
For i2 = 0 To 18
c2 = c2 + 1
For i = 0 To 19
     If i = 0 Then i = i + c2
     If compara(i2) = compara(i) Then
           contador = contador + 1
     End If
Next i
Next i2
MsgBox "la variable " & compara(0) & " se repite " & contador & " veces"
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar
Imágen de perfil de Antoni Masana
Val: 1.134
Oro
Ha mantenido su posición en Visual Basic para Aplicaciones (en relación al último mes)
Gráfica de Visual Basic para Aplicaciones

Comparar entre si el valor de 20 variables

Publicado por Antoni Masana (498 intervenciones) el 21/05/2019 10:11:28
El mismo bucle simplificado:

1
2
3
4
5
6
7
8
9
10
11
compara( 0) = abc: compara( 1) = abd: compara( 2) = abe: compara( 3) = abf: compara( 4) = acd
compara( 5) = ace: compara( 6) = acf: compara( 7) = ade: compara( 8) = adf: compara( 9) = aef
compara(10) = bcd: compara(11) = bce: compara(12) = bcf: compara(13) = bde: compara(14) = bdf
compara(15) = bef: compara(16) = cde: compara(17) = cdf: compara(18) = cef: compara(19) = def
 
For i1 = 0 To 18
    For i2 = i1 + 1 To 19
        If compara(i1) = compara(i2) Then contador = contador + 1
    Next
Next
MsgBox "la variable " & compara(0) & " se repite " & contador & " veces"

El elemento 0 lo compara con los elementos del 1 al 19
El elemento 1 lo compara con los elementos del 2 al 19
El elemento 2 lo compara con los elementos del 3 al 19
etc.
El elemento 16 lo compara con los elementos del 17 al 19.
El elemento 17 lo compara con los elementos del 18 al 19.
El elemento 18 lo compara con el elemento 19.

Si el elemento 0 es diferente al elemento 1, no hace falta que vuelva a comparar el 1 con el 0.
Y por supuesto todo elemento es igual a si mismo.

Ahora bien con esto sabras cuanto elementos se repiten pero no cuales.

Si quieres saber cuales se repiten tendremos que hacer unos cambios:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
compara( 0) = abc: compara( 1) = abd: compara( 2) = abe: compara( 3) = abf: compara( 4) = acd
compara( 5) = ace: compara( 6) = acf: compara( 7) = ade: compara( 8) = adf: compara( 9) = aef
compara(10) = bcd: compara(11) = bce: compara(12) = bcf: compara(13) = bde: compara(14) = bdf
compara(15) = bef: compara(16) = cde: compara(17) = cdf: compara(18) = cef: compara(19) = def
 
For i1 = 0 To 18
    Contador = 0
    For i2 = i1 + 1 To 19
        If compara(i1) = compara(i2) Then contador = contador + 1
    Next
    If Num > 0 Then
        MsgBox "El valor: " & compara(i1) & " se repite " & contador & Iif(Contador>1, " veces", " vez")
    End If
Next

NOTA: lo que muestras en el MsgBox es un valor no una variable.


Saludos.
\\//_
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar
Imágen de perfil de Antoni Masana
Val: 1.134
Oro
Ha mantenido su posición en Visual Basic para Aplicaciones (en relación al último mes)
Gráfica de Visual Basic para Aplicaciones

Comparar entre si el valor de 20 variables

Publicado por Antoni Masana (498 intervenciones) el 21/05/2019 10:49:11
Francisco el bucle de los dos FOR hace exactamente lo mismo que el mio.

No lo habia visto bien los dos FOR anidados y lo he probado y es correcto, lo que me ha despistado es el: IF i = 0

Creo que la solución de iniciar la variable del segundo FOR es mejor que la del IF.

He visto dar errores raros por manejar mal un FOR.

Saludos
\\//_
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar
sin imagen de perfil
Val: 9
Ha mantenido su posición en Visual Basic para Aplicaciones (en relación al último mes)
Gráfica de Visual Basic para Aplicaciones

Comparar entre si el valor de 20 variables

Publicado por Francisco (3 intervenciones) el 21/05/2019 16:51:53
muchas gracias por la ayuda.
En cuanto a lo que dices de iniciar la variable, pienso que cuanto mas sencillo sea el programa mas facil será detectar los errores.
llevo 10 años trabajando en este programa y tiene tantas funciones, macros y lineas de codigo que, antes de meterle mas codigo lo primero que hago es ver la forma de reducir lo que quiero hacer de la forma mas sencilla.
creo que el problema tambien tiene otra solución. con un array de dos dimensiones, pero no me manejo muy bien con los arrays y ni me atrevo a intentarlo.

Gracias de nuevo.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Antoni Masana
Val: 1.134
Oro
Ha mantenido su posición en Visual Basic para Aplicaciones (en relación al último mes)
Gráfica de Visual Basic para Aplicaciones

Comparar entre si el valor de 20 variables

Publicado por Antoni Masana (498 intervenciones) el 22/05/2019 07:43:49
El trabajo con arrays es muy satisfactorio y mi consejo es que aprendas a usarlas.

Si has trabajado con Excel o con cualquier hoja de calculo estas trabajando con un Array enorme que se compone de filas y columnas o para tener una idea sobre algo más físico y palpable el ajedrez, el tablero es una matriz o array de 8x8 y al describir una casilla se define por la fila y la columna.

Por ejemplo en que casillas están las torres al inicio de la partida: (1,1) - (1,8) - (8,1) - (8,8).

No se si esta explicación te ayuda un poquito o te a liado más pero la única forma de aprender en la Prueba/Fallo y la práctica.

Saludos.
\\//_
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Dirk
Val: 50
Ha aumentado 1 puesto en Visual Basic para Aplicaciones (en relación al último mes)
Gráfica de Visual Basic para Aplicaciones

Comparar entre si el valor de 20 variables

Publicado por Dirk (20 intervenciones) el 15/07/2019 22:44:11
Amigos, asumiendo que:
.- por ejemplo el valor del item1 = 1, al igual que el item3 y que
.- ese valor no se repite en otro item, y que
.- los valores de los 20 item van del 1 al 5

entonces cuando el programa cuente el item1 muestra el mensaje "El valor 1 se repite 2 veces" lo mismo que cuando cuente el item 3, a la final tendría 20 mensajes, muchos de ellos diciendo lo mismo, por lo que tendría que escribir el valor y las veces que se repite en un papel a manera de resumen, recuerden que solo hay 5 valores, creo que sería un buen ejemplo del uso de arrays y de optimización del reporte si el programa te da el resumen... como la tabla dinámica que adjunto como ejemplo.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar