Se puede hacer una lotería con macros o/y fórmulas

Necesito una macro que origine tanto resultados aleatorios como números que están en una sola columna y al originarlos se ubiquen en una columna para guardarlos

1 Respuesta

Respuesta
1

.

Pues, casi todo es posible.

Hay que ver cómo adaptarlo a lo que quieres.

Veamos:

Si los números de tu primera columna fuesen consecutivos puedes tomar los límites inferior y superior y colocar una fórmula -en, digamos, D4- como la siguiente:

=ALEATORIO.ENTRE(<minimo>;<máximo>)

A cada recálculo de la hoja, ese numero cambia:

Entonces un botón asociado al siguiente procedimiento puede generar un número en ese rango y luego pegarlo en una columna -por ejemplo, la F- consecutivamente, previo control de que no haya salido antes, en cuyo caso generaría otro.

Si estas de acuerdo con la idea, inserta un módulo en el editor de BVA y pega este código:

Sub Loteria()
'---- Variables modificables:
'=== JHON, modifica estos datos de acuerdo a tu proyecto:
Celdato = "D4" 'donde genera el número
col = "F" 'Columna donde acumula los datos. Al principio tendrá sólo el título
'---- fin Variables
'
'---- inicio de rutina:
'  
UltFila = Range(col & Rows.Count).End(xlUp).Row
RangoBusq = Range(col & "1", Range(col & UltFila)).Address
Genera:
ActiveSheet.Calculate
Buscar = Range(Celdato).Value
On Error Resume Next
Encontrado = ActiveSheet.Range(RangoBusq).Find(What:=Buscar, after:=[F1], LookIn:=xlValues, _
        LookAt:=xlWhole, SearchOrder:=xlByRows, SearchDirection:=xlNext, _
        MatchCase:=False, SearchFormat:=False).Address
If Len(Encontrado) > 0 Then
    GoTo Genera
Else
    MsgBox Buscar, , "NUMERO:"
    Range(col & UltFila + 1).Value = Buscar
End If
Err.Clear
On Error GoTo 0
End Sub

Y quedaría así:

Espero que sea lo que buscabas.

Abrazo

Fer

.

.

Buenas, de nuevo

Un paso más allá.

En caso de que tu lista de números no fuese consecutivos, y que la misma estuviera ubicada en la columna A, sólo deberías reemplazar la fórmula que te dí en la respuesta anterior por la que te indico ahora:

=INDICE(A2:A30000;ALEATORIO.ENTRE(1;CONTAR(A2:A30000)))

Como no sé cuántos numero tienes en esa columna, la fórmula los cuenta, suponiendo que fueran menos de 30000.

Considera lo del separador de argumentos, como siempre. Modifica los rangos de acuerdo a tu planilla tanto en esta fórmula como en la rutina de VBA.

Esta no varía con respecto a la que ya te pasé antes.

La formula se encarga de tomar los valores al azar y el procedimiento de VBA controla si ya salió o no.

Creo que así cubro todas tus expectativas, ¿verdad?

Si no, me avisas...

Abrazo

Fer

.

.

¿

¿Útil?

No la he podido ejecutar muy bien que digamos

.

Es curioso porque la rutina y la fórmula hacen exactamente lo que pedías.

De todos modos, si así no fuese, vuelva a consultarme indicando por qué no has podido ejecutarla.

Saludos

Fernando

.

Si los datos están en el rango "F1;U40" como seria la macro

.

Buenas, Jhon

Básicamente, no cambiaría porque lo que hace el "sorteo" es la fórmula:

En C4, o donde quieres que esté la fórmula coloca la siguiente:

=INDICE($F$1:$U$40;ALEATORIO.ENTRE(1;FILAS($F$1:$U$40));ALEATORIO.ENTRE(1;COLUMNAS($F$1:$U$40)))

La macro quedaría casi igual, excepto que deberías cambiar la columna donde acumular los resultados de la rutina, debido a que veo que F está ocupada por el rango de números.

(Que conste en acta que en tu pregunta original dijiste que tomaba los datos de una sóla columna)

Suponiendo que ahora los acumule en la columna A, la rutina sería esta:

Sub Loteria()
'---- Variables modificables:
'=== JHON, modifica estos datos de acuerdo a tu proyecto:
Celdato = "D4" 'donde genera el número
col = "A" 'Columna donde acumula los datos. Al principio tendrá sólo el título
'---- fin Variables
'
'---- inicio de rutina:
'  
UltFila = Range(col & Rows.Count).End(xlUp).Row
RangoBusq = Range(col & "1", Range(col & UltFila)).Address
Genera:
ActiveSheet.Calculate
Buscar = Range(Celdato).Value
On Error Resume Next
Encontrado = ActiveSheet.Range(RangoBusq).Find(What:=Buscar, after:=[A1], LookIn:=xlValues, _
        LookAt:=xlWhole, SearchOrder:=xlByRows, SearchDirection:=xlNext, _
        MatchCase:=False, SearchFormat:=False).Address
If Len(Encontrado) > 0 Then
    GoTo Genera
Else
    MsgBox Buscar, , "NUMERO:"
    Range(col & UltFila + 1).Value = Buscar
End If
Err.Clear
On Error GoTo 0
End Sub

Habrás notado que la rutina muestra un cartel con el número sorteado.

Si es para exhibirlo, podrías poner un zoom grande sobre él o sobre la celda donde queda el resultado en este caso D4:

Espero que ahora sí se lo que querías. Pero si no, vuelve a consultarme.

Saludos

Fernando

.

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas