Estrarre dati casuali da un elenco o tabella. (29/03/03) Trovo interessante segnalare un esercizio scaturito da una richiesta ricevuta : l'estrazione casuale di nomi, (propri, di città, di animali, di piante, ecc.ecc.), ma vale anche per l'estrazione di numeri. Mentre per i numeri la Funzione ROUND() è specifica, proprio perchè valori numerici, per i nomi (o comunque testo o date) bisogna creare un Indice (e quindi un numero) che identifichi un determinato valore in formato testo o data. Potremmo creare degli Array i quali restituiscono il valore dichiarato in funzione dell'indice rappresentato, ma sceglieremo una strada diversa, che ci consenta di poter modificare non solo il nostro testo come più ci piace, ma di decidere a piacere da quante parole sarà formato il nostro elenco. Useremo quindi o una sola colonna dove scrivere, riga dopo riga, le parole che vorremo randomizzare creando un elenco o tabella, oppure più righe e più colonne per avere una tabella ancora più ampia. In questo modo con il numero di riga e/o di colonna, avremo i nostri numeri da poter randomizzare. Vediamo quindi i passaggi dei due casi. Area posta su una sola colonna, la colonna A che è la prima
Set zona = ActiveSheet.UsedRange
x = zona.Rows.Count
quale = Int(x * Rnd) + 1
Y = Cells(quale, 1).Value
Per evitare la ripetitività nella sequenza dei valori restituiti dovremo
adoperare la funzione Randomize che utilizza
numero per inizializzare il generatore di numeri casuali della funzione
Rnd assegnandogli un nuovo valore. Se numero viene omesso, il valore
restituito dal timer di sistema verrà utilizzato come nuova base. E questa la routine:
Se invece la tabella sarà stata creata su più colonne, sempre supponendo di avere l'inizio elenco nella colonna A (la prima) avremo bisogno di contare anche da quante colonne è formata , sempre rintracciando la nostra area con l'UsedRange, con queste modifiche: z = zona.Columns.Count e di creare una casualità anche per le colonne, con: dove = Int(z * Rnd) + 1 e di reperire quindi un indice cella che oltre al numero di riga porterà anche il numero di colonna, con Y = Cells(quale, dove).Value ed alla fine la routine completa in questo caso sarà:
ATTENZIONE: tutte queste routine si basano su una tabella che inizi dalla riga 1 e dalla colonna A. La variabile Y identifica il numero di riga e di colonna generati dalla randomizzazione, e quindi numeri casuali compresi tra 1 e il numero di righe e di colonne che formeranno la nostra tabella. Poichè l'istruzione Cells (Cells(quale, dove).Value) usata su un foglio di lavoro inizia a contare dalla prima cella (la A1) per trovare la cella Y rappresentata dai valori quale e dove, SE LA TABELLA iniziasse dalla riga 3 e dalla colonna C (anch'essa la numero 3), avremo bisogno di aggiungere questi numeri (3 e 3) al numero indice che serve a generare il numero casuale. Il motivo di ciò è anticipato al punto con l'asterisco rosso (*) più sopra, e quindi le nostre istruzioni verrebbero modificate su queste due righe: quale = Int(x * Rnd)
+ 4 anzichè quale = Int(x * Rnd) + 1 Infatti, sempre rifacendo l'esempio delle 50 righe, avremmo bisogno di partire dalla riga 3, e quindi avremo 3 righe, + 1 per correggere l'indice zero, = 4. in questo modo otteniamo che se la randomizzazione del valore 50 (rappresentato da x) generasse zero, avremo 0 + 4 che indica la riga 3, se invece il numero casuale generato fosse 49 (limite superiore del valore 50 visto con inizio da zero), il numero di riga corrispondente sarebbe 53. Lo stesso vale per l'indice colonna se la colonna fosse la C.
Spero di essere stato sufficientemente chiaro.
|