Lo scopo che voglio raggiungere è il seguente. Ho un foglio di lavoro con una serie di nomi (uno per riga) e ad ogni nome una colonna associa una città di provenienza. In un altro foglio vorrei avere una colonna con tutte le città citate nel primo foglio e vicino il numero di volte che tale città ricorre. E fin qua non ci sono problemi. La difficoltà sta nel fatto che le città non sono statiche ma possono aggiungersene via via, quindi ad ogni lancio della macro devo controllare che nella lista di città presenti nel foglio 2 siano citate tutte quelle presenti nel foglio 1 ed eventualmente aggiunge le città nuove non ancora presenti. Ulteriore ostacolo il fatto che di colonne con il numero di ricorrenze nel foglio 2 ce ne siano una per settimana (una sorta di storico) e che quindi debbano mantenersi le associazioni tra le colonne per non scompaginare i riferimenti numero - città.
Il problema della lentezza è associato proprio al controllo delle città presenti nel foglio 1 e 2 in quanto il conteggio delle ricorrenze con la funzione conta.se è immediata. La macro lenta, anche se perfettamente funzionante, che ho fatto per ora fa così. Controlla che il contenuto di ogni singola cella della colonna città del foglio 1 sia presente anche nel 2. Se lo trova passa alla cella successiva altrimenti la aggiunge in fondo alla lista. E' un doppio ciclo che semplificato fa così:
- Codice: Seleziona tutto
For cella_foglio1 = 1 to ultima_cella_foglio1
contenuto_cella_f1 = Cells(cella_foglio1, 2).Value
Sheets("Foglio2").select
ultima_cella_foglio2 = Range("A65536").End(xlUp).Row
For cella_foglio2 = 1 to ultima_cella_foglio2
contenuto_cella_f2 = Cells(cella_foglio2, 1).Value
if contenuto_cella_f2 = contenuto_cella_f1 Goto prossima
else
endif
Next
{scrive il contenuto della cella_foglio1 che non ha trovato nella lista di quelle già esistenti}
prossima:
Sheets("Foglio1").select
Next
Come potete vedere il ciclo controlla ogni cella presente nel foglio 1 anche se il suo contenuto è uguale ad altre già controllate (es. se la colonna riportasse 400 volte Città_A il ciclo controllerebbe comunque 400 volte se tale città è presente nel foglio 2).
Per ottimizzare un po' il tutto avevo pensato di affrontare la cosa in un altro modo ma mi mancano le basi teoriche per sapere se è possibile ed eventualmente come. La logica sarebbe: controllo il termine Città_A quante volte ricorre nella colonna del foglio 1. Per ogni ricorrenza inserisco il numero della cella doppia in una variabile tipo matrice (esiste?). Il controllo sulla cella successiva viene fatto solo se il suo numero non è presente in questa variabile matrice, altrimenti passa alla cella successiva e così via, continuando ad inserire nella stessa variabile matrice tutti i doppioni trovati nei controlli.
Se sapete aiutarmi su questa strada o avete suggerimenti differenti fatevi avanti.
Grazie in anticipo!
Ocimin