Suppression de ligne en double sur 2 tableaux

Fitz_Chev -  
michel_m Messages postés 18903 Date d'inscription   Statut Contributeur Dernière intervention   -
Bonjour,

Alors je sais que la question des doublons a été évoquée des milliers de fois sur ce forum mais même en recherchant, je n'ai pas trouvé ce qui m'intéressait, ou alors j'ai mal cherché (ce qui est une éventualité).
Dans le cadre de mon boulot, je reçoit chaque mois un fichier de commissions payées par mon client, mais celui du mois N+1 reprends l'historique + les nouveaux.
Pour simplifier, je colle le fichier du mois N dans la feuille 2 du fichier N+1.
Ce que j'aimerais c'est isoler mes nouvelles lignes en feuille 3
J'ai essayé avec la MEF conditionnelle pour repérer les doublons sur le N° de contrat qui est unique, mais j'ai ce que j'appelle des dé-commissionnement d'un vieux contrat et donc le numéro de contrat est le même mais la ligne n'apparaissait pas dans mon fichier du mois N mais bien dans celui de N+1.
Je me demandais si avec une macro je pourrais pas réussir à m'en sortir car je vous avoue que mon fichier fait 800 lignes et j'en suis qu'au 3eme mois sur au moins 24, donc si vous avez une solution, je vous serait trèèèèèès reconnaissant.

Je vous joint un exemple pour plus de compréhension.

http://www.cjoint.com/c/EJio3kq5vk4

3 réponses

  1. Kuartz Messages postés 852 Date d'inscription   Statut Membre Dernière intervention   65
     
    Bonjour,

    Le code :

    Sub COMPARATIF()
    Dim O1 As Worksheet
    Dim O2 As Worksheet
    Dim TC1 As Variant
    Dim TC2 As Variant
    Dim i As Long
    Dim J As Long
    Dim TEST As Boolean
    Dim DEST As Range
    Dim TL() As Variant
    Dim T1 As String
    Dim T2 As String
    Dim K As Long
    
    
    Set O1 = Sheets(1)
    Set O2 = Sheets(2)
    Set O3 = Sheets(3)
    
    x = 1
    TC1 = O1.Range("A2:L" & O1.Cells(Application.Rows.Count, 1).End(xlUp).Row)
    TC2 = O2.Range("A2:L" & O2.Cells(Application.Rows.Count, 1).End(xlUp).Row)
    For i = 2 To UBound(TC1, 1)
        TEST = False
        T1 = CStr(TC1(i, 1)) & "/" & CStr(TC1(i, 2)) & "/" & CStr(TC1(i, 3)) & "/" & CStr(TC1(i, 4)) & "/" & CStr(TC1(i, 5)) & "/" & CStr(TC1(i, 6)) & "/" & CStr(TC1(i, 7)) & "/" & CStr(TC1(i, 8)) & "/" & CStr(TC1(i, 9)) & "/" & CStr(TC1(i, 10)) & "/" & CStr(TC1(i, 11)) & "/" & CStr(TC1(i, 12))
        For J = 2 To UBound(TC2, 1)
        T2 = CStr(TC2(J, 1)) & "/" & CStr(TC2(J, 2)) & "/" & CStr(TC2(J, 3)) & "/" & CStr(TC2(J, 4)) & "/" & CStr(TC2(J, 5)) & "/" & CStr(TC2(J, 6)) & "/" & CStr(TC2(J, 7)) & "/" & CStr(TC2(J, 8)) & "/" & CStr(TC2(J, 9)) & "/" & CStr(TC2(J, 10)) & "/" & CStr(TC2(J, 11)) & "/" & CStr(TC2(J, 12))
            If T1 = T2 Then TEST = True: Exit For
        Next J
        If TEST = False Then
        x = x + 1
            For K = 1 To 12
            Sheets(1).Cells(i, K).Copy Sheets(3).Cells(x, K)
            Next K
        End If
    Next i
    
    End Sub
    


    Le fichier modifié (il ne reste qu'à cliquer sur le bouton) :

    https://www.cjoint.com/c/EJjmFH18W7f

    Cordialement.
    0
  2. michel_m Messages postés 18903 Date d'inscription   Statut Contributeur Dernière intervention   3 320
     
    Bonjour,

    Afin d'éviter de se précipiter pour répondre à tout prix et fournir une usine à gaz si possible:
    quelle la colonne de l'identifiant unique de l'opération:? n° de police , code lien , ou....?

    0
    1. Fitz_Chev
       
      Ah oui je croyais que la colonne était "N° de contrat" mais non c'est la colonne "N° de police", désolé
      0
      1. michel_m Messages postés 18903 Date d'inscription   Statut Contributeur Dernière intervention   3 320 > Fitz_Chev
         
        Ce que je ne comprend est que on retrouve dans la différence des N° de police 2346 et 2348 présents dans N et N+1, le seul unique que je vois est le 2350...
        peut-être tenir compte du changement sur 2 lignes dans les colonnes >G et conserver la 2° ligne ???
        0
      2. Fitz_Chev > michel_m Messages postés 18903 Date d'inscription   Statut Contributeur Dernière intervention  
         
        Je ne comprends pas ce que vous voulez me dire, cependant je vais essayer d'être plus claire dans mon explication. En fait pour le contrat 2348 par exemple, même si le numéro de contrat est unique, il peut y avoir deux lignes, car la 1ere est la commission payée par mon client par exemple au mois de mars, cependant, pour X raisons, au mois de mai, le contrat est annulé ou résilié, donc mon client me dé-commissionne sur ce contrat d'où les 2 lignes avec + et -, et malheureusement, la date comptable ne change pas car c'est la date de la vente. Pour le 2346, il y a eu un versement complémentaire ou une augmentation des versements (ce sont des produits d'assurance), d'où ma seconde, car mon client me commissionne plus vu que le contrat rapporte plus.
        Et c'est de là que viens mon problème, c'est que c'est trié par date du contrat.

        Je sais pas si j'ai été suffisamment clair, sinon n'hésitez pas à me poser des questions pour éclaircir.

        Merci beaucoup en tout cas
        0
    2. Kuartz Messages postés 852 Date d'inscription   Statut Membre Dernière intervention   65
       
      J'ai fait avec les données que j'avais. Pour comparer les lignes, j'ai juste repris toutes les colonnes.
      0
      1. michel_m Messages postés 18903 Date d'inscription   Statut Contributeur Dernière intervention   3 320 > Kuartz Messages postés 852 Date d'inscription   Statut Membre Dernière intervention  
         
        Donc on garde la 2° ligne dans différence...
        0
  3. michel_m Messages postés 18903 Date d'inscription   Statut Contributeur Dernière intervention   3 320
     
    Bonjour

    ci joint proposition
    le bouton de déclenchement peut être dans n'importe quelle feuille
    j'ai considéré que le nombre de lignes était important pour choisir une méthode rapide (mais peut-être + compliquée)
    http://www.cjoint.com/c/EJlhTXLK8vI

    Le code pour mémoire

    Option Explicit
    Option Base 1
    '-------
    Sub indiquer_différences()
    Dim Derlig As Integer, T_in, D_in As Object, Cptr As Integer, Ref As String
    Dim T_in1, T_out, Cpx As Integer, Col As Byte

    Application.ScreenUpdating = False 'fige l'écran: confort et rapidité
    '-----------------------------nettoyage
    Sheets("différence").Range("A2:L10000").Clear

    '-----------------------------mémorisation feuille N en Ram
    With Sheets("Tableau N")
    Derlig = .Columns("A").Find(what:="*", searchdirection:=xlPrevious).Row
    T_in = .Range("D2:G" & Derlig)
    'concaténation police & cotisation dans une collection (dictionary)
    Set D_in = CreateObject("scripting.dictionary")
    For Cptr = 1 To UBound(T_in)
    Ref = T_in(Cptr, 1) & " " & T_in(Cptr, 4)
    If Not D_in.exists(Ref) Then: D_in.Add Ref, ""
    Next
    End With

    '--------------------------comparaison de la collection avec concaténation _
    police & cotisatin dans feuille n+1
    With Sheets("Tableau N+1")
    ReDim T_out(12, 1) 'mémorisation en Ram
    Derlig = .Columns("A").Find(what:="*", searchdirection:=xlPrevious).Row
    T_in1 = .Range("A2:L" & Derlig)
    For Cptr = 1 To UBound(T_in1)
    Ref = T_in1(Cptr, 4) & " " & T_in1(Cptr, 7)
    'si la concaténation feuille n=1 n'existe pas dans la collection feuil n
    If Not D_in.exists(Ref) Then
    Cpx = Cpx + 1
    ' inscription des données colonne a à L feuille n+1 dans _
    variables tableau dynamique
    ReDim Preserve T_out(12, Cpx)
    For Col = 1 To 12
    T_out(Col, Cpx) = T_in1(Cptr, Col)
    Next
    End If
    Next
    End With

    '-----------------------------------------restitution
    With Sheets("Différence")
    .Range("A2").Resize(Cpx, 12) = Application.Transpose(T_out)
    With .Range("A2:L" & Cpx + 1)
    .Borders.Weight = xlThin 'quadrillage
    .Font.Name = "Verdana" 'police
    .Font.Size = 8
    End With
    .Activate
    End With
    End Sub


    Michel
    0