Estrazione senza ripetizione
Hai un problema con Excel? 
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 |
Vuoi Approfondire?