Suppression doublons clé primaire

Bonjour à tous,

Je reçois chaque mois un fichier Excel brut, avec des milliers de lignes correspondant à des affaires à traiter. Le problème est qu'à chaque réception du nouveau fichier, les nouveaux cas à traiter sont ajoutés, sans que ceux déjà pris en compte soit retirés.

Autrement dit, chaque mois je reçois un fichier comportant les nouvelles affaires, ainsi que les anciennes déjà traitées, et ce sans distinction.

Afin de pallier cela, j'ai opté pour la création d'une clé primaire, en concaténant tout simplement les données de certaines colonnes. L'idée est alors de constituer une base de données dans un second onglet, de l'ensemble des affaires déjà apparues dans les fichiers précédents, pour garder une trace de celles déjà traitées.

A la réception du nouveau fichier mensuel, je copie les nouvelles données brutes dans le premier onglet du fichier comprenant la base de données, créer les clés primaires, puis il me faut alors une macro permettant de comparer ces nouvelles clés primaires avec celles de la base de données et de supprimer les lignes pour celles existant déjà. Cela me permet alors de faire le tri entre les nouvelles clés, et celles déjà traitées et ainsi de savoir clairement quelles sont les nouvelles affaires à traiter.
J'en ai mise une au point qui fonctionne, le problème étant que du fait du nombre important des données, celle-ci met quasiment 15 min avant d'être achevée :

Sub clé5()

Dim DL As Integer DL = Worksheets(1).Range("AL" & Rows.Count).End(xlUp).Row

 Dim DL2 As Integer DL2 = Worksheets(2).Range("A" & Rows.Count).End(xlUp).Row

 Dim plage As Range Set plage = Worksheets(1).Range("AL2:AL" & DL)

 Dim plage2 As Range Set plage2 = Worksheets(2).Range("A2:A" & DL2)

 For Each cellule1 In plage

     For Each cellule2 In plage2

      If cellule1.Value = cellule2.Value Then

      cellule1.Value = "ok"

      End If

     Next cellule2

 Next cellule1

 For i = DL To 1 Step -1

     If Cells(i, 38).Value = "ok" Then

     Rows(i).EntireRow.Delete

     End If 

 Next i

End Sub

J'aimerais alors savoir comment optimiser/modifier celle-ci afin d'obtenir un rendu plus efficient, ou si cela est impossible du fait du nombre de données à traiter.

Je vous joins un fichier type pour se rendre compte du problème,

Je vous remercie par avance pour vos retour,

Bonjour,

Malheureusement dans ton fichier il n'y a aucun doublon donc je n'ai pas pu tester mon code jusqu'au bout, mais voici une proposition:

Sub rechercheDoublons()
Dim tabRecherche As Variant, tabCles As Variant
Dim ligFin As Long

Application.ScreenUpdating = False

ligFin = Feuil1.Range("AL" & Rows.Count).End(xlUp).Row
tabRecherche = Feuil1.Range("AL1:AL" & ligFin).Value

ligFin = Feuil3.Range("A" & Rows.Count).End(xlUp).Row
tabCles = Feuil3.Range("A2:A" & ligFin)

For i = UBound(tabRecherche, 1) To LBound(tabRecherche, 1) + 1 Step -1
    For x = LBound(tabCles, 1) To UBound(tabCles, 1)
        If tabRecherche(i, 1) = tabCles(x, 1) Then
            Range("A" & i).EntireRow.Delete
            Exit For
        End If
    Next x
Next i
End Sub

Petite remarque si tu veux que ton code aille plus vite, dans ta feuille qui contient les clés primaires, assure toi de ne pas avoir de doublons, sinon ça va rallonger l'exécution pour rien.

Améliorations dans la proposition:

  1. Passer par des tableaux VBA pour une exécution plus rapide
  2. Désactivation de la mise à jour automatique de l 'affichage pour une exécution plus rapide
  3. Sortie de la boucle de recherche si on trouve la valeur pour une exécution plus rapide
  4. Pas de modification de valeur intermédiaire pour refaire une boucle derrière, on trouve la valeur dans les clés, on supprime la ligne, toujours pour une exécution plus rapide
Rechercher des sujets similaires à "suppression doublons cle primaire"