Caricare una schiera senza duplicati



  • 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 :)