Microsoft 365 Vérifier les doublons

  • Initiateur de la discussion Initiateur de la discussion Ines99
  • Date de début Date de début

Boostez vos compétences Excel avec notre communauté !

Rejoignez Excel Downloads, le rendez-vous des passionnés où l'entraide fait la force. Apprenez, échangez, progressez – et tout ça gratuitement ! 👉 Inscrivez-vous maintenant !

Ines99

XLDnaute Occasionnel
Bonjour le forum,

Je cherche à trouver une solution pour vérifier les doublons sur ma data ?
J'aimerais signaler les montants DEBIT et CREDIT qui ont les mêmes Dates, CompteNum Outils analytiques comme étant des doublons comme dans l'exemple que je vous ai joins.
Je vous remercie pour votre aide
Ines
 

Pièces jointes

Solution
Bonsoir
Mon fichier fait déjà plus de 30000 lignes et me génère de lenteurs, rien à voir avec ton expertise évidement, mais je commence à me poser des questions.
Pourquoi la mise en forme conditionnelle (MFC) n'est pas adaptée pour plus de 30 000 lignes

  • Évaluation cellulaire intensive :
    La MFC s'applique à chaque cellule individuellement. Pour 30 000+ lignes, Excel doit évaluer des milliers de règles en temps réel, ce qui ralentit considérablement le recalcul et l'affichage.
  • Surcharge de fonctions :
    Les fonctions utilisées dans les formules de MFC (comme NB.SI ou LN) sont recalculées à chaque modification de la feuille. Cela devient très lourd quand le nombre de cellules concernées augmente...
Bonjour Ines99,

On peut utiliser 2 colonnes auxiliaires qui concatènent :

- les valeurs des colonnes E G N O

- les valeurs des colonnes E G N P.

Mais attention : la date en E18 est un texte, pas un nombre.

Ensuite on construira une MFC à partir de ces colonnes en utilisant la fonction NB.SI.

A+
 
Bonjour Ines99,

On peut utiliser 2 colonnes auxiliaires qui concatènent :

- les valeurs des colonnes E G N O

- les valeurs des colonnes E G N P.

Mais attention : la date en E18 est un texte, pas un nombre.

Ensuite on construira une MFC à partir de ces colonnes en utilisant la fonction NB.SI.

A+
Bonsoir le forum,
Effectivement, il s'agit d'un fichier txt que j'ai converti.
job75, merci si je peux avoir un aperçu de ta proposition
Ines
 
Bonsoir @job75
Ensuite on construira une MFC à partir de ces colonnes en utilisant la fonction NB.SI.
Puis-je te poser une question ? Je me suis aperçu que lorsque je fais un copier-coller de plages (qui comportent des mises en forme conditionnelles), cela duplique les règles et je me retrouve avec des listes impossibles à gérer. As-tu trouvé une méthode pour contourner ce problème ? Si oui, merci de partager l’astuce.

Laurent
 
Voyez le fichier joint avec la MFC =LN(NB.SI($A$2:$A$24;$A2))+LN(NB.SI($B$2:$B$24;$B2))

Pour éviter d'avoir à tirer les formules il sera bien d'utiliser un tableau structuré.
Puis-je te poser une question ? Je me suis aperçu que lorsque je fais un copier-coller de plages (qui comportent des mises en forme conditionnelles), cela duplique les règles et je me retrouve avec des listes impossibles à gérer. As-tu trouvé une méthode pour contourner ce problème ? Si oui, merci de partager l’astuce.
Il ne faut pas faire de copier-coller sur les plages qui contiennent des MFC, c'est tout.

Edit : par contre on peut faire des Copier-Collage spécial-Valeurs sans inconvénient.
 

Pièces jointes

Dernière édition:
Voyez le fichier joint avec la MFC =LN(NB.SI($A$2:$A$24;$A2))+LN(NB.SI($B$2:$B$24;$B2))

Pour éviter d'avoir à tirer les formules il sera bien d'utiliser un tableau structuré.

Il ne faut pas faire de copier-coller sur les plages qui contiennent des MFC, c'est tout.
Merci job75, le forum,
Votre solution fonctionne très bien et m'aide à cibler les doublons.
Merci pour votre aide
Ines
 
Bonjour Ines99, le forum,

Ah mais je n'avais pas pensé à NB.SI.ENS 😕

Avec cette fonction pas besoin de colonnes auxiliaires :
Code:
=LN(NB.SI.ENS($E$2:$E$24;$E2;$G$2:$G$24;$G2;$N$2:$N$24;$N2;$O$2:$O$24;$O2))+LN(NB.SI.ENS($E$2:$E$24;$E2;$G$2:$G$24;$G2;$N$2:$N$24;$N2;$P$2:$P$24;$P2))
Je joins également le tableau structuré.

A+
 

Pièces jointes

Avec la solution précédente 2 lignes sont doublons si Débits OU Crédits sont identiques.

Avec cette solution 2 lignes sont doublons si Débits ET Crédits sont identiques :
Code:
=LN(NB.SI.ENS($E$2:$E$24;$E2;$G$2:$G$24;$G2;$N$2:$N$24;$N2;$O$2:$O$24;$O2;$P$2:$P$24;$P2))
Bonjour job75, le forum

Je teste effectivement l'élimination des auxiliaire est 1 gros plus.
Mon fichier fait déjà plus de 30000 lignes et me génère de lenteurs, rien à voir avec ton expertise évidement, mais je commence à me poser des questions.
Je reviens vers vous Job
Ines
 
Avec la solution précédente 2 lignes sont doublons si Débits OU Crédits sont identiques.

Avec cette solution 2 lignes sont doublons si Débits ET Crédits sont identiques :
Code:
=LN(NB.SI.ENS($E$2:$E$24;$E2;$G$2:$G$24;$G2;$N$2:$N$24;$N2;$O$2:$O$24;$O2;$P$2:$P$24;$
[/QUOTE]

Quelle solution est la plus lente, celle du post #5 ou celles du post #9 ?
C'est bien le post# 5 pour les lenteurs.
Votre solution #10 est très bien, mais j'ai besoin de tester.
Je vous ferai un retour sur le comportement du fichier.
Encore merci
Ines
 
Bonsoir
Mon fichier fait déjà plus de 30000 lignes et me génère de lenteurs, rien à voir avec ton expertise évidement, mais je commence à me poser des questions.
Pourquoi la mise en forme conditionnelle (MFC) n'est pas adaptée pour plus de 30 000 lignes

  • Évaluation cellulaire intensive :
    La MFC s'applique à chaque cellule individuellement. Pour 30 000+ lignes, Excel doit évaluer des milliers de règles en temps réel, ce qui ralentit considérablement le recalcul et l'affichage.
  • Surcharge de fonctions :
    Les fonctions utilisées dans les formules de MFC (comme NB.SI ou LN) sont recalculées à chaque modification de la feuille. Cela devient très lourd quand le nombre de cellules concernées augmente.
  • Impact sur la réactivité :
    Avec une MFC massive, toute modification ou défilement provoque une réévaluation globale, entraînant des délais et une expérience utilisateur dégradée.
Pourquoi cette solution VBA est efficace

  • Traitement en mémoire :
    Le code VBA charge toutes les données dans un tableau et les traite en mémoire. Les opérations sur un tableau (en VBA) sont bien plus rapides que de manipuler directement des milliers de cellules.
  • Utilisation d'un dictionnaire :
    Le dictionnaire permet de regrouper les doublons en une seule passe (en O(n)) sans devoir comparer chaque cellule individuellement, évitant ainsi des boucles imbriquées lentes.
  • Application groupée des formats :
    Au lieu de colorer cellule par cellule, la macro construit une plage (via Union) pour chaque groupe de doublons et applique la couleur en une seule opération.
  • Rapport avec hyperliens :
    En créant un rapport sur une feuille séparée, le code fournit une vue d'ensemble claire et navigable des doublons, sans surcharger la feuille principale.
Fonctionnement succinct du code VBA

  1. Lecture des données :
    Le code identifie la dernière ligne utilisée dans les colonnes ciblées et parcourt chaque ligne pour construire une clé de regroupement (en concaténant les valeurs des colonnes G, I, P, Q et R).
  2. Regroupement avec dictionnaire :
    Chaque clé est utilisée pour stocker dans un dictionnaire la liste des numéros de ligne où elle apparaît. Cela permet de repérer rapidement les doublons (les clés apparaissant plus d'une fois).
  3. Coloration dans la feuille d'origine :
    Pour chaque groupe de doublons, une couleur unique est générée (en choisissant dans une palette de couleurs claires) et appliquée aux cellules concernées.
  4. Création du rapport :
    Une nouvelle feuille "Rapport" est créée pour afficher, pour chaque groupe, la clé, le nombre d'occurrences et des hyperliens pointant vers les lignes d'origine.
En résumé, cette approche VBA contourne les limitations de la MFC en traitant les données de façon centralisée et en appliquant la mise en forme en masse, garantissant ainsi des performances optimales même avec des volumes de données importants.

VB:
Sub ListerDoublonsAvecLiensEtColorationFeuil1()
    Dim wsData As Worksheet, wsReport As Worksheet
    Dim dict As Object
    Dim colArr As Variant, c As Variant
    Dim lastRow As Long, ligne As Long
    Dim rowData As String
    Dim key As Variant
    Dim splittedRows As Variant
    Dim rowIndex As Long, groupIndex As Long
    Dim colorsArr As Variant, colorValue As Long
    Dim i As Long, j As Long, colIndex As Long
    
    Application.ScreenUpdating = False
    Application.Calculation = xlCalculationManual
    Randomize
    
    ' Définir la feuille contenant les données
    Set wsData = ThisWorkbook.Worksheets("Feuil1") ' Adaptez le nom si besoin
    
    ' Colonnes à prendre en compte pour la clé de regroupement
    colArr = Array("G", "I", "P", "Q", "R")
    
    ' Déterminer la dernière ligne utilisée parmi ces colonnes
    lastRow = 0
    For Each c In colArr
        lastRow = Application.WorksheetFunction.Max(lastRow, wsData.Cells(wsData.Rows.Count, c).End(xlUp).Row)
    Next c
    If lastRow < 2 Then
        MsgBox "Aucune donnée trouvée.", vbInformation
        GoTo Fin
    End If
    
    ' Créer un dictionnaire pour regrouper les lignes par clé
    Set dict = CreateObject("Scripting.Dictionary")
    For ligne = 2 To lastRow
        rowData = ""
        For Each c In colArr
            rowData = rowData & "|" & CStr(wsData.Cells(ligne, c).Value)
        Next c
        ' Si toutes les colonnes sont vides, ignorer
        If rowData = "|||||" Then GoTo SuiteLigne
        If dict.Exists(rowData) Then
            dict(rowData) = dict(rowData) & "," & ligne
        Else
            dict.Add rowData, CStr(ligne)
        End If
SuiteLigne:
    Next ligne
    
    ' Supprimer la feuille "Rapport" si elle existe déjà
    On Error Resume Next
    Application.DisplayAlerts = False
    Worksheets("Rapport").Delete
    Application.DisplayAlerts = True
    On Error GoTo 0
    
    ' Créer la nouvelle feuille de rapport
    Set wsReport = ThisWorkbook.Worksheets.Add
    wsReport.Name = "Rapport"
    
    ' En-têtes du rapport
    wsReport.Range("A1").Value = "Clé de regroupement"
    wsReport.Range("B1").Value = "Nb d'occurrences"
    wsReport.Range("C1").Value = "Lignes (hyperliens)"
    
    rowIndex = 2
    groupIndex = 1
    
    ' Palette de couleurs claires (modifiez ou complétez la palette si besoin)
    colorsArr = Array(RGB(144, 238, 144), RGB(173, 216, 230), RGB(255, 255, 224), RGB(255, 228, 181), RGB(221, 160, 221))
    
    ' Parcourir les groupes de doublons dans le dictionnaire
    For Each key In dict.Keys
        splittedRows = Split(dict(key), ",")
        If UBound(splittedRows) > 0 Then ' groupe de doublons (au moins 2 occurrences)
            ' Choisir une couleur pour ce groupe
            colorValue = colorsArr((groupIndex - 1) Mod (UBound(colorsArr) + 1))
            
            ' Remplir le rapport : clé et nombre d'occurrences
            wsReport.Cells(rowIndex, 1).Value = Mid(key, 2) ' Supprime le premier "|"
            wsReport.Cells(rowIndex, 2).Value = UBound(splittedRows) + 1
            
            ' Insérer en colonnes distinctes les hyperliens vers chaque ligne concernée (à partir de la colonne C)
            colIndex = 3
            For i = LBound(splittedRows) To UBound(splittedRows)
                wsReport.Hyperlinks.Add Anchor:=wsReport.Cells(rowIndex, colIndex), _
                    Address:="", _
                    SubAddress:="'" & wsData.Name & "'!G" & splittedRows(i), _
                    TextToDisplay:=splittedRows(i)
                colIndex = colIndex + 1
            Next i
            
            ' Appliquer la couleur sur la ligne du rapport (colonnes A jusqu'à la dernière colonne utilisée pour les liens)
            wsReport.Range(wsReport.Cells(rowIndex, 1), wsReport.Cells(rowIndex, colIndex - 1)).Interior.Color = colorValue
            
            ' **Coloration dans la feuille d'origine (Feuil1)**
            ' Pour chaque ligne du groupe, colorier les cellules des colonnes indiquées dans colArr
            For i = LBound(splittedRows) To UBound(splittedRows)
                For j = LBound(colArr) To UBound(colArr)
                    wsData.Range(colArr(j) & splittedRows(i)).Interior.Color = colorValue
                Next j
            Next i
            
            rowIndex = rowIndex + 1
            groupIndex = groupIndex + 1
        End If
    Next key
    
    If rowIndex = 2 Then
        MsgBox "Aucun doublon trouvé.", vbInformation
    Else
        MsgBox "Rapport créé dans la feuille 'Rapport' et coloration appliquée dans 'Feuil1'.", vbInformation
    End If
    
Fin:
    Application.Calculation = xlCalculationAutomatic
    Application.ScreenUpdating = True
End Sub
 
Dernière édition:
- Navigue sans publicité
- Accède à Cléa, notre assistante IA experte Excel... et pas que...
- Profite de fonctionnalités exclusives
Ton soutien permet à Excel Downloads de rester 100% gratuit et de continuer à rassembler les passionnés d'Excel.
Je deviens Supporter XLD

Discussions similaires

Réponses
5
Affichages
234
Réponses
4
Affichages
109
Réponses
12
Affichages
619
Réponses
3
Affichages
315
Retour