[VBA] - Méthode de tri des données la plus rapide (+ remove duplicate)
Bonsoir,
Pour trier mes données de A à Z et enlever les doublons, j'utilise ce code :
Set lf = Worksheets("Listing flore")
lrlf = lf.Cells(Rows.Count, 2).End(xlUp).Row
lclf = lf.Cells(1, lf.Columns.Count).End(xlToLeft).Column
With lf
.Range("B:B").RemoveDuplicates Columns:=1, Header:=xlYes
'Classer les données (A-Z) dans la colonne B
.Range(Cells(1, 1), Cells(lrlf, lclf)).Sort _
Key1:=Range("B1"), Order1:=xlAscending, _
Header:=xlYes, Orientation:=xlTopToBottom
End With
End SubSavez-vous s'il s'agit de la solution la plus rapide pour trier automatiquement des données dans une feuille Excel ? Cette procédure prend beaucoup de temps dans mon cas. Si vous avez une solution pour améliorer la vitesse de tri / suppression des doublons je suis preneurs !
Bonne soirée !
A plus tard.
Salut Le Drosophile,
à mon sens, la suppression des doublons devrait être plus rapide en utilisant Dico : malheureusement, je ne maîtrise pas cette bête-là...
Avec ce code, que j'utiliserais aussi, à part ajouter...
Application.ScreenUpdating = FalseJ'imagine que tu veux supprimer les lignes complètes contenant des doublons ?
Dans ce cas, il faut intégrer toutes les colonnes dans la ligne...
.Range("A:" & sCol).RemoveDuplicates .Columns:=2, Header:=xlYeset indiquer Columns:= 2
Ce qui donnerait :
Application.Calculation = xlCalculationManual
Application.ScreenUpdating = False
'
With Worksheets("Listing flore")
iRow = .Range("A" & Rows.Count, 2).End(xlUp).Row
iCol = .Cells(1, .Columns.Count).End(xlToLeft).Column
sCol = Split(Columns(iCol).Address(ColumnAbsolute:=False), ":")(1)
'
.Range("A:" & sCol).RemoveDuplicates Columns:=2, Header:=xlYes
iRow = .Range("A" & Rows.Count, 2).End(xlUp).Row
.Range("A1:" & sCol & iRow).Sort _
Key1:=.Range("B1"), Order1:=xlAscending, _
Header:=xlYes, Orientation:=xlTopToBottom
End With
'
Application.ScreenUpdating = True
Application.Calculation = xlCalculationAutomaticEspérant t'avoir aidé...
A+
Bonjour, bonjour Curulis,
Cette procédure prend beaucoup de temps dans mon cas. Si vous avez une solution pour améliorer la vitesse de tri / suppression des doublons je suis preneurs !
Le problème n'est pas le tri en soi, le problème vient très probablement des calculs que tu as (soit formules matricielles, soit sommeprod ou somme.si.ens).
La solution de Curulis de passer temporairement en calcul manuel est donc la solution.
Mais pense aussi à traiter l'origine en passant aux TCD.
Tout ceci est un supposition ne connaissant pas ton fichier, mais c'est probablement le cas.
Bonjour,
Dans mon cas il n'y a aucune autre colonne, je souhaite faire la liste des espèces qui correspondent à un choix prédéfini, je passe ainsi de 96 000 lignes à : 10000 - 600 lignes.
Pour 600 lignes la procédure que j'utilise est bien, encore mieux avec vos améliorations.
En revanche, pour 10 000 lignes, ça prend un peu plus de temps.
Effectivement je ne pensais pas à la solution du TCD, dans le quel je ne demanderais qu'à lister les espèces (sans croisement donc).
Elle est beaucoup plus rapide, mais ça ne fonctionne pas dans mon cas (pour le moment).
La sélection des lignes que je souhaite conserver passe par des filtres automatiques.
En fonction des choix qui sont faits dans un UserForm, des filtres sont ajoutés de manière à réduire au maximum les données au strict nécessaire. Si j'utilise ensuite un TCD, alors, je n'ai pas uniquement les données filtrées mais d'autres (sans vraiment savoir lesquelles car il ne prend visiblement pas toutes les données de la base de données).
Je sens qu'il va falloir que je joigne un document haha.
Ah mais c'est en vous expliquant mon problème que j'ai finit par comprendre...
Pour lister mes données je passais par une collection (donc 1 boucle)
Puis je refaisais une boucle pour les insérer dans la nouvelle feuille.
Mais vue que les données sont déjà filtrée, je m'y suis pris comme ça :
For cib3 = 1 To lctf
If tf.Cells(1, cib3) = "LB_NOM LB_AUTEUR" Then
Exit For
End If
Next cib3
With tf
lrtf = .Cells(.Rows.Count, 1).End(xlUp).Row
lctf = .Cells(2, .Columns.Count).End(xlToLeft).Column
Set rng = .Cells(2, cib3).Resize(lrtf) 'nom scientifique
End With
rng.Copy Destination:=lf.Cells(2, 2)
Puis je classe + supprime les doublons en désactivant l'actualisation de l'écran.
Et tout se fait en une fraction de seconde !
Merci à vous !