Hojas de cálculo en Excel - página principal

Volviendo con los números aleatorios

Hoy os presento una chorradilla para generar apuestas aleatorias del tipo lotería primitiva, bonoloto, y lotería 6/49. Con esta sencilla aplicación, podréis generar una serie de combinaciones aleatorias, de 6 números, dentro de un rango de 49 cifras (del 1 al 49).

En esta aplicación, veréis el uso de fórmulas a las que llamamos desde un macro. Para poneros un ejemplo, podemos generar un número aleatorio entre 1 y 49, y directamente desde excel (no desde VBA), poniendo la siguiente fórmula:


=REDONDEAR.MAS(ALEATORIO()*49;0)

Si queremos incluir esa fórmula en nuestros macros, es decir, desde VBA, tendremos que convertirla a su formato inglés, y para que nos quede algo como esto:

ActiveCell = "=ROUNDUP(RAND()*49,)"

Generar números aleatorios se puede hacer de muchas formas, y en una entrega anterior ya vimos como hacerlo. El código para generar los números aleatorios, implementando las fórmulas propias de excel, dentro de un proyecto VBA sería el siguiente:

Sub Auto_close()
On Error GoTo Fin
'Desactivamos las teclas de cancelación de macros
Application.EnableCancelKey = xlDisabled
'Ocultamos los pasos que efectúa el procedimiento
Application.ScreenUpdating = False
'Desprotegemos la hoja
ActiveSheet.Unprotect
'Borramos la última combinación mostrada,
'y el resto de elementos que utilizamos

Range("I4,C14,C17,C18,D15:I15").ClearContents
Range("C15").Select
'Eliminamos la decoración donde
'tenemos los números ordenados

Selection.Borders(xlEdgeLeft).LineStyle = xlNone
Selection.Borders(xlEdgeTop).LineStyle = xlNone
Selection.Borders(xlEdgeBottom).LineStyle = xlNone
Selection.Borders(xlEdgeRight).LineStyle = xlNone
Selection.Interior.ColorIndex = xlNone
Windows.Arrange ArrangeStyle:=xlCascade
Range("K6").Select
'Protegemos la hoja
ActiveSheet.Protect
'Guardamos el fichero
ActiveWorkbook.Save
'Mostramos los pasos que efectúa el procedimiento
Application.ScreenUpdating = True
Fin:
End Sub


Sub Calcular_numeros()
On Error GoTo Fin
'Desactivamos las teclas de cancelación de macros
Application.EnableCancelKey = xlDisabled
'Ocultamos los pasos que efectúa el procedimiento
Application.ScreenUpdating = False
ActiveSheet.Unprotect
'Si llevamos 5 combinaciones
'(las apuntamos en la celda I4,
'dándole color blanco al dato)...

If Range("I4") = 5 Then
'Mostramos un mensaje
MsgBox (Chr(13) + " ¿A qué estás jugando?. Ya te he dado 5 " _
+ Chr(13) + " combinaciones distintas. ...Bueno, como " _
+ Chr(13) + " tengo un alma piadosa, te voy a dar más " _
+ Chr(13) + " combinaciones (hasta que te canses, o " _
+ Chr(13) + " hasta que me canse yo, que será lo más " _
+ Chr(13) + " probable, si sigues a este ritmo). " _
+ Chr(13) + Chr(13) + " Dale al botón de aceptar, y te doy la 6ª " _
+ Chr(13) + " combinación... " _
+ Chr(13) + Chr(13)), vbOKOnly, " ¿ESTAMOS DE CACHONDEO?"
End If
'Si llevamos 10 combinaciones...
If Range("I4") = 10 Then
'Mostramos un mensaje
MsgBox (Chr(13) + " Que plasta que eres... " _
+ Chr(13) + Chr(13) + " Ya te he dado 10 combinaciones distintas. " _
+ Chr(13) + " Bueno, vamos con la 11ª combinación... " _
+ Chr(13) + Chr(13)), vbOKOnly, " ¿ESTAMOS DE CACHONDEO?"
End If
'Si llevamos 20 combinaciones, cerramos la aplicación...
If Range("I4") = 20 Then
'Mostramos un mensaje
MsgBox (Chr(13) + " Ya te he dado 20 combinaciones. " _
+ Chr(13) + " Te has hecho tan plasta, que ya " _
+ Chr(13) + " me he cansado. " _
+ Chr(13) + Chr(13) + " Cerramos la paradita... " _
+ Chr(13) + Chr(13)), vbOKOnly, " ¿ESTAMOS DE CACHONDEO?"
Range("I4,C14,C17,C18,D15:I15").ClearContents
Range("C15").Select
'Eliminamos la decoración donde
'tenemos los números ordenados

Selection.Borders(xlEdgeLeft).LineStyle = xlNone
Selection.Borders(xlEdgeTop).LineStyle = xlNone
Selection.Borders(xlEdgeBottom).LineStyle = xlNone
Selection.Borders(xlEdgeRight).LineStyle = xlNone
Selection.Interior.ColorIndex = xlNone
Windows.Arrange ArrangeStyle:=xlCascade
Range("K6").Select
'Protegemos la hoja
ActiveSheet.Protect
'Guardamos el fichero
ThisWorkbook.Save
'Cerramos el fichero
ThisWorkbook.Close
End If
'Primer número a calcular
Range("D15").Select
ActiveCell = "=ROUNDUP(RAND()*49,)"
'Copiamos y pegamos el valor
Range("D15").Copy
Selection.PasteSpecial Paste:=xlValues
'Segundo número a calcular
Range("E15").Select
ActiveCell = "=ROUNDUP(RAND()*49,)"
Do While Range("E15") = Range("D15")
ActiveCell = "=ROUNDUP(RAND()*49,)"
Loop
'Copiamos y pegamos el valor
Range("E15").Copy
Selection.PasteSpecial Paste:=xlValues
'Tercer número a calcular
Range("F15").Select
ActiveCell = "=ROUNDUP(RAND()*49,)"
Do While Range("F15") = Range("D15") _
Or Range("F15") = Range("E15")
ActiveCell = "=ROUNDUP(RAND()*49,)"
Loop
'Copiamos y pegamos el valor
Range("F15").Copy
Selection.PasteSpecial Paste:=xlValues
'Cuarto número a calcular
Range("G15").Select
ActiveCell = "=ROUNDUP(RAND()*49,)"
Do While Range("G15") = Range("D15") _
Or Range("G15") = Range("E15") _
Or Range("G15") = Range("F15")
ActiveCell = "=ROUNDUP(RAND()*49,)"
Loop
'Copiamos y pegamos el valor
Range("G15").Copy
Selection.PasteSpecial Paste:=xlValues
'Quinto número a calcular
Range("H15").Select
ActiveCell = "=ROUNDUP(RAND()*49,)"
Do While Range("H15") = Range("D15") _
Or Range("H15") = Range("E15") _
Or Range("H15") = Range("F15") _
Or Range("H15") = Range("G15")
ActiveCell = "=ROUNDUP(RAND()*49,)"
Loop
'Copiamos y pegamos el valor
Range("H15").Copy
Selection.PasteSpecial Paste:=xlValues
'Sexto número a calcular
Range("I15").Select
ActiveCell = "=ROUNDUP(RAND()*49,)"
Do While Range("I15") = Range("D15") _
Or Range("I15") = Range("E15") _
Or Range("I15") = Range("F15") _
Or Range("I15") = Range("G15") _
Or Range("I15") = Range("H15")
ActiveCell = "=ROUNDUP(RAND()*49,)"
Loop
'Copiamos y pegamos el valor
Range("I15").Copy
Selection.PasteSpecial Paste:=xlValues
Application.CutCopyMode = False
'Ordenamos la combinación, de menor a mayor
'escribiendo algunas cosillas en unas celdas

Range("C14") = "Números ordenados"
Range("C17") = "La combinación no se guardará,"
Range("C18") = "aunque grabes el archivo."
'Seleccionamos los números de la combinación
Range("D15:I15").Select
'Ahora sí, los ordenamos
Selection.Sort Key1:=Range("D15"), Order1:=xlAscending, Header:=xlGuess, _
OrderCustom:=1, MatchCase:=False, Orientation:=xlLeftToRight
'Generamos un color aleatorio,
'para la celda C15

Range("C15").Select
Randomize
With Selection.Interior
.ColorIndex = Int((56 - 1 + 1) * Rnd + 1)
.Pattern = xlSolid
End With
With Selection.Borders(xlEdgeLeft)
.LineStyle = xlContinuous
.Weight = xlThin
.ColorIndex = 48
End With
With Selection.Borders(xlEdgeTop)
.LineStyle = xlContinuous
.Weight = xlThin
.ColorIndex = 48
End With
With Selection.Borders(xlEdgeBottom)
.LineStyle = xlContinuous
.Weight = xlThin
.ColorIndex = 48
End With
With Selection.Borders(xlEdgeRight)
.LineStyle = xlContinuous
.Weight = xlThin
.ColorIndex = 48
End With
'Sumamos 1 combinación a las ya existentes
Range("I4") = Range("I4") + 1
Range("K6").Select
'Protegemos la hoja
ActiveSheet.Protect
'Mostramos los pasos que efectúa el procedimiento
Application.ScreenUpdating = True
Fin:
End Sub

Desde aquí podéis descargar el fichero de excel, con todo el código que os presento en este artículo.



13 comentarios:

Anónimo dijo...

QUE BUENA ONDA LO VOY A PROBAR GRACIAS POR EL APORTE, AUNQUE SINENDO REALISTA ES CASI IMPOSIBLE PERO CON PROBAR NO SE PIERDE NADA

Javier Marco dijo...

La suerte es aleatoria,como el caos :-)

Anónimo dijo...

Hace algunos días intenté averiguar si 50.000 combinaciones diferentes de la Primitiva serían "rentables" y las realicé prácticamente a mano.
Al ver tu ejemplo, lo he integrado en una sentencia For, que me permite hasta 32.000 ciclos distintos.
Es curioso que, en 32.000 combinaciones diferentes, se repitan alrededor de 15.
Imagino que la función Aleatorio() de Excel no es tan aleatoria como parece, o es que realmente existen combinaciones mas probables que otras.

Javier Marco dijo...

No creo que te hagas rico apostando por esa combinación que te ha salido en 15 ocasiones ;-)

Las probabilidades de que salga otra combinación son las mismas.

Si los informáticos de Microsoft no nos han engañado, la función Aleatorio() lo que hace es precisamente eso, mostrar un número de manera aleatoria. Sinceramente, no creo que quepa la "manipulación" humana.

Anónimo dijo...

hola que tal me podrias ayudar tengo una duda quiero hacer un formulario donde tenga un combobox que tiene como items (renta1,renta2,etc) y cuento con varios cuadro de texto donde capturo informacion como (ram, disco duro, sistema operativo) y quiero que cuando en el combobox seleccione renta 1 capturar los datos (llenar los cuadro de texto) y con un boton llene los captos de excel las columnas que tengo son

PC - Ram - DD - SO
renta1 1gb 80gb xp
renta2 2gb 120gb xp

algo asi estan mis columnas en excel
Bueno espero me puedas ayudar, gracias.
mx.cesar@gmail.com

ElProfe dijo...

Javier:
Muy práctica y divertida tu propuesta. Piendo que en general es adaptable a cualquier lotería tipo baloto 4/XX; 5/XX ó 5/XX(Flalottery.com, Megamillions.com, Superball.com, Baloto.com, etc), con solo cambiarle las variables de cada caso. Incluso, guardadas las proporciones claro está, hice algo parecido para Fantasy5 (de la Florida,USA - http://flalottery.com/inet/games-fantasy5Main.do) y aunque no he ganado, me entretiene!

Pero mi inquietud es otra.

Como veo que utilizas la función:
=REDONDEAR.MAS(ALEATORIO()*49;0)
Mi pregunta es, esta función es equivalente a =ALEATORIO.ENTRE(1;49) ? Si se quisiera utilizar esta última función en su equivalente en código VBA, cua sería el código?

Me gustaría mucho enviarte mi archivo con la trivia para Fantasy5, solo para que lo vieras, pero no se como o a donde hacerlo.

Gracias por tu atención y tu tiempo.

Saludos desde Colombia

Juan M. Beltrán V.

Anónimo dijo...

Muy bueno el aporte
a mi me da vueltas como lo haces para que eliga los numeros entre 1;49 que estan por decirlo asi en el voleto lo demas lo entiendo pero como lo haces para que elija los numeros con colores y eso GRACIAS de antemano se lo explicas

Javier Marco dijo...

Me alegro que hayas descubierto que en el código no está todo ;-)

Los números de colores (la celda, mejor dicho), se obtienen a través del formato condicional. Desprotege la hoja (Herramientas --> Proteger --> Desproteger hoja).

A continuación, sitúate encima de cualquiera de los 49 números que aparecen, y ve a Formato --> Formato condicional. Así verás que hay una fórmula que está diciendo que si el número de esa tabla (uno de esos 49 números), es igual al número que aparece abajo, una vez se ordenan los 7 números obtenidos, entonces que lo ponga con el fondo de la celda de color amarillo.

Un saludo.

Anónimo dijo...

hola tengo que hacer un ejercicio de la bonoloto como el que aparece aqui. lo que pasa que necesito una formula para que no se repitan los numeros cuando le das a f9 te salgan numeros distintos. espero que alguien me entienda lo que quiero decir y me ayude un saludo mi email es bren92@hotmail.es gracias

Javier Marco dijo...

Aquí lo tienes explicado con un macro: Números aleatorios no repetidos.

Elvis Caballero M. dijo...

Hola,

Muy bueno tu blogger, te cuento que estoy haciendo una cotizacion de ventas, pero he tenido algunos problemas con traspasar los datos de la plantilla a una base de datos para despues poder modificarlas, consultarlas y cambiarle el estado, es decir las cotizaciones que son aceptadas pasen a nota de ventas y las que no queden en estado pendiente y pueda ingresar el por que? estan pendientes.

quiero un historial anual de esta gestion de ventas.

espero me puedas aconsejar o si tienes algo que me pueda ayudar.

saludos,

diego

Anónimo dijo...

no funciona igual la siguiente instrucción?
número=int((rnd*49)+1)
Yo siempre he usado esta, a ver si no me he hecho millonario por culpa de microsoft...

Anónimo dijo...

Saludos, tengo una pregunta ¿Es posible adherir al ejercicio algunas restriciones? comono incluir numeros que salen muy poco, como que la sumatoria de los numeros esten en un rango determinado.
Es posible?
Gracias
wmedina