Supprimer les doublons
Bonjour,
La petite histoire..
Sur un chantier j’ai des camions qui passe sur une bascule afin de peser la quantité de matériaux qui nous livre. J’exporte ensuite les données (en simplifié le fichier joint)
Mais je remarque que certain camion passe 2 fois. Je voudrais que Excel me détecte les doublons et me les supprime.
Pour une même immatriculation (« Immat ») comparer les deux heures de pesées (« Date »), si la différence est inférieure à 20min je garde les pesées du même camions. Sinon je supprime.
Comparer les heures avec la formule « =(A2-A1)*1440 », est-ce un bon début ?
Est-ce que je dois le faire en VBA ?
Merci d’avance
Florian
Bonjour,
Je pense qu'il est tout à fait possible de se passer de VBA, à partir du moment où l'ajout de colonne ne te pose pas de problème.
Pour être au clair :
- Intervalle de - de 20 minutes entre 2 pesées, tu gardes toutes les pesées, ou tu ne conserves qu'une valeur ?
- Quelle valeur comptes tu conserver ? La première, la dernière, la moyenne, la médiane... ?
Ce que tu as écrit ne me semble pas très logique, dans la mesure où des pesées espacées de moins de 20 minutes représentent pour moi un même chargement (donc des doublons à supprimer). Si j'ai bien compris, voilà un fichier permettant d'identifier les doublons (et de les supprimer en filtrant les lignes selon cette nouvelle colonne) :
Si j'ai mal compris et que ce que tu as écrit est correcte, où s'arrête la suppression des doublons d'une même immatriculation ? Au même jour ?
Bonjour Pedro,
Déjà merci pour ta réponse.
Ce que tu as écrit ne me semble pas très logique, dans la mesure où des pesées espacées de moins de 20 minutes représentent pour moi un même chargement (donc des doublons à supprimer).
Bien vu ! Effectivement je voulais dire la différence supérieur à 20 minutes.
- Intervalle de - de 20 minutes entre 2 pesées, tu gardes toutes les pesées, ou tu ne conserves qu'une valeur ?
Intervalle de - de 20 minutes entre 2 pesées, je supprime les pesées dont l'immatriculation est la même.
- Quelle valeur comptes tu conserver ? La première, la dernière, la moyenne, la médiane... ?
Je garde la première pesée.
Merci pour la formule
Faut-il ensuite supprimer la ligne manuellement ? Ou peut-on automatiser tout ça ?
Il est possible de tout automatiser, mais personnellement je ne m'embêterai pas avec des macros pour une opération faisable en 2 clics...
Si c'est vraiment ce que tu souhaites, redis moi et je te proposerais un code.
Je vais essayer de mettre sous forme de macro, si quelqu'un d'autre doit faire mon travail, il n'aura plus qu'a cliquer sur un bouton !
J'ai trouver un code super "doublons_et_lignes_vides" sur le site. Ça marche super bien. Sauf que pour moi il faudrait l'adapter pour ma colonne A (date et heure).
Si je ne me trompe pas, il faut cette formule en VBA pour que la macro me compare chaque ligne de mon fichier.
SI (Ai-An)<20/1440;Bi=Bn ALORS détecte comme doublon dans le programme. (Celle que tu m'as donné hier)
Et sur quelle ligne du code ajouter la condition ?
Merci
Voilà une proposition à tester :
Sub SupprDoublons()
Dim Lig As Long, LigMax As Long, Tps As Single, Seuil As Single
With Sheets("Feuil1")
LigMax = .Range("A" & Rows.Count).End(xlUp).Row 'Identifie la dernière ligne non vide
Tps = 20 / 1440 'Intervalle de temps : 20 minutes
Seuil = 600 'Différence de poids net tolérée (en kg) pour considérer que c'est le même chargement
'Tri par immatriculation et par date
.AutoFilter.Sort.SortFields.Clear
.AutoFilter.Sort.SortFields.Add Key:=Range("B1"), Order:=xlAscending
.AutoFilter.Sort.SortFields.Add Key:=Range("A1"), Order:=xlAscending
With .AutoFilter.Sort
.Header = xlYes
.MatchCase = False
.Orientation = xlTopToBottom
.SortMethod = xlPinYin
.Apply
End With
For Lig = 2 To LigMax 'Boucle sur les lignes
If .Range("B" & Lig) = .Range("B" & Lig - 1) Then
If Abs(.Range("A" & Lig) - .Range("A" & Lig - 1)) < Tps And Abs(.Range("E" & Lig) - .Range("E" & Lig - 1)) < Seuil Then .Range("F" & Lig) = "Doublon"
End If
Next Lig
.Range("A1").AutoFilter Field:=6, Criteria1:="<>" 'Tri les "doublons"
.Range("A2:F" & LigMax).SpecialCells(xlCellTypeVisible).Delete 'Supprime les doublons
.Range("A1").AutoFilter Field:=6 'Retire le tri pour afficher toutes les données
End With
End Sub
PS : J'ai ajouté une condition de poids pour considérer 2 chargements consécutifs comme étant des doublons
Merci pour le code, j'ai eu une première erreur sur la ligne
For Lig = 2 To LigMax 'Boucle sur les lignes
If .Range("B" & Lig) = .Range("B" & Lig - 1) Then
If Abs(.Range("A" & Lig) - .Range("A" & Lig - 1)) < Tps And Abs(.Range("E" & Lig) - .Range("E" & Lig - 1)) < Seuil Then .Range("F" & Lig) = "Doublon"
J'ai changé en :
For Lig = 3 To LigMax 'Boucle sur les lignes
Ça marche nickel ! Merci beaucoup
Content de t'avoir aidé !