2017-10-20 17 views
0

J'ai une macro qui remplit une feuille de calcul en fonction des données brutes d'une autre feuille de calcul.Suppression des doublons en conservant la dernière ligne entre deux colonnes

La méthode de tri principale pour chaque ligne est par voie (origine à destination). Les résultats pour chaque voie sont en outre triés par semaine. Je dois supprimer les semaines en double pour chaque voie tout en gardant le dernier résultat.

La configuration est similaire à ceci: (Désolé pour le formatage)

A   B 
LANE A WEEK 38 
LANE A WEEK 39 
LANE A WEEK 40 
LANE A WEEK 41 
LANE A WEEK 42 
LANE A WEEK 39 
LANE A WEEK 40 
LANE A WEEK 41 
LANE A WEEK 42 
LANE A WEEK 39 
LANE B WEEK 38 
LANE B WEEK 39 
LANE B WEEK 40 

Je trouve le code suivant qui fonctionne bien pour une seule voie

Dim Rng As Range, Dn As Range, n As Long 
Dim Lst As Long, nRng As Range 
Lst = Range("B" & Rows.Count).End(xlUp).Row 
    With CreateObject("scripting.dictionary") 
     .CompareMode = vbTextCompare 
For n = Lst To 1 Step -1 
    If Not .Exists(Range("B" & n).Value) Then 
     .Add Range("B" & n).Value, Nothing 
    Else 
     If nRng Is Nothing Then 
      Set nRng = Range("B" & n) 
     Else 
      Set nRng = Union(nRng, Range("B" & n)) 
     End If 
End If 
Next n 
If Not nRng Is Nothing Then nRng.EntireRow.Delete 
End With 

Mais comme il ne supprime que les doublons basés sur la semaine ou la colonne B, la totalité de la voie B est supprimée.

EDIT:

Le résultat final devrait apparaître comme celui-ci

A   B 
LANE A WEEK 38 
LANE A WEEK 39 
LANE A WEEK 40 
LANE A WEEK 41 
LANE A WEEK 42 


LANE B WEEK 38 
LANE B WEEK 39 
LANE B WEEK 40 

Voici une capture d'écran d'un exemple ensemble de données

https://imgur.com/a/MU6vB

à la ligne 5, il y a des données répétées pour la ATL6 voie. Ensuite vient CMH1. J'ai besoin de dupliquer les semaines dans la même voie pour être supprimé, en préservant la dernière mise à jour de la voie. Comme mon code est actuellement, il ne regarde que la semaine. Toutes les données ATL6 sont donc supprimées et seul le CMH1 est laissé.

Pour la voie ATL6, j'ai besoin que les lignes 6 à 9 soient préservées et 2 à 5 supprimées en tant que doublons. Cela devra s'appliquer dans toutes les situations, pas seulement à ces lignes spécifiquement.

+1

Pour être clair. Quel est le résultat final? (Veuillez mettre à jour la question originale). Par exemple, à la date de votre échantillon, la piste A aura deux rangées: semaine 38 et semaine 39 ou seulement semaine 39? –

+0

Mise à jour, pour réitérer la mise à jour.Chaque mise à jour de la feuille de calcul (qui sera quotidienne) ajoutera 4 entrées pour chaque piste. Ceux-ci suivent des semaines de l'année, en spreads de 4 semaines. Donc la feuille actuelle a des semaines 39-42 pour chaque voie (environ 15 ou plus). Donc, le résultat attendu aurait 4 semaines pour le couloir a, 4 semaines pour le couloir b et ainsi de suite. Ceci sera mis à jour quotidiennement pour une période indéfinie, donc le nombre de semaines augmentera au fil du temps – Stuka

+0

Pourquoi ne pas simplement utiliser la fonction Trier sous l'onglet "Données" et ensuite supprimer les doublons par la colonne B? Enregistrement en faisant cela avec une macro – Maldred

Répondre

0

NOTE

Je viens de réaliser cette volonté que travail s'il y a exactement deux ensembles en double. S'il peut y avoir plus que cela, alors laissez-moi savoir et je vais supprimer

J'ai utilisé le code ci-dessous avec ces données d'échantillons (en fonction de votre échantillon structure de données) et cela a fonctionné. Il tire parti des fonctionnalités intégrées d'Excel, mais si les données sont , les performances peuvent en souffrir.

Avant

enter image description here

Option Explicit 

Sub RemoveEarliestDupes() 

    Dim ws1 As Worksheet 
    Set ws1 = Worksheets("Sheet1") 

    With ws1 

     Dim LastRow As Long 
     LastRow = .Cells(.Rows.Count, 1).End(xlUp).Row 

     .Range("D" & LastRow).FormulaArray = "=IF(ISNUMBER(MATCH(A" & LastRow & "&B" & LastRow & ",$A$1:A" & LastRow - 1 & "&$B$1:$B$" & LastRow - 1 & ",0)),"""",""Remove"")" 
     .Range("D" & LastRow).Copy 

     With .Range(.Range("D2"), .Range("D" & LastRow - 1)) 
      .PasteSpecial xlPasteFormulas 
      .Calculate 
     End With 

     With .Range(.Range("D2"), .Range("D" & LastRow)) 
      .Copy 
      .PasteSpecial xlPasteValues 
      .AutoFilter 1, "Remove" 
      .SpecialCells(xlCellTypeVisible).EntireRow.Delete 
      .ClearContents 
     End With 

     .AutoFilterMode = False 

    End With 

End Sub 

Après

enter image description here

+0

Merci Scott, mais oui, il y a un potentiel pour un nombre relativement important de doublons, mais la performance n'est pas très préoccupante. J'ai essayé et exécuter ce code, en réduisant à 2 doublons, mais recevait une erreur d'objet sur .ClearContents et le contenu de la feuille ont été supprimés entièrement – Stuka

+0

vous pouvez supprimer cette ligne. ce n'est pas nécessaire. –