Estrazione senza ripetizione



  • Estrazione senza ripetizione
    di Flaco27 data: 30/08/2016 00:13:16

    Ciao a tutti,
    Necessito di estrarre casualmente un nome alla volta da un elenco, ripetendo tale operazione. fin qui tutto bene, ma mi interesserebbe che i valori estratti non siano più disponibili.
    In altre parole, che i valori non siano estraibili più di una volta



  • di Cucù data: 30/08/2016 09:00:11

    Oltre al fatto che manca il file di esempio... le informazioni che fornisci non sono sufficienti a parer mio per poterti rispondere...
    In particolare devi chiarire se una volta estratto il valore, questo non deve essere più disponibile anche nelle aperture successive del file oppure se si deve azzerare il tutto ed ad ogni apertura si riparte da zero?
    Una volta terminati i valori da estrarre come si deve comportare il codice?
    Cucù



  • di Flaco27 data: 30/08/2016 10:28:06

    Intanto grazie per l'interessamento

    La chiusura del file non è un problema, nel senso che lo chiuderò una volta terminata l'estrazione senza la necessità di riprenderla. Al termine dei nomi non avrei bisogno di nulla in particolare, chiuderei il file una volta sorteggiati tutti i valori.

    Io ho utilizzato una formula per l'estrazione, ma non è vincolante...andrebbe benissimo anche una formula (o una macro) unica per le due operazioni (estrazione e cancellazione del valore estratto).
    Allego un file di prova perchè quello di riferimento è pesantuccio.



  • di Vecchio Frac data: 30/08/2016 11:45:08

    Ci sono diverse tecniche per l'estrazione non ripetuta in un range.
    Ne allego una.
    Si può usare come function separata per ottenere una lista di numeri non ripetuti che corrispondono alla posizione del nome da estrarre.

    u = genera_lista_univoca_from_to(1, 10) 'in 'u' l'indice dell'elemento da recuperare all'interno della lista
    For Each k In u
    debug.Print k
    Next
     
    Function genera_lista_univoca_from_to(min As Long, max As Long) As Variant
    Dim lista() As Long, i As Integer, J As Integer, r1 As Long, r2 As Long, tmp As Long
    'genera una lista di numeri casuali non ripetuti nel range specificato
    
        Randomize Timer
        ReDim lista(1 To max) As Long
        
        'genera la lista di numeri consecutivi tra min e max
        For i = min To max
            lista(i - min + 1) = i
        Next
        
        'quindi la disordina
        For i = 1 To 1000
            r1 = Int(Rnd * (max - min) + min)
            r2 = Int(Rnd * (max - min) + min)
            'swap
            tmp = lista(r1)
            lista(r1) = lista(r2)
            lista(r2) = tmp
        Next
    
        genera_lista_univoca_from_to = lista()
    
    End Function






  • di patel data: 30/08/2016 19:07:13

    Ho utilizzando il codice di VF, vedi allegato MescolaEstraeToglie, non elimina le righe  
     
    ' ----------- in modulo standard
    Global lista(), n As Long, max As Long
    Sub genera()
    With Sheets(1)
      prima = 4
      min = 1
      ultima = .Range("B" & .Rows.Count).End(xlUp).Row
      max = ultima - prima + 1
    End With
        n = 1
        Randomize Timer
        ReDim lista(1 To max)
        'genera la lista di numeri consecutivi tra min e max
        For i = min To max
            lista(i - min + 1) = i
        Next
        'quindi la disordina
        For i = 1 To 1000
            r1 = Int(Rnd * (max - min) + min)
            r2 = Int(Rnd * (max - min) + min)
            'swap
            tmp = lista(r1)
            lista(r1) = lista(r2)
            lista(r2) = tmp
        Next
        Sheets(2).Range("C2").ClearContents
    End Sub
    '------- in thisworkbook
    Private Sub Workbook_Open()
    genera
    End Sub
    ' ---------- nel modulo del foglio
    Sub CommandButton1_Click()
    If n > max Then
      MsgBox "Dati esauriti"
      Exit Sub
    End If
    Range("C2") = Sheets(1).Range("B" & lista(n) + 3))
    n = n + 1
    End Sub