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 Junior
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...
Bonsoir

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
Bonsoir Laurent, job75, le forum,
Oui tout à fait, le fichier comprend au moins une data importante.
J'ai besoin de vérifier si mes écritures comptables contiennent des doublons.
La solution de job75 fonctionne et je te remercie parce que j'apprends une nouvelle fois sur ce forum.
Laurent, j'ai un niveau plus que limité en VB, tu pourrais me proposer ta solution ?
Te remerciant par avance
Ines
 
Bonsoir @Ines99, @job75,

@job75 est vraiment très compétent en matière de fonctions Excel, et j'apprends également beaucoup grâce à ses solutions, qui sont toujours très pertinentes.

Cependant, lorsque le volume de données devient trop important, il est souvent préférable d’adopter une approche plus optimisée avec VBA. Certes, VBA peut sembler complexe au premier abord, mais il devient un atout indispensable, notamment dans des métiers comme le vôtre où l'efficacité et la rapidité de traitement sont essentielles.

Le code que je propose ici n’est qu’une illustration des possibilités offertes par VBA. N’hésitez pas à l’essayer : vous constaterez rapidement la différence en termes de performances et de confort d’utilisation, surtout lorsque la maîtrise de ce type de code s’affine.

Je vous encourage vivement à vous initier directement au VBA orienté objet, qui est, selon moi, la meilleure approche pour exploiter pleinement la puissance d’Excel.

Oui, bien sûr.

Dans votre fichier de travail :
  • Feuille de données: Assurez-vous que la ligne suivante pointe bien vers l’onglet contenant votre tableau de données :
    vba
    Modifier
    Set wsData = ThisWorkbook.Worksheets("Feuil1") ' Remplacez "Feuil1" par le nom de votre onglet si nécessaire
  • Colonnes à analyser: Le code regroupe les doublons en fonction des valeurs présentes dans les colonnes suivantes :
    vba
    Modifier
    colArr = Array("G", "I", "P", "Q", "R") ' Adaptez les lettres des colonnes selon votre fichier>
  • Automatisation : Une fois ces éléments ajustés, le reste du processus s'exécute automatiquement.
N’hésitez pas à tester et à me faire un retour si besoin. 😊

Laurent
 
Dernière édition:
Bonsoir @Ines99, @job75,

@job75 est vraiment très compétent en matière de fonctions Excel, et j'apprends également beaucoup grâce à ses solutions, qui sont toujours très pertinentes.

Cependant, lorsque le volume de données devient trop important, il est souvent préférable d’adopter une approche plus optimisée avec VBA. Certes, VBA peut sembler complexe au premier abord, mais il devient un atout indispensable, notamment dans des métiers comme le vôtre où l'efficacité et la rapidité de traitement sont essentielles.

Le code que je propose ici n’est qu’une illustration des possibilités offertes par VBA. N’hésitez pas à l’essayer : vous constaterez rapidement la différence en termes de performances et de confort d’utilisation, surtout lorsque la maîtrise de ce type de code s’affine.

Je vous encourage vivement à vous initier directement au VBA orienté objet, qui est, selon moi, la meilleure approche pour exploiter pleinement la puissance d’Excel.

Oui, bien sûr.

Dans votre fichier de travail :
  • Feuille de données: Assurez-vous que la ligne suivante pointe bien vers l’onglet contenant votre tableau de données :
    vba
    Modifier
    Set wsData = ThisWorkbook.Worksheets("Feuil1") ' Remplacez "Feuil1" par le nom de votre onglet si nécessaire
  • Colonnes à analyser: Le code regroupe les doublons en fonction des valeurs présentes dans les colonnes suivantes :
    vba
    Modifier
    colArr = Array("G", "I", "P", "Q", "R") ' Adaptez les lettres des colonnes selon votre fichier>
  • Automatisation : Une fois ces éléments ajustés, le reste du processus s'exécute automatiquement.
N’hésitez pas à tester et à me faire un retour si besoin. 😊

Laurent
Merci pour tes conseils Laurent, je vais les suivre.
Aligné toi.
Tu pourras m'expliquer ce que tu entends par "VBA orienté objet".
Ines
 
Maintenant pour ce qui est de la durée d'exécution de la MFC sur 34500 lignes exécutez cette macro :
VB:
Sub Test()
Dim t
t = Timer
[A2:P24].Copy [A25:P34501]
MsgBox Timer - t
End Sub
Chez moi sur Win 11 Excel 2019 :

- avec la MFC du post #9 => 1,2 seconde sur tableau structuré

- avec la MFC du post #10 => 0,75 seconde.

Il n'y a donc aucun problème de rapidité.
 
Maintenant pour ce qui est de la durée d'exécution de la MFC sur 34500 lignes exécutez cette macro :
VB:
Sub Test()
Dim t
t = Timer
[A2:P24].Copy [A25:P34501]
MsgBox Timer - t
End Sub
Chez moi sur Win 11 Excel 2019 :

- avec la MFC du post #9 => 1,2 seconde sur tableau structuré

- avec la MFC du post #10 => 0,75 seconde.

Il n'y a donc aucun problème de rapidité.
job75,
Ah bon, je suis sur windows 11 aussi et Excel 365
 
Ah bon ? Laurent pense que le VBA est nécessaire, moi j'ai montré que c'est inutile ici.
Oui mais il n'a quelque part pas tort non plus et sa proposition me semble hyper intéressante.
J'ai juste 2 autres colonnes qui contiennent des formules.
Je pense que mon fichier qui contient la data annuel est aussi conséquent.
Donc, je suis bien entendu intéressé à consulter vos propositions
Ines
 
- 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
200
Réponses
12
Affichages
403
Réponses
3
Affichages
278
Retour