Problemi con Randomize in VBA (MS Access)

di il
11 risposte

Problemi con Randomize in VBA (MS Access)

Buongiorno a tutti e scusate la mia ignoranza. Scrivo questo semplice codice per avere l'estrazione casuale senza ripetizioni dei numeri interi da 1 a 9; sulla “Finestra immediata” il risultato è corretto ma se provo a trasferire l'output su una tabella, su un vettore 9x1 o in altro modo ottengo sì 9 numeri ma con alcune ripetizioni. Potete aiutarmi? Grazie, Marco


Sub quadrato_rnd_CLICK()

'estrazione casuale dei numeri da 1 a 9

Dim estrazione As New Collection

Dim s As Integer

Dim i As Long

Dim z As Long

Dim k As Long

For s = 1 To 9

    estrazione.Add (s)

Next

z = estrazione.Count

For i = 1 To z

    Randomize

    k = Int((z) * Rnd + 1)

    Debug.Print estrazione.Item(k)

    estrazione.Remove (k)

    z = z - 1

Next

End Sub

 

11 Risposte

  • Re: Problemi con Randomize in VBA (MS Access)

    Questo codice funziona? Sì? E quindi qual è il problema? Non si capisce… 

  • Re: Problemi con Randomize in VBA (MS Access)

    Buongiorno oregon e buon 2024.

    Si, fin qui funziona, ma se provo a indirizzare i risultati, che nella finestra immediata vanno bene, ad es. con una msgbox, già riscontro che osservo nove numeri ma CON ripetizioni.


    Sub quadrato_Click()

    Dim estrazione As New Collection
    Dim s As Integer
    Dim i As Long
    Dim z As Long
    Dim k As Long
    Dim a As String

    For s = 1 To 9
       estrazione.Add (s)
    Next


    a = ""
    z = estrazione.Count


    For i = 1 To z
       Randomize
       k = Int((z) * Rnd + 1)
       Debug.Print estrazione.Item(k)
       a = a & " " & k
       MsgBox a
       estrazione.Remove (k)
       z = z - 1
    Next

    End Sub

  • Re: Problemi con Randomize in VBA (MS Access)

    Stai facendo un po' di confusione. Se scrivi 

    Debug.Print estrazione.Item(k)

    allora devi scrivere


       a = a & " " & estrazione.Item(k)

    altrimenti che senso ha?

    (Randomize non c'entra nulla col tuo problema)

  • Re: Problemi con Randomize in VBA (MS Access)

    Perfetto, mi ero incartato alla grande. Proseguo con le mie forze (ci provo…). Grazie !

  • Re: Problemi con Randomize in VBA (MS Access)

    Secon do me il 2° ciclo deve essere in Down e non in UP, in quanto quando rimuovi un Item dalla collection la generazione del Randomico deve essere per i soli Indici rimanenti e non per tutti…

    Quando inizi la Collection avrà 9 Items ed il RND sarà tra 1÷9, ma dopo che hai rimosso un Item, il socondo giro conterrà 8 Items quindi il Randomico deve essere generato da 1÷8 e così via man mano che generi e rimuovi…

    Questo ti evita di modificare lo Z all'interno del ciclo.

    For i = Z To 1 step -1
  • Re: Problemi con Randomize in VBA (MS Access)

    No, Alex , ho provato così e mi è andato in errore: 

    For i = z To 1 Step -1
       Randomize
       k = Int((z) * Rnd + 1)
       Debug.Print estrazione.Item(k)
       a = a & " " & estrazione.Item(k)
       MsgBox a
       estrazione.Remove (k)
       
    Next

    mentre la soluzione proposta con messaggio 20786 (Oregon) funziona bene. Un saluto.

  • Re: Problemi con Randomize in VBA (MS Access)

    Quando mi viene detto che non funziona e che genera errori in modo generico mi infastidisco molto…!

    Quello che hai scritto è ovvio dia errore non li trova gli ITEMS nella collection, devi restringere il campo del Random, e lo fai usando il Contatore non sempre il valore Massimo Iniziale… dai ragionaci bene.

    Questo codice invece funziona perfettamente senza alcun errore, basta scrivere:

    Function AAA()
    
        Dim estrazione As New Collection
        Dim s As Integer
        Dim i As Long
        Dim z As Long
        Dim k As Long
        Dim a As String
        
        For s = 1 To 9
           estrazione.Add (s)
        Next
        
        a = ""
        z = estrazione.Count
        
        
        For i = z To 1 Step -1
           Randomize
           k = Int((i) * Rnd + 1)
           Debug.Print estrazione.Item(k)
           a = a & " " & k
           'MsgBox a
           estrazione.Remove (k)
        Next
    
    End Function

    Puoi dirmi dove hai errori e quali….?

  • Re: Problemi con Randomize in VBA (MS Access)

    Allora mi spiego meglio: se utizzo il codice da te gentilmente postato ottengo nella Finestra Immediata il risoultato voluto,cioè i numeri da 1 a 9 estratti in maniera casuake ma senza ripetizioni (come in una iccola tombola); nella msgbox ottengo ancora nove numeri, ma alcuni di essi risultano ripetuti. Fammi sapere se mi sono spieggato bene. Di nuovo un saluto, m.

  • Re: Problemi con Randomize in VBA (MS Access)

    Di nuovo così

    a = a & " " & k

    hai scritto??

  • Re: Problemi con Randomize in VBA (MS Access)

    No, ho provato la soluzione che tu (Oregon) mi proponevi e ha funzionato perfettamente.

  • Re: Problemi con Randomize in VBA (MS Access)

    08/01/2024 - Faustinator ha scritto:


    Allora mi spiego meglio: se utizzo il codice da te gentilmente postato ottengo nella Finestra Immediata il risoultato voluto,cioè i numeri da 1 a 9 estratti in maniera casuake ma senza ripetizioni (come in una iccola tombola); nella msgbox ottengo ancora nove numeri, ma alcuni di essi risultano ripetuti. Fammi sapere se mi sono spieggato bene. Di nuovo un saluto, m.

    Secondo me non hai compreso bene il codice che hai scritto.

    Item(K) contiene il Numero Univoco, ma [a] ovviamente può essere ripetuto perchè scalando gli Indici il numero Totale cala man mano che li elimini dalla Collection e la possibilità di avere il doppione come Numero è ovvio, tuttavia quel valore di [a] non capisco a cosa ti serva… l'univocità del dato è nell'estrazione del valore dalla Collection non dell'indice di puntamento, che segue una logica differente ed a scarico dal memoento che elimini man mano gli Items già estratti….

    Se ti soddisfa il tuo codice… va bene.

Devi accedere o registrarti per scrivere nel forum
11 risposte