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:
QUE BUENA ONDA LO VOY A PROBAR GRACIAS POR EL APORTE, AUNQUE SINENDO REALISTA ES CASI IMPOSIBLE PERO CON PROBAR NO SE PIERDE NADA
La suerte es aleatoria,como el caos :-)
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.
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.
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
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.
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
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.
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
Aquí lo tienes explicado con un macro: Números aleatorios no repetidos.
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
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...
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
Publicar un comentario