071. Estrazione casuale valori da un elenco

Download PDF

Ci scrivono:

Buonasera, io dovrei estrarre, casualmente, da una colonna di 170 celle 40 celle. Mi potreste dare info su la funzione da utilizzare ? Grazie

<!–more–>

Risposta:

Dopo aver indicato nella cella D1 il numero di valori che voglio estrarre dal mio elenco
basta premere il bottone “ESTRAI” che esegue il seguente codice (commentato):

Public Sub EstraiCelleDaElenco()

Dim arr As New Collection
Dim i As Long
Dim IndiceCasuale As String

Dim DA_ESTRARRE As Integer
DA_ESTRARRE = Sheet1.Range("D1")


'---------------------------------------------------------------------------------------'
'Pulisco colonna dove estrarre i numeri

Sheet2.Select
Last_Row2 = Sheet2.Cells.Find("*", SearchOrder:=xlByRows, SearchDirection:=xlPrevious).Row

If Last_Row2 > 1 Then
   Sheet2.Range(Cells(2, 1), Cells(Last_Row2, 1)).ClearContents
End If
'---------------------------------------------------------------------------------------'

 
'Individuo ultima riga non vuota dell'elenco

MAX = Sheet1.Cells.Find("*", SearchOrder:=xlByRows, SearchDirection:=xlPrevious).Row
'Definisco intervallo inferiore (indice della prima riga contente i dati)
MIN = 2  'é la riga del primo elemento dell'elenco


'Ripeto il ciclo DO-LOOP fino a quando il numero di elementi contenuti nel vettore 'arr'
'è uguale al numero degli elementi da estrarre 'DA_ESTRARRE

Do Until arr.Count = DA_ESTRARRE
'estraggo un numero da inserire in un vettore
   IndiceCasuale = Int((MAX - MIN + 1) * Rnd + MIN)
'Se il numero fosse già presente nel vettore, non sarebbe possibile inserirlo e si genererebbe un errore.
'Ottengo quindi il risultato voluto (estrazione senza ripetizione)
'e faccio riprendere il ciclo
On Error Resume Next
arr.Add IndiceCasuale, IndiceCasuale

Loop
 

For i = 1 To arr.Count

'Ricalcolo l'ultima riga vuota del foglio in cui estrarre i dati
Last_Row2 = Sheet2.Cells.Find("*", SearchOrder:=xlByRows, SearchDirection:=xlPrevious).Row

'Copio nel foglio ESTRAZIONE i valori del foglio DATI
'utilizzando i numeri di riga casuali estratti precedentemente ed inseriti nel vettore arr
'di cui prendo gli gli elementi 'i' dal numero 1 all'ultimo arr.Count

 Sheet2.Cells(Last_Row2 + 1, 1) = Sheet1.Cells(arr(i), 1)

Next

End Sub

A voi il file:
APRI

Riccardo Vincenti

The following two tabs change content below.