Eliminare dati doppi di coppie di nuneri.  

Ovvero: ricerca ed eliminazione righe se i valori di due celle contigue sono uguali a valori di due altre celle contigue, nelle stesse colonne di un elenco. esempio

  A B
1 10 20
2 7 32
3 10 20
4 8 15

I valori nelle due celle della riga 3 sono uguali ai valori nelle due celle della riga 1. Andrà eliminata la riga 3.

Una problematica peraltro evidenziata da alcune richieste, di cui viene presentata una soluzione, non unica, ma che possiede il grande pregio della eccezionale velocità di esecuzione utilissima in particolare con lunghi e lunghissimi elenchi (50.000 e oltre righe) dove le coppie valori da controllare impegnano notevole tempo se si usano i normali cicli a due variabili.

Questa routine è stata realizzata da MICHELE    email  mic1947@libero.it

Il sistema escogitato da Michele, in pratica, utilizza una colonna esterna all'elenco (la H) dove "concatena"  i valori presenti nelle coppie di celle da  esaminare, ottenendo un unico numero non confondibile, ma uguale ad altre "concatenazioni" di stesse coppie di numeri se presenti nelle righe dell'elenco, e crea quindi un elenco di pari lunghezza rispetto all'origine. Poi lavora su questa colonna : identifica il valore della prima cella di questa zona (assegnata alla variabile "MioIntervallo"), e con un ciclo For Each .... Next controlla partendo dalla fine (Step -1) e a salire, se trova un valore uguale alla prima cella dell'elenco; se la trova uguale, viene eliminata l'intera riga. Finito il controllo dei valori della prima cella, si passa alla riga successiva (alla prima (Riga + 1)), ripetendo il controllo dalla fine, a salire. Finito il ciclo dei controlli, seleziona tutta la colonna usata come "MioIntervallo", e cancella i contenuti rimasti. La soluzione di Michele, oltre che intelligente, è veramente veloce: su un Pentium4 1800, su un elenco di 48 coppie di numeri ripetute 10 volte, accodando fino ad ottenere un elenco di 480 righe, ha totalizzato 1 secondo nell'eliminazione di tutte le righe ripetute. Un bel risultato!!! Questa la routine, comprensiva delle istruzioni per il conteggio dei tempi di esecuzione.

Sub elidodue()

Dim Riga
Dim MioIntervallo As Range
Dim CL As Object
Dim D1, D2 As Date
Dim tempoimpiegato As String
D1 = Time

Application.ScreenUpdating = False
Range("A1").End(xlDown).Select
R = ActiveCell.Row
For Y = 1 To R
Cells(Y, 8).Select
ActiveCell = Cells(Y, 1).Value & Cells(Y, 2).Value
Next
Set MioIntervallo = Range(Cells(1, 8), Cells(R, 8))
Riga = 2
For Each CL In MioIntervallo

For z = R To Riga Step -1
If CL.Value = Cells(z, 8) Then Sheets(1).Cells(z, 8).EntireRow.Delete
Next
Riga = Riga + 1
Next
Riga = 2
Columns("H:H").Select
Selection.ClearContents
Range("A1").Select

D2 = Time
tempoimpiegato = Format(D2 - D1, "hh:mm:ss")
MsgBox "Tempo impiegato: " & tempoimpiegato

End Sub

L'interpretazione delle istruzioni, anche se presuppone una certa conoscenza del codice vba, non è difficile, quindi gli interessati potranno facilmente adattare le istruzioni ai propri riferimenti.

Un grazie a Michele, specie da quei "pellegrini" che gradiranno questa sua interpretazione di un problemino comune a molti.


prelevato sul sito http://ennius.interfree.it