Generar números con condiciones específicas

Quisiera modificar una macro que el compañero Edgar Castillo me ha estado ayudando a crear muy amablemente. En ella se generan una serie de números que conforman unas operaciones de cálculo para niños de 10 años, para que éstas sean siempre distintas cuando se pulse el botón.

El problema es que los números de las columnas que comprenden los días martes y jueves conllevan divisiones, y estas tienen que ser exactas. La macro actual genera números aleatorios y las divisiones no son exactas.

¿Pueden ayudarme a modificar la macro para que consiga lo que necesito? Muchas gracias.

Sub Aleatorio()
    x = 10
    Randomize
    For i = 15 To 23
        'CUADRO DEL LUNES
        Range("B" + Trim(Str(i))).Value = Int((x * Rnd()) + 1)
        Range("C" + Trim(Str(i))).Value = Int((x * Rnd()) + 1)
        Range("D" + Trim(Str(i))).Value = Int((x * Rnd()) + 1)
        'CUADRO DEL MARTES
        Range("I" + Trim(Str(i))).Value = Int((x * Rnd()) + 1)
        Range("J" + Trim(Str(i))).Value = Int((x * Rnd()) + 1)
        Range("K" + Trim(Str(i))).Value = Int((x * Rnd()) + 1)
    Next
    For i = 28 To 36
         'CUADRO DEL MIERCOLES
        Range("B" + Trim(Str(i))).Value = Int((x * Rnd()) + 1)
        Range("C" + Trim(Str(i))).Value = Int((x * Rnd()) + 1)
        Range("D" + Trim(Str(i))).Value = Int((x * Rnd()) + 1)
        'CUADRO DEL JUEVES
        Range("I" + Trim(Str(i))).Value = Int((x * Rnd()) + 1)
        Range("J" + Trim(Str(i))).Value = Int((x * Rnd()) + 1)
        Range("K" + Trim(Str(i))).Value = Int((x * Rnd()) + 1)
    Next
    For i = 41 To 49
        'CUADRO DEL VIERNES
        Range("B" + Trim(Str(i))).Value = Int((x * Rnd()) + 1)
        Range("C" + Trim(Str(i))).Value = Int((x * Rnd()) + 1)
        Range("D" + Trim(Str(i))).Value = Int((x * Rnd()) + 1)
    Next
End Sub

1 respuesta

Respuesta
1

¿Puedes poner una imagen de la tabla para que se pueda ver qué números se dividen por cuales otros?

Los números debieran de ser aleatorios y dentro de las tablas de multiplicar para que los niños puedan resolverlos mentalmente. Por ejemplo: 63 : 7 +12 = (de este estilo)

Esto te solucionará el problema

Sub Aleatorio()
Dim numero As Integer
Dim divisor As Integer
    x = 10
    Randomize
    For i = 15 To 23
        'CUADRO DEL LUNES
        Range("B" + Trim(Str(i))).Value = Int((x * Rnd()) + 1)
        Range("C" + Trim(Str(i))).Value = Int((x * Rnd()) + 1)
        Range("D" + Trim(Str(i))).Value = Int((x * Rnd()) + 1)
        'CUADRO DEL MARTES
        Do
        Range("I" + Trim(Str(i))).Value = Int((x * Rnd()) + 1)
        Range("J" + Trim(Str(i))).Value = Int((x * Rnd()) + 1)
        numero = Range("I" + Trim(Str(i))).Value
        divisor = Range("J" + Trim(Str(i))).Value
        Loop Until numero Mod divisor = 0
        Range("K" + Trim(Str(i))).Value = Int((x * Rnd()) + 1)
    Next
    For i = 28 To 36
         'CUADRO DEL MIERCOLES
        Range("B" + Trim(Str(i))).Value = Int((x * Rnd()) + 1)
        Range("C" + Trim(Str(i))).Value = Int((x * Rnd()) + 1)
        Range("D" + Trim(Str(i))).Value = Int((x * Rnd()) + 1)
        'CUADRO DEL JUEVES
        Do
        Range("I" + Trim(Str(i))).Value = Int((x * Rnd()) + 1)
        Range("J" + Trim(Str(i))).Value = Int((x * Rnd()) + 1)
        numero = Range("I" + Trim(Str(i))).Value
        divisor = Range("J" + Trim(Str(i))).Value
        Loop Until numero Mod divisor = 0
        Range("K" + Trim(Str(i))).Value = Int((x * Rnd()) + 1)
    Next
    For i = 41 To 49
        'CUADRO DEL VIERNES
        Range("B" + Trim(Str(i))).Value = Int((x * Rnd()) + 1)
        Range("C" + Trim(Str(i))).Value = Int((x * Rnd()) + 1)
        Range("D" + Trim(Str(i))).Value = Int((x * Rnd()) + 1)
    Next
End Sub

Muchas gracias por la respuesta. Lo he copiado pero me sale el siguiente error al generar los números:

Error de compilación.

Se esperaba: =

A mi me funciona perfecto, a ver si a tu excel ha sufrido un empacho de paréntesis... prueba

Sub Aleatorio()
Dim numero As Integer
Dim divisor As Integer
    x = 10
    Randomize
    For i = 15 To 23
        'CUADRO DEL LUNES
        Range("B" + Trim(Str(i))).Value = Int(x * Rnd()) + 1
        Range("C" + Trim(Str(i))).Value = Int(x * Rnd()) + 1
        Range("D" + Trim(Str(i))).Value = Int(x * Rnd()) + 1
        'CUADRO DEL MARTES
        Do
        Range("I" + Trim(Str(i))).Value = Int(x * Rnd()) + 1
        Range("J" + Trim(Str(i))).Value = Int(x * Rnd()) + 1
        numero = Range("I" + Trim(Str(i))).Value
        divisor = Range("J" + Trim(Str(i))).Value
        Loop Until numero Mod divisor = 0
        Range("K" + Trim(Str(i))).Value = Int(x * Rnd()) + 1
    Next
    For i = 28 To 36
         'CUADRO DEL MIERCOLES
        Range("B" + Trim(Str(i))).Value = Int(x * Rnd()) + 1
        Range("C" + Trim(Str(i))).Value = Int(x * Rnd()) + 1
        Range("D" + Trim(Str(i))).Value = Int(x * Rnd()) + 1
        'CUADRO DEL JUEVES
        Do
        Range("I" + Trim(Str(i))).Value = Int(x * Rnd()) + 1
        Range("J" + Trim(Str(i))).Value = Int(x * Rnd()) + 1
        numero = Range("I" + Trim(Str(i))).Value
        divisor = Range("J" + Trim(Str(i))).Value
        Loop Until numero Mod divisor = 0
        Range("K" + Trim(Str(i))).Value = Int(x * Rnd()) + 1
    Next
    For i = 41 To 49
        'CUADRO DEL VIERNES
        Range("B" + Trim(Str(i))).Value = Int(x * Rnd()) + 1
        Range("C" + Trim(Str(i))).Value = Int(x * Rnd()) + 1
        Range("D" + Trim(Str(i))).Value = Int(x * Rnd()) + 1
    Next
End Sub

Pues algo hago mal, sustituyo mi código por el tuyo y esto es lo que aparece.

Lo tengo en un módulo 2, por si tiene algo que ver, que no lo sé.

¿Y con el primer código también te salen las líneas en rojo?

Con el código original que planteé la pregunta funciona, pero no sale lo que necesito. Con los 2 códigos que me has proporcionado me salen las líneas en rojo y me sale el mismo mensaje del =

Al final del código pone una vez end sub?

sí. Me he fijado que si copio tu código y lo pego el módulo general pasa de aleatorio a declaraciones, no sé si esto tendrá algo que ver. (se ve en la captura que anteriormente envié) Si lo copio de cero a mano para que no se cambie lo de aleatorio me salta este error: "No se ha definido Sub o Function"

Cambia aleatorio() por aleatorio1() a ver que pasa

Pasan 2 cosas:

1) Que sale el mismo mensaje de "No se ha definido Sub o Function" si le doy al play para probar la macro o salgo de ella.

2)

Agradezco mucho tu tiempo y ayuda. ¿Quieres que te envíe el archivo para ver si localizas el error? Si es así dímelo de forma privada por favor.

Te dejo el archivo en dropbox

https://www.dropbox.com/s/ftxo57aor0sw2it/Aleatorio.xlsm?dl=0 

Puede ser que como dice el mensaje tengas las macros deshabilitadas, o te haga falta alguna referencia VBA.

En este archivo solo tienes que copiarle los formatos de tu archivo y ya lo tendras

Hola de nuevo y disculpa por mi reiteración, pero llevo una semana haciendo pruebas para intentar implantar tu código en mi hoja y que se pueda usar el botón que tengo creado y no soy capaz. Mis leves conocimientos no me lo permiten y estoy casi desesperado. ¿Podrías por favor echarle un vistazo y decirme qué hago mal? Te dejo copia del archivo. Gracias.

https://www.dropbox.com/s/xqsh8sqmv2qs0sm/MENTAL%20MATH2.xlsm?dl=0 

A mi me funciona perfecto este:

https://www.dropbox.com/s/sudy6vip5uswuvm/MENTAL%20MATH3.xlsm?dl=0 

Mira que tengas estas referencias seleccionadas

Sí tengo las opciones seleccionadas. Me he fijado que en el archivo que me has devuelto las operaciones del día martes salen bien, sin decimales. Pero en el jueves habría que poner decimales. ¿Qué debo cambiar? Muchas gracias por tu tiempo.

Traté el jueves con la misma operativa del martes, pero son diferentes. Lo he visto cuando he tenido el fichero, por eso deberás cambiar

 'CUADRO DEL JUEVES
        Do
        Range("I" + Trim(Str(i))).Value = Int(x * Rnd()) + 1
        Range("J" + Trim(Str(i))).Value = Int(x * Rnd()) + 1
        numero = Range("I" + Trim(Str(i))).Value
        divisor = Range("J" + Trim(Str(i))).Value
        Loop Until numero Mod divisor = 0
        Range("K" + Trim(Str(i))).Value = Int(x * Rnd()) + 1

por

        'CUADRO DEL JUEVES
        Do
        Range("I" + Trim(Str(i))).Value = Int(x * Rnd()) + 1
        Range("J" + Trim(Str(i))).Value = Int(x * Rnd()) + 1
        Range("K" + Trim(Str(i))).Value = Int(x * Rnd()) + 1
        numero = Range("I" + Trim(Str(i))).Value * Range("J" + Trim(Str(i))).Value
        divisor = Range("K" + Trim(Str(i))).Value
        Loop Until numero Mod divisor = 0

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas