Elenco random



  • Elenco random
    di Pierpaolo (utente non iscritto) data: 05/06/2013 15:42:45

    Ciao a tutto il forum. Ho un elenco di nomi nelle celle A2:A21. Come li posso inserire in maniera random tutti e 20 nomi nelle celle C2:D11?



  • di Mister_x (utente non iscritto) data: 05/06/2013 23:53:41

    ciao

    vista la tua richiesta , la prima cosa che mi e' venuta in mente e' stata di adattare ai tuoi dati
    una vecchia sub() di random numerici che si era creata molto tempo fa,non mi ricordo per quale motivo
    comunque guarda il file allegato se ti puo' essere utile la soluzione che ho adottato
    si intende che la colonna dove vedi i numeri la puoi nascondere

    ciao da Mister_x







  • di Pierpaolo (utente non iscritto) data: 06/06/2013 07:15:48

    Innanzitutto grazie del file. Io però ho già un elenco di nomi nelle celle A2:A21 che dovrei inserire in maniera random tutti e 20 nomi nelle celle C2:D11.



  • di Vecchio Frac data: 06/06/2013 09:00:42

    @Pierpaolo
    Cos'ha che non va la soluzione di mister_x? Funziona perfettamente secondo la richiesta.
    Ha ricostruito lo stesso scenario che hai indicato, con gli stessi riferimenti.
    Devi solo copiare il codice (che si trova nel Foglio1) nel tuo file.


    @mister_x
    Prima o poi ti farò un minicorso su come si scrive codice indentato per migliorarne la leggibilità ^_^







  • di Vecchio Frac data: 06/06/2013 09:42:28

    In ogni caso il metodo più veloce in assoluto di estrarre dei numeri è mettere tutti gli elementi in una Collection (monodimensionale e non casuale), quindi generare un numero random fra 1 e Collection.Count ed estrarre/rimuovere l 'elemento con quell'indice dalla Collection, il tutto finchè Collection.Count > 0.

    In questo caso ho ottimizzato ulteriormente perchè invece di aspettare di aver esaurito tutti gli indici (estraendo quindi casualmente anche l'ultimo valore rimasto) eseguo l'operazione finchè non ci sono due elementi, quindi inserisco in destinazione direttamente l'ultimo rimasto.

     
    Sub DistribuisciUnivoci2()
    Dim miaColl As Collection, i As Long, riga As Long, v As Variant
    Const NumDaExtr = 20
        
        [M:M].ClearContents
        
        Randomize Timer
        Set miaColl = New Collection
        
        For i = 0 To NumDaExtr - 1
            miaColl.Add Chr(64 + i + 1), CStr(i + 1)
        Next
        
        riga = 1
        Do
            i = CLng(Rnd * (miaColl.Count - 1) + 1)
            Cells(riga, "M").Value = miaColl(i)
            miaColl.Remove i
            riga = riga + 1
        Loop Until miaColl.Count = 1
        Cells(riga, "M").Value = miaColl(1)
        
    End Sub






  • di Vecchio Frac data: 06/06/2013 09:43:50

    Errata corrige. Avevo fatto un test con le lettere dell'alfabeto. La modifica è banale.
     
    miaColl.Add i + 1, CStr(i + 1)






  • di Pierpaolo (utente non iscritto) data: 06/06/2013 11:37:13

    @Vecchio Frac
    Il file mi Mister_x non l'ho ancora visto, avevo scritto così in quanto lui diceva di numeri random mentre io ho una serie di valori precisamente 20 già inseriti manualmente. Questi 20 valori devono essere inseriti in maniera random nelle celle C2:D11. Appena posso vedrò il file allegato.



  • di Vecchio Frac data: 06/06/2013 12:05:52

    Ah, ok.
    Eccoti la modifica al codice ^_^
     
    'ricordati di dichiarare v all'inizio
    Dim v as variant 
    
    'e poi 'invece di:
    '    For i = 0 To NumDaExtr - 1
    '        miaColl.Add Chr(64 + i + 1), CStr(i + 1)
    '    Next
    
    'sostituisci questo:
        For Each v in [A2:A21]
            miaColl.Add v, cstr(v)
        Next






  • di Mister_x (utente non iscritto) data: 06/06/2013 15:06:51

    ciao

    visto che non ti piace con i numeri ti allego una sub() che tratta sia numeri che dir si voglia in colonna A2:A21 e li scrive ramdom da C2:D11 senza bisogno di colonna di appoggio

    da mettere nel foglio1 o altro foglio

    ciao da Mister_x

    PS Spero che V.F. in questo modo la sub() come e' scritta piaccia, perche' quando faccio qualche cosa e' sempre tardi e ho fretta, Per i commenti mi sto attrezzando a inserirli
     
    Sub Copie_univoche()
    Dim i As Long, indice As Long
    Dim Lst  As New Collection
     Application.ScreenUpdating = False
        Randomize
    ''''''
       For i = 2 To 21
          Lst.Add Cells(i, 1)
       Next i
    ''''''''''
       For i = 2 To 21
         indice = Int(((21 - i) * Rnd) + 1)
           If i <= 11 Then
             Cells(i, 3) = Lst(indice)
           Else
             Cells(i - 10, 4) = Lst(indice)
           End If
         Lst.Remove (indice)
       Next i
     Set Lst = Nothing
     Application.ScreenUpdating = True
    End Sub
    






  • di Vecchio Frac data: 06/06/2013 16:05:03

    cit. "quando faccio qualche cosa e' sempre tardi e ho fretta"
    ---> Santa polenta, non dirlo a me... questo è un periodo di stress molto intenso ^_^





  • di Mister_x (utente non iscritto) data: 06/06/2013 17:09:13

    Per PierPaolo

    intanto che stavo facendo un altro lavoro, mi sono accorto di un errore nel coclo for , se intendi utilizzare questa soluzione devi sostituire tutti e (( tre i valore 21 con 22 ))altrimenti l'ultimo nominativo lo mette sempre per ultimo essendo questi considerato nella collection all'ultimo posto e non preso a random quindi dando anche un valore nullo per ultimo prende in considerazione anche il 20 valore

    ciao da Mister_x





  • di Pierpaolo (utente non iscritto) data: 06/06/2013 21:45:21

    Il file allegato random l'ho provato e mi sa che va bene. Che differenza c'è tra quello e le 2 sub che avete postato?



  • di Mister_x (utente non iscritto) data: 07/06/2013 09:48:56

    ciao

    per farti capire le differenze ti posto il file con le tre soluzioni che vedrai applicate nei vari fogli
    1 foglio la sub() crea una lista di numeri in colonna M:M e pio con le formule di excel ricava i dati da colonna A2:A21 e li posiziona in C2:D11 quindi adotta una colonna di appoggio
    2 foglio sempre la mia sub() ma differente della prima la quale usa Collettion per creare una lista che la prende da A2:A21 e la posiziona subito Random in C2:D11 , quindi in questo caso tutto quallo che scrivi in A2:A21 viene creato random C2:D11
    3 foglio, la sub() di V.F. , questa con le modifiche che ti ha consigliato fa lo stesso lavore della mia 2 , mettendo in colonna M:M tutto quello che tu scrivi in A2:A21 random, quindi manca la parte di scrittura per inserirli in C2:D11, non e' che questa manca ma bisogna crearla togliendo la scrittura in colonna M:M e portarla in C2:D11, quindi con delle prove da parte tua e con esempi che hai nelle altre sub() sta a te modificare questa

    PS come vedi le soluzioni sono tante sta a te usarle

    ciao da Mister_x







  • di Pierpaolo (utente non iscritto) data: 07/06/2013 10:02:04

    OK, perfetto, mi a bene la seconda sub.