1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42
| Sub DoublonsunpariaTest()
Application.ScreenUpdating = False
Dim i As Long, n As Long, c As String, pl_doublons As Range, derlig As Long, les_cols
Columns("H").ClearContents
deb = Timer '===================================== juste pour tester
ActiveSheet.UsedRange
n = Cells.SpecialCells(xlCellTypeLastCell).Row
les_cols = Array("A", "B", "C", "D", "E")
formule = "=" & les_cols(0) & "1" ' ----->> début de notre formule (toujours le même)
For i = 1 To UBound(les_cols) '-----------------------------------------
formule = formule & " & """ & Chr(1) & """ & " & les_cols(i) & "1" '| et on concatème la formule en boucle
Next ' -----------------------------------------------------------------
With ActiveSheet
.Range("F1:F" & n).Formula = formule '--->> nous concaténons ici (regardez la construction de la chaîne formule)
.Range("G1:G" & n).Formula = "=Row()" ' --->> nous attribuons (par simple constat) les Nos de lignes correspondants
.Range("F1:G" & n).Value = Range("F1:G" & n).Value '--->> nous figeons ces valeurs (indépendantes alors des formules) pour ne pas torturer Excel
.Range("A1:G" & n).Sort key1:=.Range("F1:G" & n), order1:=xlAscending, Header:=xlNo ' -->> et nous trions les concaténations sans (surtout) toucher aux
' autres colonnes. Seuls les N)s de lignes suivront ce tri
.Range("H1").Value = Range("F1").Value ' --->> la 1ère ligne n'est forcément pas un doublon
.Range("H2:H" & n).Formula = "=IF(F2=F1,"""",F2)" ' --->> nous mettons à "" les valeurs trouvées si égales à celles de la
' cellule atteinte par un déplacement type cheval aux échecs
.Range("H2:H" & n).Value = .Range("H2:H" & n).Value '--->> et là aussi, nous figeons les valeurs, pour toujours les mêmes raisons
.Range("A1:H" & n).Sort key1:=.Range("H1"), order1:=xlAscending, Header:=xlNo '-->> nous remettons les choses dans l'ordre originel, toujours sans toucher à l'ordre
' des données traitées. Du coup, les doublons reviendront à leur rang de départ
Dim DLColH&
DLColH = Cells(Rows.Count, 8).End(xlUp)(2).Row
.Range("A" & DLColH & ":H" & n).EntireRow.Delete
End With
Application.ScreenUpdating = True
'==========================================================================================================================
'================ le travail est terminé
' =============== ce qui suit n'est là qu'en tant que visualisation (l'une de ses formes possibles suffira)
'MsgBox Timer - deb - 1 & " secondes pour traiter " & n & " lignes de 5 colonnes et extraire la plage " & pl_doublons.Address
'Application.ScreenUpdating = True
'MsgBox "tiens ... on va (par exemple) la sélectionner"
'pl_doublons.EntireRow.Select
End Sub |
Partager