XL 2016 Supprimer enregistrement identique

KTM

XLDnaute Impliqué
Bonjour chers tous

Je voudrais supprimer par macro sur mes deux plages les lignes pour lesquelles le Code - l'Age - le sexe sont identiques.
Merci et bonne journée.
 

Pièces jointes

  • tri.xlsm
    9.1 KB · Affichages: 31

Jacky67

XLDnaute Barbatruc
Bonjour le fil, le forum,

Dans le fichier joint je compare les 3 solutions sur 19 000 lignes (données aléatoires entre 1 et 100).

Notez que les résultats en nombre de lignes des 3 tests ne sont pas les mêmes.

J'ai bien vérifié les miens, ils sont justes.

A+
Re...
Impressionnant la différence de temps d'exécution entre pierre et job (154 s et 0.8 s chez moi)
Si je comprends la différence du nombre de ligne entre Job et mapomme, puisque mapomme ne supprime pas les doublons, je ne comprends pas celle entre pierre et job
Son code est simple et me semble sans erreur, non?
Y a t'il une explication??
 

job75

XLDnaute Barbatruc
Dans ce fichier (2) j'ai supprimé les doublons de chacun des 2 tableaux de la feuille Initialisation.

mapomme et mois récupérons bien les mêmes lignes.

pierrejean récupère 2 lignes de plus.
 

Pièces jointes

  • Comparaison(2).xlsm
    989.3 KB · Affichages: 11

job75

XLDnaute Barbatruc
J'ai beau chercher, en long et en large( même en prenant Max(colonne(A), colonne(G)), je ne trouve pas d'où viennent ces deux lignes.
Une idée ??
La macro de pierrejean ne va pas parce qu'elle mélange tableaux VBA (invariables) et suppressions de lignes.

En remplaçant les tableaux VBA par des plages ça doit aller :
VB:
Sub test_pierrejean()
Feuil2.[A:K].Copy [A1] 'initialisation
t = Timer
Set tablo = Range("A2:E" & Range("A" & Rows.Count).End(xlUp).Row)
Set tablo1 = Range("G2:K" & Range("G" & Rows.Count).End(xlUp).Row)
For n = tablo.Rows.Count To 1 Step -1
  For m = tablo1.Rows.Count To 1 Step -1
     If tablo(n, 1) = tablo1(m, 1) And tablo(n, 3) = tablo1(m, 3) And tablo(n, 4) = tablo1(m, 4) Then
          Range("A" & n + 1 & ":E" & n + 1).Delete Shift:=xlUp
          Range("G" & m + 1 & ":K" & m + 1).Delete Shift:=xlUp
     End If
  Next
Next
MsgBox "Durée " & Format(Timer - t, "0.00 \s")
End Sub
Mais c'est terriblement long, essayez de tester ce fichier (3), moi j'ai abandonné.
 

Pièces jointes

  • Comparaison(3).xlsm
    990 KB · Affichages: 13

Jacky67

XLDnaute Barbatruc
La macro de pierrejean ne va pas parce qu'elle mélange tableaux VBA (invariables) et suppressions de lignes.

En remplaçant les tableaux VBA par des plages ça doit aller :
Mais c'est terriblement long, essayez de tester ce fichier (3), moi j'ai abandonné.
Re..
Oui c'est long, 137s, mais toujours deux lignes de plus pour tablo1 que la version job et mapomme
Pfff, c'est désespérant :eek:
 

pierrejean

XLDnaute Barbatruc
Re

Je m'escrime sur ce problème et voici ou j'en suis
1) en feuil1 correction de ma macro (nb :ici suivant l'exemple colorié du demandeur j'ai supprimé les 'doublons' entre les 2 tableaux et ignoré les doublons de chaque tableau)
J'ai bien au résultat le même nbre de lignes
2) en Module1 un essai au résultat curieux
Nb: ici je ne conserve qu'un doublon
mais en alternant les 2 lignes commentées j'obtiens les mêmes nbre de ligne que Gerard avec l'un ou l'autre des tableaux mais pas dans le second
Une idée ??
Enfin après une macro éternelle tester la macro pj2 qui repère les doublons
 

Pièces jointes

  • Comparaison(b).xlsm
    998.1 KB · Affichages: 4

job75

XLDnaute Barbatruc
Bonjour Pierre,

Difficile de savoir ce qui ne va pas.

Je vois que tu utilises Union pour grouper les plages à supprimer.

Tu sais certainement que cette méthode pédale dans la choucroute quand il y a un grand nombre de plages disjointes à grouper.

A+
 

pierrejean

XLDnaute Barbatruc
Re
Je pense qu'ici UNION n'est pas en cause
En effet j'ai effectué la manip suivante :
En manuel suppression des doublons dans chaque tableau puis copie du tableau 2 a la suite du tableau1 et suppression des doublons dans ce nouveau tableau qui m'indique conserver 32740 valeurs uniques
ce chiffre correspond aux valeurs obtenues par les macros pj et pj2 soit 18812+18427 la dernière étant je suppose "" "" ""
 

Pièces jointes

  • Comparaison(b).xlsm
    28.5 KB · Affichages: 2

pierrejean

XLDnaute Barbatruc
Re

In fine je propose:
VB:
Sub test_pj3()
Feuil2.[A:K].Copy [A1] 'initialisation
t = Timer
derlin1 = Range("A" & Rows.Count).End(xlUp).Row
derlin2 = Range("G" & Rows.Count).End(xlUp).Row
Range("F2:F" & derlin1) = 1
Range("L2:L" & derlin2) = 2
Range("$A$2:$F$" & derlin1).RemoveDuplicates Columns:=Array(1, 3, 4)
Range("$G$2:$L$" & derlin2).RemoveDuplicates Columns:=Array(1, 3, 4)
Range("$G$2:$L$" & derlin2).Copy Destination:=Range("A" & Rows.Count).End(xlUp).Offset(1)
derlin3 = Range("A" & Rows.Count).End(xlUp).Row
Range("$A$2:$F$" & derlin3).RemoveDuplicates Columns:=Array(1, 3, 4)
Set c = Columns("F").Find(2)
Range("A" & c.Row & ":F" & derlin3).Copy Destination:=Range("G2")
Range("A" & c.Row & ":F" & derlin3).Delete shift:=xlUp
Columns("F").ClearContents
Columns("L").ClearContents
MsgBox "Durée " & Format(Timer - t, "0.00 \s")
End Sub
 

Discussions similaires

Statistiques des forums

Discussions
312 103
Messages
2 085 321
Membres
102 862
dernier inscrit
Emma35400