Caricare una schiera senza duplicati
Hai un problema con Excel? 
Caricare una schiera senza duplicati
di marinoernestoch data: 15/02/2015 20:37:55
Buona sera.
Vi chiedo un suggerimento:
su un foglio, nella colonna B ho dei valori che si possono ripetere su più righe. Alcuni devo scartarli,
altri li devo trattenere per elaborazioni successive.
Le istruzioni allegate creano una schiera contenente i valori incontrati, ma una sola volta.
I altre parole, ogni valore (tra quelli non esclusi) viene ricercato nella schiera e, se non è ancora
presente, si allunga la schiera e poi viene caricato;
Quello che vi chiedo è se esistono istruzioni che facciano quanto mi serve, più velocemente di quanto ho scritto.
Anche la fase di esclusione che ho scritto mi sembra bruttina: anche per questa c'è qualche trucco ?
Sono sicuro che saprete suggerirmi soluzioni ottimali.
Grazie.
Sub una_sola_volta()
'
Dim chi_e() As String, conta As Integer, c_e As Boolean
conta = -1
num_riga = 2 ' i primi due sono titoli
Do
num_riga = num_riga + 1
' fase di scarto
If Left(UCase(Cells(num_riga, 2)), 2) <> "TO" And Not IsEmpty(Cells(num_riga, 2)) _
And UCase(Cells(num_riga, 2)) <> "ATT" And UCase(Cells(num_riga, 2)) <> "===" Then
' fine test di scarto
' fase di ricerca
c_e = False
If conta >= 0 Then ' solo dopo il primo
For ind = LBound(chi_e) To UBound(chi_e)
If chi_e(ind) = UCase(Cells(num_riga, 2)) Then c_e = True: Exit For
Next ind
End If
If Not c_e Then ' xchè non trovato o xchè è il primo
conta = conta + 1
ReDim Preserve chi_e(conta)
chi_e(conta) = UCase(Cells(num_riga, 2))
End If ' fine c'è
End If ' fine di quello che mi serve
Loop While Left(Cells(num_riga, "B"), 3) <> "TOT" Or num_riga = Rows.Count
End Sub
|
di Vecchio Frac data: 15/02/2015 21:23:20
Sarà l'ora ormai tarda, ma non credo di aver capito bene tutto, anche perchè manca un risultato atteso con cui fare il confronto della procedura. Nel senso che la routine gira e qualcosa fa (in chi_e() hai una serie di nomi della colonna B), ma poi questi dati non vengono più presi in esame e la routine termina. Immagino bene che sia un pezzo di una procedura più complessa, e che hai estratto solo il codice rilevante, però avere un risultato atteso sarebbe d'aiuto. Cioè hai una serie di dati delimitati da sigle note (TO, Att e ===") e devi recuperare i valori in mezzo, quindi eliminare i duplicati. Con che criterio? Nessuno, solo evitare i duplicati?
Penso che una Collection gestita potrebbe fare al caso tuo, aggiungi alla Collection ogni elemento, se ne aggiungi uno già presente si solleva errore che gestisci con On Error quindi ritorni dalla trappola dell'errore senza aggiungere il nuovo valore alla collezione.
Una cosa così, per esempio.
Function duplicates_collection(vettore As Variant) As Collection
Dim v As Variant, dups As Collection
Set dups = New Collection
On Error Resume Next
For Each v In vettore
dups.Add CStr(v), v
Next
On Error GoTo 0
Set duplicates_collection = dups
End Function |
di marinoernestoch data: 15/02/2015 21:39:10
Grazie vecchio Frac dell'interesse.
Ho allegato solo le istruzioni in esame, che sono parte di una macro ancora in embrione!.
Lavorerò su una copia parziale di un foglio base. Una volta riempita la schiera con i raggruppamenti, penso di usarla in una listbox a scelta multipla: poi lascerò sul foglio di copia solo le righe dei raggruppamenti scelti, eliminando le altre righe. A questo punto visualizzerò in ordine crescente o decrescente (sarà con un optionbutton a dirlo) per un campo o per un altro (altro option) le informazioni. Al termine dell'analisi distruggerò il foglio su cui ho lavorato.
Avevo già iniziato con la collection ma non mi aveva eliminato i doppioni: forse ho fatto un errore. Così ho sviluppato le istruzioni allegate
di marinoernestoch data: 15/02/2015 21:58:41
OK Vecchio Frac, a posto!
L'errore che avevo fatto era quello di aver dato una ADD UCase(Cells(num_riga, 2)) pura (così non mi toglieva i duplicati); ora con ADD UCase(Cells(num_riga, 2)) , UCase(Cells(num_riga, 2)) , cioè specificando la chiave, ottengo il risultato voluto.
grazie
di Vecchio Frac data: 15/02/2015 22:13:11
Sì: la chiave va specificata. Ci ho messo anch'io a impararlo, ma l'ho imparato ;)
Spero di avere presto notizia che hai completato anche questo progettino :)
Vuoi Approfondire?