Condividi:        

ESTRAZIONE RANDOM DA ELENCO

Vuoi potenziare i tuoi documenti Word? Non sai come si fa una macro in Excel? Devi creare una presentazione in PowerPoint?
Oppure sei passato a OpenOffice e non sei sicuro di come lavorare al meglio?

Moderatori: Anthony47, Flash30005

Postdi realkaranka » 04/12/07 09:37

Adesso funziona perfettamente (avevo sbagliato a definire "Inizio").
Non l'avevo capito che la prima soluzione prevedeva qsta modalità di estrazione. Purtroppo solo adesso sto imparando a usare le macro... E' una cosa che faccio solo per cultura personale e penso che possa semplificare tantissime cose....

Qst file mi serve per il fantacalcio: l'anno prox vorrei fare l'asta utilizzando qst metodo. Adesso sarebbe carino inserire sul terzo foglio una cella grande dove man mano che premo un pulsante esce un nome nuovo (secondo il random ottenuto sul foglio "estratti")... Magari tutto ciò si potrebbe abbellire inserendo nel primo foglio ("sorgente") la squadra di appartenenza e altre info varie (ruolo, media passata stagione, ect). Si potrebbe poi fare un contatore che informa qnt giocatori devono essere ancora estratti...

Insomma le idee ci sono, aiutami a metterele in pratica...

Grazie ancora
realkaranka
Utente Junior
 
Post: 23
Iscritto il: 07/06/07 10:25

Sponsor
 

Postdi Anthony47 » 05/12/07 02:15

Da quello che dici mi pare che la soluzione di 10-15 gg fa sia piu’ adatta ai tuoi bisogni; ma forse e’ meglio che la provi tu.
Estraendo un numero alla volta, puoi inserire sul foglio3 una cella con la funzione OFFSET, con radice pari a “Inizio”, scarto verticale pari a Estratti!F4-1 e scarto orizzontale zero; questo ti da’ il nominativo dell’ estrazione corrente.

Per gli altri abbellimenti, man mano che hai difficolta’ fatti sentire.
Ciao.
Avatar utente
Anthony47
Moderatore
 
Post: 19196
Iscritto il: 21/03/06 16:03
Località: Ivrea

Postdi realkaranka » 05/12/07 10:36

Ho fatto come hai detto ma il problema è che un nome estratto viene riestratto (anche se la seconda volta si evidenzia in rosso). Vorrei che ciò con accadesse. Perchè con tanti nomi da estrarre può capitare infinite volte...
L'ideale secondo me è:
Con il pulsante della macro faccio l'estrazione, quindi nel foglio estratti ad ogni numero assegno un nome random del foglio sorgente;
Con un secondo pulsante nel terzo foglio leggo da b1 fino alla fine. Ogni volta che premo il bottone leggo prima b1, ripremo il bottone e leggo b2, poi b3 e così via (penso si possa fare con un istruzione FOR). In questo modo si può pure mettere un contatore per capire quanti nomi ci sono ancora da estrarre...

Se vuoi ti passo il file e vedi cosa non va (senza arrossire :) ) Te lo chiedo perchè non vorrei farti perdere più tempo di qll che ti ho già fatto perdere...
Se vuoi ci scambiamo l'indirizzo MSN, poi continuiamo la discussione qua per gli abbellimenti...
realkaranka
Utente Junior
 
Post: 23
Iscritto il: 07/06/07 10:25

Postdi Anthony47 » 06/12/07 01:56

realkaranka ha scritto:L'ideale secondo me è:
Con il pulsante della macro faccio l'estrazione, quindi nel foglio estratti ad ogni numero assegno un nome random del foglio sorgente;
Con un secondo pulsante nel terzo foglio leggo da b1 fino alla fine. Ogni volta che premo il bottone leggo prima b1, ripremo il bottone e leggo b2, poi b3 e così via (penso si possa fare con un istruzione FOR). In questo modo si può pure mettere un contatore per capire quanti nomi ci sono ancora da estrarre...
Non ho nulla in contrario, puoi procedere.

OPPURE leggi quello che ti scrivo e almeno ci provi, senza aspettare che qualche giorno dopo ti faccia io il riassunto.
In particolare ti rimando a quanto scrissi il 3-12, quando ti rimandavo a un messaggio di 10-15 gg prima: “questa richiesta corrisponde alla soluzione che ti proposi il 21-11 pomeriggio (con correzione/complemento il 22-11) etc etc”

Decidi tu come procedere.
Avatar utente
Anthony47
Moderatore
 
Post: 19196
Iscritto il: 21/03/06 16:03
Località: Ivrea

Postdi realkaranka » 12/12/07 11:53

Ho fatto come hai detto e in qst modo mi funziona... Solo che come t avevo già detto non mi piace! Perchè inserendo i numeri manualmente perderei molto tempo durante l'asta.

Come ti ho scritto qualche giorno fa:
Codice: Seleziona tutto
L'ideale secondo me è:
Con il pulsante della macro faccio l'estrazione, quindi nel foglio estratti ad ogni numero assegno un nome random del foglio sorgente;
Con un secondo pulsante nel terzo foglio leggo da b1 fino alla fine (come se fosse un conatatore che fa un shift in giù ogni volta che premo il pulsante). Ogni volta che premo il bottone leggo prima b1, ripremo il bottone e leggo b2, poi b3 e così via (penso si possa fare con un istruzione FOR). In questo modo si può pure mettere un contatore per capire quanti nomi ci sono ancora da estrarre...


Un mio amico ha già fatto qst programmino con C++ solo che io lo vorrei fare con Excel in maniera più funzionale.

Il programma funziona così:
- Ha un file .txt dove c'è l'elenco di nomi da estrarre;
- Comincia l'asta e ogni volta che preme invio esce un giocatore;
- Ha un contatore che gli dice quanti giocatori mancano alla fine d'asta;
- Un giocatore estratto non sarà più estratto

Lo vorrei fare con excel perchè in qst modo, posso aggiungere più informazioni quali squadra, media voto, goal passata stagione, ect... Inoltre posso abbellire il tutto con una bella interfaccia grafica...

Spero non sia impossibile
realkaranka
Utente Junior
 
Post: 23
Iscritto il: 07/06/07 10:25

Postdi Anthony47 » 12/12/07 15:18

Capisco.
Allora se vuoi fare in modo che a ogni pigiata di pulsante il numero estratto vada direttamente in coda agli altri, amplia la macro cosi’:

Codice: Seleziona tutto
Sub NuRand()
AncoRand:
NumRand = Int((Range("F1").value + 1) * Rnd)
If Application.WorksheetFunction.CountIf(Range("A1:A1000"), NumRand) > 0 Then GoTo AncoRand
Range("F4").value = NumRand
Range("A65536").End(xlUp).Offset(1, 0).Value = NumRand
Range("A65536").End(xlUp).Offset(0, 1).Value = Range("Inizio").Offset(NumRand, 0).Value
Range("F5").value= Range("Inizio").Offset(NumRand, 0).Value
End Sub


Il riferimento e’ al post del 21-11 e correzione/ampliamento del 23-11; con la variante che il numero estratto viene messo in F4 e il nominativo corrispondente in F5; poi numero e nominativo sono anche accodati direttamente in col. A e col. B.
A questo punto puoi usare il valore di F5 del foglio Estratti per visualizzare su altro foglio il nominativo estratto con tutti gli abbellimenti che servono.
Per quanto riguarda i contatori puoi usare le formule:
-per il numero totale di giocatori in elenco
Codice: Seleziona tutto
=CONTA.VALORI(SORGENTE!A:A)

-per il numero di giocatori gia’ estratti =
Codice: Seleziona tutto
CONTA.NUMERI(ESTRATTI!A:A)


Ciao.
Avatar utente
Anthony47
Moderatore
 
Post: 19196
Iscritto il: 21/03/06 16:03
Località: Ivrea

Postdi Anthony47 » 12/12/07 15:20

La seconda formula, ovviamente e'
Codice: Seleziona tutto
=CONTA.NUMERI(ESTRATTI!A:A)


Ri-ciao.
Avatar utente
Anthony47
Moderatore
 
Post: 19196
Iscritto il: 21/03/06 16:03
Località: Ivrea

Postdi realkaranka » 13/12/07 16:08

Fammi capire in qst modo ho 2 macro?

O devo aggiornare qlla di prima? In qst caso come sarebbe la macro completa?

ARI-GRAZIE :D
realkaranka
Utente Junior
 
Post: 23
Iscritto il: 07/06/07 10:25

Postdi Anthony47 » 14/12/07 01:53

Dunque...
Ti sono state presentate 2 soluzioni, puoi scegliere quella che preferisci:
-estrazioni una dopo l' altra; la macro e' Sub NuRand() come listata nel mio post del 12-12 (ne avevi avuta una versione precedente che ti lasciava l' onere di ricopiare il numero estratto in coda ai precedenti; questa versione accoda da sola).
-estrazioni tutte insieme; la macro e' Sub lavoratore() come listata nel mio post del 29-11.

Da quello che hai scritto nel recente passato ho capito che preferisci la prima, estrazioni una dopo l' altra; leggi sui vari post come implementarla e, ...se hai dubbi siamo qua.

Ciao.
Avatar utente
Anthony47
Moderatore
 
Post: 19196
Iscritto il: 21/03/06 16:03
Località: Ivrea

Postdi realkaranka » 14/12/07 09:43

A me piacerebbe una terza soluzione che le racchiude entrambe:

Estraggo tutti insieme e dopo che sono estratti (ho in colonna B tutto l'elenco disposto in maniera random) li leggo uno per uno con un ciclo for ad esempio). Anche in altri programmi excel che ho provato a fare mi piacerebbe avere una macro capace di scorrere una colonna. Come si fa?
es. in colonna b ho tutto l'elenco disposto casualmente (ottenuto dalla macro sub lavoratore -> leggo b1 -> premo il bottone (la mcro) situato in una cella qualsiasi del terzo foglio -> leggo b2 -> premo il bottone -> leggo b3 e così via.

facendo:

Codice: Seleziona tutto
=b1+1


così ovviamente non va... come posso fare?

p.s. anche se qst discussione sta diventando + lunga del previsto, sto imparando tanto e per qst ti ringrazio tanto
realkaranka
Utente Junior
 
Post: 23
Iscritto il: 07/06/07 10:25

Postdi Anthony47 » 14/12/07 22:17

L’ insistenza con cui chiedi “la terza via” mi fa pensare che non hai provato la prima (quella derivata dal post del 21-11 con le integrazioni successive; la macro NuRand, per intenderci). Perche’ se l’ avessi provata ti saresti accorto che la terza via fa esattamente la stessa cosa, ma in un modo piu’ contorto.

Ma non voglio bloccare la creativita’, quindi ti aggiungo le istruzioni per quello che manca.
Essenzialmente devi fare una macro che incrementa il contatore; io in genere uso una cella del foglio, diciamo la B1, poi la macro consiste solo nelle istruzioni
Codice: Seleziona tutto
If Range("B2").value >= Range("B1").value then Exit sub     'Tutti estratti
Range("B1").value= Range("B1").value +1


La sequenza assume che in B2 tu abbia inserito la formula per calcolare il numero totale di giocatori in elenco (per la formula, vedi mio post del 12-12), cosi’ la macro smette di incrementare quando tutti sono stati estratti.

Il contatore in B1 equivale al contatore degli estratti; lo puoi utilizzare quindi per leggere il nominativo dall’ elenco creato dalla macro “lavoratore” usandolo come “scarto di righe” in una formula che usi la funzione SCARTO.

Nell’ ipotesi che NuRand sia ancora di interesse per qualcuno, segnalo un errore: l’ istruzione giusta e’
Codice: Seleziona tutto
NumRand = Int((Range("F1").value) * Rnd)
invece che NumRand = Int((Range("F1").value + 1) * Rnd) pubblicata.

Ciao.
Avatar utente
Anthony47
Moderatore
 
Post: 19196
Iscritto il: 21/03/06 16:03
Località: Ivrea

Postdi realkaranka » 17/12/07 15:52

Ciao Anthony47,

allora vorrei fare il punto su qll che ho fatto fino ad adesso.

Ho creato 3 fogli:

1) Sorgente : nella colonna A ho inserito manualmente tutti i nomi che voglio estrarre. Ho definito "Inizio" la cella A1 per come mi hai spiegato tu. Poi nient'altro su qst foglio. Ne macro e ne funzioni.

2) Estratti : nella cella F1 ho:

Codice: Seleziona tutto
=COUNTA(Sorgente!A1:Sorgente!A21)-1


nella cella F4 ho:
Codice: Seleziona tutto
=INT(RAND()*F1+1)


Poi nella stesso foglio ho un pulsante a cui ho assegnato la macro "lavoratore" che ricordo è la seguente:
Codice: Seleziona tutto
Sub lavoratore()
FNomi = "Sorgente"      '<<<<< Foglio con i nominativi
FEstraz = "Estratti"    '<<<<< Foglio per le estrazioni

Sheets(FNomi).Select
TotNomi = Range("A65536").End(xlUp).Row - Range("Inizio").Row + 1
Sheets(FEstraz).Select
Range("A:B").ClearContents
For I = 1 To TotNomi
AncoRand:
NumRand = Int((TotNomi) * Rnd)
If Application.WorksheetFunction.CountIf(Range("A1:A1000"), NumRand) > 0 Then GoTo AncoRand
Range("A65536").End(xlUp).Offset(1, 0).Value = NumRand
Range("A65536").End(xlUp).Offset(0, 1).Value = Range("Inizio").Offset(NumRand, 0).Value
Next I
End Sub


Ogni volta che premo la macro faccio una nuova estrazione dei nomi inseriti sul foglio Sorgente.

3) NOMI : nella cella b1 ho:
Codice: Seleziona tutto
=COUNT(Estratti!A:A)


mentre nella cella b2 ho:
Codice: Seleziona tutto
=COUNTA(Sorgente!A:A)


poi ho fatto un altro bottone a cui ho inserito la macro:
Codice: Seleziona tutto
Sub Nomi()
If Range("B2").Value >= Range("B1").Value Then Exit Sub     'Tutti estratti
Range("B1").Value = Range("B1").Value + 1
End Sub


Questa in teoria dovrebbe essere la macro che mi scorre i nomi già estratti nel foglio "Estratti"

Dopo qst breve quadro ti chiedo ancora cosa manca? E soprattutto cosa sbaglio?
realkaranka
Utente Junior
 
Post: 23
Iscritto il: 07/06/07 10:25

Postdi Anthony47 » 17/12/07 20:24

realkaranka ha scritto:E soprattutto cosa sbaglio?

Col dovuto rispetto, l' errore principale che fai e' che a fronte di una soluzione funzionante (quella basata sulla macro NuRand; estrae uno ad uno fino alla fine, presenta in F5 l' estratto corrente pronto per tutti gli abbellimenti del caso) ne vuoi costruire una diversa senza avere ancora la padronanza delle funzioni di excel.
Altro errore che fai e' che invece di spendere il tempo a leggere i messaggi la butti la' e aspetti che siano gli altri a capire quello che hai fatto e quello che non hai fatto.

Nel caso specifico, NON HAI MESSO ANCORA la formula basata su SCARTO; le mie istruzioni in merito dicevano: "Il contatore in B1 equivale al contatore degli estratti; lo puoi utilizzare quindi per leggere il nominativo dall’ elenco creato dalla macro “lavoratore” usandolo come “scarto di righe” in una formula che usi la funzione SCARTO"

Ciao.
Avatar utente
Anthony47
Moderatore
 
Post: 19196
Iscritto il: 21/03/06 16:03
Località: Ivrea

Postdi realkaranka » 19/12/07 11:23

Il problema è solo uno: sono entrato in confusione totale...
Io leggo tutte le risposte ma non capisco più quale appartiene alla soluzione 1 e quale appartiene alla soluzione 2...

Poi non so usare la funzione OFFSET, non so nemmeno a cosa serve...

Posso usare la macro NuRand ma non so quale altre cose utilizzare della prima soluzione.

Se vuoi essere pasiente ancora per una volta, mi puoi fare un remake totale... Ti ricordo che ho il PC in inglese...
realkaranka
Utente Junior
 
Post: 23
Iscritto il: 07/06/07 10:25

Postdi Anthony47 » 20/12/07 12:50

Cvd
Ho usato il mio poco prezioso tempo per incollarti tutte le istruzioni gia’ date sulla soluzione “Nurand”, quella che ti estrae su foglio ESTRATTI uno ad uno (perche’ cosi’ avevi chiesto) tutti i giocatori, mettendoli in cella F5 e contemporaneamente in colonna B man mano che vengono estratti.
La cella F4 e la colonna A vengono usati per la generazione del numero random.


Su Foglio SORGENTE contiene l' elenco, da A2 in giu'; definisci "inizio" e formattazione condizionale come da messaggio precedente.
Sul foglio ESTRATTI, col A la lasci per i numeri estratti, la col B per i nominativi estratti
- In F1 ti calcoli quanti sono i nominativi con
Codice: Seleziona tutto
=CONTA.VALORI(SORGENTE!A:A)-1


Crei una macro che ti estrae in F4 un numero non ancora estratto, usando il codice che ti avevo gia' dato:
Codice: Seleziona tutto
Sub NuRand()
AncoRand:
NumRand = Int((Range("F1").value) * Rnd))
If Application.WorksheetFunction.CountIf(Range("A1:A1000"), NumRand) > 0 Then GoTo AncoRand
Range("F4").value = NumRand
Range("A65536").End(xlUp).Offset(1, 0).Value = NumRand
Range("A65536").End(xlUp).Offset(0, 1).Value = Range("Inizio").Offset(NumRand, 0).Value
Range("F5").value= Range("Inizio").Offset(NumRand, 0).Value
End Sub



Poi disegni un pulsante e ci associ la macro.


Il riferimento e’ al post del 21-11 e correzione/ampliamento del 23-11; con la variante che
-il numero estratto viene messo in F4 e il nominativo corrispondente in F5;
-poi numero e nominativo sono anche accodati direttamente in col. A e col. B.

A questo punto puoi usare il valore di F5 del foglio Estratti per visualizzare su altro foglio il nominativo estratto con tutti gli abbellimenti che servono.
Per quanto riguarda i contatori puoi usare le formule:
-per il numero totale di giocatori in elenco
Codice: Seleziona tutto
=CONTA.VALORI(SORGENTE!A:A)

-per il numero di giocatori gia’ estratti
Codice: Seleziona tutto
=CONTA.NUMERI(ESTRATTI!A:A)

Ricorda che devi definire sul foglio SORGENTE contenente i nominativi la cella “Inizio”: selezioni la prima cella con un nominativo, poi Menu /Inserisci /Nome /Definisci; nell’ area “Nomi ..” scrivi Inizio e confermi con Ok.

Per l’ inglese:
CONTA.NUMERI = COUNT
CONTA.VALORI = COUNTA
SCARTO = OFFSET
Menu /Inserisci /Nome /Definisci = Menu /Insert /Name /Define


Spero di esserti stato utile.
Avatar utente
Anthony47
Moderatore
 
Post: 19196
Iscritto il: 21/03/06 16:03
Località: Ivrea

Postdi realkaranka » 21/12/07 17:44

UTILISSIMO...

Ma purtroppo la macro mi da un messaggio di errore nella riga 3:

Codice: Seleziona tutto
NumRand = Int((Range("F1").value) * Rnd))


Cmq ti auguro un buon natale... Da domani sono in ferie...

Grazie mille
realkaranka
Utente Junior
 
Post: 23
Iscritto il: 07/06/07 10:25

Re: ESTRAZIONE RANDOM DA ELENCO

Postdi Anthony47 » 23/12/07 23:46

C' e' una parentesi tonda di chiusura di troppo, quindi l' istruzione ti rimane rossa per indicare l' errore di sintassi; cancellala e riprova.

Ciao.
Avatar utente
Anthony47
Moderatore
 
Post: 19196
Iscritto il: 21/03/06 16:03
Località: Ivrea

Re:

Postdi franceskinom » 07/11/12 17:27

Anthony47 ha scritto:Non ti sei fatto piu’ sentire, non so se perche’ hai risolto con un po’ di “applicazione” o ti sei offeso per l’ invito a provarci. Opterei per la seconda...
Comunque, nell’ illusione che arrossivi quando scrivevi “Se mi passi il file me lo posso studiare meglio” e “non posso dedicarci molto tempo perchè lavoro tutto il giorno” (noi che siamo ricchi di famiglia invece...), provo a darti qualcosa di piu’.
La macro da usare e’ la seguente:
Codice: Seleziona tutto
Sub lavoratore()
FNomi = "Sorgente"      '<<<<< Foglio con i nominativi
FEstraz = "Estratti"    '<<<<< Foglio per le estrazioni

Sheets(FNomi).Select
TotNomi = Range("A65536").End(xlUp).Row - Range("Inizio").Row + 1
Sheets(FEstraz).Select
Range("A:B").ClearContents
For I = 1 To TotNomi
AncoRand:
NumRand = Int((TotNomi) * Rnd)
If Application.WorksheetFunction.CountIf(Range("A1:A1000"), NumRand) > 0 Then GoTo AncoRand
Range("A65536").End(xlUp).Offset(1, 0).Value = NumRand
Range("A65536").End(xlUp).Offset(0, 1).Value = Range("Inizio").Offset(NumRand, 0).Value
Next I
End Sub


Procedura: da excel apri il vba editor con Alt-F11, poi Menu /Insert /Modulo; copia il codice e incollalo nel frame bianco di dx del vba editor.
Devi modificare le due istruzioni marcate <<<< con i nomi dei fogli del tuo file su cui sono presenti i nominativi e il foglio su cui vuoi avere i dati estratti; tieni presente che la macro per prima cosa AZZERA LE COLONNE A e B del foglio che dichiari per le estrazioni, quindi non sbagliare, e comunque fai prima 2 copie di backup del file di origine.

Poi torna su excel, sul foglio con i nominativi o su quello con le estrazioni a tua scelta, disegna un pulsante (lo trovi nella barra degli strumenti “Moduli”) e associagli la macro (ti verra’ proposto nel ciclo di creazione del pulsante). In questo modo bastera’ premere il pulsante per procedere all’ estrazione.
Ricorda che devi definire sul foglio contenente i nominativi la cella “Inizio”: selezioni la prima cella con nominativo, Menu /Inserisci /Nome /Definisci; nell’ area “Nomi ..” scrivi Inizio e confermi con Ok.
Se vuoi puoi anche inserire la formattazione condizionata, ma siccome devi estrare tutti questo mi sembra superfluo.

Certo di averti fatto cosa gradita... e comunque se hai ancora dubbi siamo qua.
Ciao.


PS: se invece non eri arrossito. . . beh, non sarebbe un problema nostro :-))


Anthony47...
della serie a volte ritornano...
io avrei una esigenza simile, un pelino più "lavorativa"... devo estrarre un nome a caso da una lista, evitando che il nome venga riestratto un successive estrazioni (perdona la ridondanza).
Sicuramente la soluzione indicata da te è valida, ma non appena seguo il tuo procedimento passo dopo passo, ma una volta inserita la macro e fatta partire mi dice che "l'indice non è inserito nell'intervalle" e mi segnala questa come riga di errore... Sheets(FEstraz).Select

sapresti aiutarmi in qualche modo?

grazie mille in anticipo!!!
franceskinom
Newbie
 
Post: 1
Iscritto il: 07/11/12 16:49

Re: ESTRAZIONE RANDOM DA ELENCO

Postdi Anthony47 » 08/11/12 15:37

Ciao franceskinom, benvenuto nel forum.
Se hai quel messaggio e' perche' non hai compilato correttamente la riga
FEstraz = "Estratti" '<<<<< Foglio per le estrazioni

Ricordo le istruzioni gia' date:
Devi modificare le due istruzioni marcate <<<< con i nomi dei fogli del tuo file [. . . ] su cui vuoi avere i dati estratti; tieni presente che la macro per prima cosa AZZERA LE COLONNE A e B del foglio che dichiari per le estrazioni, quindi non sbagliare, e comunque fai prima 2 copie di backup del file di origine.


Ciao
Avatar utente
Anthony47
Moderatore
 
Post: 19196
Iscritto il: 21/03/06 16:03
Località: Ivrea

Precedente

Torna a Applicazioni Office Windows


Topic correlati a "ESTRAZIONE RANDOM DA ELENCO":


Chi c’è in linea

Visitano il forum: Nessuno e 86 ospiti