Microsoft 365 afficher les doublon avec des couleurs

HASSEN@45

XLDnaute Nouveau
bonjour je souhaiterais que les villes qui se répètes s'affiche en rouge (juste les nom de villes pas la cellule exemple FRESNES)
merci pour votre aide
YZEURE 3584 : 9.7 - NEVERS 3593 : 11.4
FRESNES 3119 : 3.9 - SERVON 3383 : 19.1
ST MAXIMIN 3738 : 17.9
TROYES 1776 : 11.2 - LES VERGERS 1789 : 13.1
LECOURBE 116 : 14.1
BRIE 3109 : 11.7 - ATHIS MONS 3113 : 15.6
HERBLAY 3325 : 18.7
FRESNES 3119 : 26.0
EVREUX 1575 : 12.1 - DREUX 123 : 8.0
 

Staple1600

XLDnaute Barbatruc
Bonjour @JHA

J'étais parti sur la même idée mais en formule
(en colonne B)
=TEXTE.AVANT(A1;" ";1)
Puis MFC sur la colonne B - > Valeurs en double

Mais je suis dis qu'il faut aussi prendre en compte les autres villes dans la colonne A ( aprés le - ), alors cela ne fonctionne plus
 

Staple1600

XLDnaute Barbatruc
Re

@JHA
Alors du coup, je quitte les formules et je passe aussi dans PQ
PowerQuery:
let
    Source = Excel.CurrentWorkbook(){[Name="Tableau1"]}[Content],
    #"Personnalisée ajoutée" = Table.AddColumn(Source, "Personnalisé", each Text.Select([Colonne1], {"A".."Z"}))
in
    #"Personnalisée ajoutée"
Et ensuite idem
MFC sur colonne B -> Valeurs en double
 

laurent950

XLDnaute Barbatruc
Bonsoir @HASSEN@45

Pour rechercher et mettre en couleur les doublons (dans votre exemple : FRESNES) :
  • Avec Excel VBA en utilisant des expressions régulières :
  • Modifier "Feuil1" : ThisWorkbook.Sheets("Feuil1") par le nom de la feuille où sont les données.
  • Cette macro va parcourir toutes les cellules de la colonne A, rechercher des mots et les mettre en rouge s'ils sont des doublons.
Nota : j'ai pris le choix de SpecialCells(xlCellTypeLastCell) car cette méthode permet de trouver la dernière cellule utilisée dans la feuille de calcul, assurant ainsi que la boucle parcourt toutes les données réelles de la colonne, même si certaines lignes sont vides après cela. Cela rend le code plus robuste en s'assurant qu'il traite toutes les données disponibles.

VB:
Option Explicit
'
Sub ColorizeDuplicates()
  Dim rng As Range
  Dim cell As Range
  Dim dict As Object
  Dim regex As Object
  Dim matches As Object
  Dim match As Object
'
' Créer un dictionnaire pour stocker les valeurs et leurs occurrences
    Set dict = CreateObject("Scripting.Dictionary")
'
' Créer une expression régulière pour matcher les mots dans les cellules
    Set regex = CreateObject("VBScript.RegExp")
        With regex
            .Global = True
            .IgnoreCase = True
            .Pattern = "[a-zA-Z]+"
        End With
'
' Spécifier la plage de cellules à vérifier
    Set rng = ThisWorkbook.Sheets("Feuil1").Range("A1:A" & ThisWorkbook.Sheets("Feuil1").Cells.SpecialCells(xlCellTypeLastCell).Row)
'
' Parcourir chaque cellule dans la plage spécifiée
    For Each cell In rng
    ' Réinitialiser les correspondances
        Set matches = regex.Execute(cell.Value)
       
            ' Parcourir chaque mot correspondant dans la cellule
                For Each match In matches
                    ' Vérifier si le mot est déjà dans le dictionnaire
                        If dict.exists(LCase(match.Value)) Then
                            ' Si le mot est un doublon, mettre en couleur la partie correspondante de la cellule
                                cell.Characters(InStr(LCase(cell.Value), LCase(match.Value)), Len(match.Value)).Font.Color = RGB(255, 0, 0) ' Rouge
                        Else
                            ' Sinon, ajouter le mot au dictionnaire
                                dict(LCase(match.Value)) = 1
                        End If
                Next match
    Next cell
'
' Nettoyer les objets
    Set dict = Nothing
    Set regex = Nothing
    Set rng = Nothing
    Set cell = Nothing
    Set matches = Nothing
    Set match = Nothing
'
End Sub

Ce code va mettre en couleur que les mots qui sont des doublons dans chaque cellule de la colonne A, en respectant les conditions que vous avez spécifiées.
 

laurent950

XLDnaute Barbatruc
Bonsoir @HASSEN@45

J'ai optimisé le code en divisant le traitement des doublons en deux étapes distinctes. C'est une astuce pour gérer les doublons sans traiter les mêmes mots à plusieurs reprises.

Dans cette version modifiée, j'ai divisé le traitement en deux boucles
  • For Each cell In rng, chacune appelant la fonction ProcessCell (avec des dictionnaires différents dans un ordre spécifique) :
    • La première boucle For Each cell In rng utilise dictPremier comme premier dictionnaire, ce qui signifie que les mots rencontrés pour la première fois seront ajoutés à ce dictionnaire.
    • Ensuite, la deuxième boucle For Each cell In rng utilise dict comme premier dictionnaire, ce qui signifie que les mots déjà rencontrés seront ajoutés à ce dictionnaire.
Conclusion : Cela permet d'éviter de colorier les premières occurrences de doublons, car elles sont gérées dans la première boucle avec dictPremier, tandis que les occurrences suivantes sont colorées dans la deuxième boucle avec dict. Cette approche permet de ne colorier que les doublons, pas les mots uniques.

Je pense que c'est une astuce ingénieuse pour optimiser le traitement des doublons dans le code.

Code:
Option Explicit
'
Sub ColorizeDuplicates()
  Dim rng As Range
  Dim cell As Range
  Dim dictPremier As Object ' Le tous premier doublons.
  Dim dict As Object ' a partir du Deuxiéme doublons... 3,4,5,6 etc.
  Dim regex As Object
   
' Créer un dictionnaire pour stocker les valeurs et leurs occurrences (premier ensemble)
    Set dictPremier = CreateObject("Scripting.Dictionary")
' Créer un dictionnaire pour stocker les valeurs et leurs occurrences (à partir du deuxième ensemble)
    Set dict = CreateObject("Scripting.Dictionary")
   
' Créer une expression régulière pour matcher les mots dans les cellules
    Set regex = CreateObject("VBScript.RegExp")
        With regex
            .Global = True
            .IgnoreCase = True
            .Pattern = "[a-zA-Z]+"
        End With
'
' Spécifier la plage de cellules à vérifier
    Set rng = ThisWorkbook.Sheets("Feuil1").Range("A1:A" & ThisWorkbook.Sheets("Feuil1").Cells.SpecialCells(xlCellTypeLastCell).Row)
   
' Traiter chaque cellule dans la plage spécifiée
    For Each cell In rng
        ProcessCell cell, dictPremier, dict, regex ' Astuce ici "dictPremier, dict"
    Next cell
   
' Traiter chaque cellule dans la plage spécifiée
    For Each cell In rng
        ProcessCell cell, dict, dictPremier, regex ' Astuce ici "dict, dictPremier"
    Next cell
   
' Nettoyer les objets
    Set dict = Nothing
    Set regex = Nothing
    Set rng = Nothing
    Set cell = Nothing
End Sub

Sub ProcessCell(cell As Range, dictPremier As Object, dict As Object, regex As Object)
'     --------->>>>>  Astuce : dictPremier As Object, dict As Object
  Dim matches As Object
  Dim match As Object
   
' Réinitialiser les correspondances
    Set matches = regex.Execute(cell.Value)
   
' Traiter chaque mot correspondant dans la cellule
    For Each match In matches
    ' Vérifier si le mot est déjà dans le dictionnaire
        If dict.Exists(LCase(match.Value)) Then
        ' Si le mot est un doublon, mettre en couleur la partie correspondante de la cellule en rouge
            cell.Characters(InStr(LCase(cell.Value), LCase(match.Value)), Len(match.Value)).Font.Color = RGB(255, 0, 0) ' Red
        ' Ajouter le mot au dictionnaire du premier ensemble de doublons
            dictPremier(LCase(match.Value)) = 1
        Else
        ' Sinon, ajouter le mot au dictionnaire
            dict(LCase(match.Value)) = 1
        End If
    Next match
'
    Set matches = Nothing
    Set match = Nothing
End Sub
 

Dudu2

XLDnaute Barbatruc
Bonjour,
Avec une MFC directement sur le tableau.
Quant à ne mettre en rouge que la ville, franchement c'est rechercher la difficulté pour pas grand chose ! Ou alors faire preuve de logique et séparer la ville dans une colonne dédiée.
=SI(SOMMEPROD((GAUCHE(A$3:A$11;CHERCHE(" ";A3))=GAUCHE(A3;CHERCHE(" ";A3)))*1)>1;VRAI;FAUX)
 

Pièces jointes

  • Classeur villes MFC.xlsx
    16.5 KB · Affichages: 3
Dernière édition:

mapomme

XLDnaute Barbatruc
Supporter XLD
Bonjour à toutes, à tous et aux autres :),

@HASSEN@45 :),
De nombreux répondeurs se sont penchés sur votre question pour finalement constater que le fichier fourni diffère de "l'image" de la première question : notamment un nombre variable de villes pouvant être supérieur à 2, les données ne commencent qu'à la ligne 4, etc. Pourquoi ne pas avoir fourni un exemplaire de fichier dès le début (tel qu'il est conseillé dans la charte du site) ? Allez! Vous ferez mieux la prochaine fois ;) !
 

Staple1600

XLDnaute Barbatruc
Bonjour le fil

@mapomme (bon dimanche)
Sans oublier la non-anonymisation de la colonne Transporteur
(sujet également évoqué dans la charte du forum)
@HASSEN@45
Le forum offre une fonction d'édition des messages
(pour modifier le contenu du message et pour supprimer et modifier les pièces)
Tu n'as donc pas à attendre la prochaine fois pour corriger ton message#9
 

HASSEN@45

XLDnaute Nouveau
Bonjour à toutes, à tous et aux autres :),

@HASSEN@45 :),
De nombreux répondeurs se sont penchés sur votre question pour finalement constater que le fichier fourni diffère de "l'image" de la première question : notamment un nombre variable de villes pouvant être supérieur à 2, les données ne commencent qu'à la ligne 4, etc. Pourquoi ne pas avoir fourni un exemplaire de fichier dès le début (tel qu'il est conseillé dans la charte du site) ? Allez! Vous ferez mieux la prochaine fois ;) !
Bonjour @mapomme
Je ferais mieux la prochaine fois
 

HASSEN@45

XLDnaute Nouveau
Bonjour le fil

@mapomme (bon dimanche)
Sans oublier la non-anonymisation de la colonne Transporteur
(sujet également évoqué dans la charte du forum)
@HASSEN@45
Le forum offre une fonction d'édition des messages
(pour modifier le contenu du message et pour supprimer et modifier les pièces)
Tu n'as donc pas à attendre la prochaine fois pour corriger ton message#9
Bonjour staple1600
Je ferais mieu la prochaine fois
 

mapomme

XLDnaute Barbatruc
Supporter XLD
Re,

Un essai dans le fichier joint via une macro VBA (n'est-ce pas @Staple1600 :p).
Cliquer sur le bouton Hop! de la feuille "John".
La macro est dans Module1. Elle agit sur la feuille active.

nota : on a utilisé la dernière version du classeur que vous avez fourni en anonymisant les transporteurs 😜.

rem : préférez la version v2a qui a été débarrassée de ses deux instructions "DoEvents" inutiles qui n'étaient présentes que pour la mise au point.

edit : une version v3 plus efficace et plus rapide ICI.
 

Pièces jointes

  • HASSEN@45- colorer doublon- v2.xlsx.xlsm
    47.2 KB · Affichages: 8
  • HASSEN@45- colorer doublon- v2a.xlsx.xlsm
    47.3 KB · Affichages: 4
Dernière édition:

HASSEN@45

XLDnaute Nouveau
Re,

Un essai dans le fichier joint via une macro VBA (n'est-ce pas @Staple1600 :p).
Cliquer sur le bouton Hop! de la feuille "John".
La macro est dans Module1. Elle agit sur la feuille active.

nota : on a utilisé la dernière version du classeur que vous avez fourni en anonymisant les transporteurs 😜.

rem : préférez la version v2a qui a été débarrassée de ses deux instructions "DoEvents" inutiles qui n'étaient présentes que pour la mise au point.
Super, la macro est au top !
Après 4 mois de galère, merci beaucoup !
 

HASSEN@45

XLDnaute Nouveau
Bonsoir @HASSEN@45

J'ai optimisé le code en divisant le traitement des doublons en deux étapes distinctes. C'est une astuce pour gérer les doublons sans traiter les mêmes mots à plusieurs reprises.

Dans cette version modifiée, j'ai divisé le traitement en deux boucles
  • For Each cell In rng, chacune appelant la fonction ProcessCell (avec des dictionnaires différents dans un ordre spécifique) :
    • La première boucle For Each cell In rng utilise dictPremier comme premier dictionnaire, ce qui signifie que les mots rencontrés pour la première fois seront ajoutés à ce dictionnaire.
    • Ensuite, la deuxième boucle For Each cell In rng utilise dict comme premier dictionnaire, ce qui signifie que les mots déjà rencontrés seront ajoutés à ce dictionnaire.
Conclusion : Cela permet d'éviter de colorier les premières occurrences de doublons, car elles sont gérées dans la première boucle avec dictPremier, tandis que les occurrences suivantes sont colorées dans la deuxième boucle avec dict. Cette approche permet de ne colorier que les doublons, pas les mots uniques.

Je pense que c'est une astuce ingénieuse pour optimiser le traitement des doublons dans le code.

Code:
Option Explicit
'
Sub ColorizeDuplicates()
  Dim rng As Range
  Dim cell As Range
  Dim dictPremier As Object ' Le tous premier doublons.
  Dim dict As Object ' a partir du Deuxiéme doublons... 3,4,5,6 etc.
  Dim regex As Object
  
' Créer un dictionnaire pour stocker les valeurs et leurs occurrences (premier ensemble)
    Set dictPremier = CreateObject("Scripting.Dictionary")
' Créer un dictionnaire pour stocker les valeurs et leurs occurrences (à partir du deuxième ensemble)
    Set dict = CreateObject("Scripting.Dictionary")
  
' Créer une expression régulière pour matcher les mots dans les cellules
    Set regex = CreateObject("VBScript.RegExp")
        With regex
            .Global = True
            .IgnoreCase = True
            .Pattern = "[a-zA-Z]+"
        End With
'
' Spécifier la plage de cellules à vérifier
    Set rng = ThisWorkbook.Sheets("Feuil1").Range("A1:A" & ThisWorkbook.Sheets("Feuil1").Cells.SpecialCells(xlCellTypeLastCell).Row)
  
' Traiter chaque cellule dans la plage spécifiée
    For Each cell In rng
        ProcessCell cell, dictPremier, dict, regex ' Astuce ici "dictPremier, dict"
    Next cell
  
' Traiter chaque cellule dans la plage spécifiée
    For Each cell In rng
        ProcessCell cell, dict, dictPremier, regex ' Astuce ici "dict, dictPremier"
    Next cell
  
' Nettoyer les objets
    Set dict = Nothing
    Set regex = Nothing
    Set rng = Nothing
    Set cell = Nothing
End Sub

Sub ProcessCell(cell As Range, dictPremier As Object, dict As Object, regex As Object)
'     --------->>>>>  Astuce : dictPremier As Object, dict As Object
  Dim matches As Object
  Dim match As Object
  
' Réinitialiser les correspondances
    Set matches = regex.Execute(cell.Value)
  
' Traiter chaque mot correspondant dans la cellule
    For Each match In matches
    ' Vérifier si le mot est déjà dans le dictionnaire
        If dict.Exists(LCase(match.Value)) Then
        ' Si le mot est un doublon, mettre en couleur la partie correspondante de la cellule en rouge
            cell.Characters(InStr(LCase(cell.Value), LCase(match.Value)), Len(match.Value)).Font.Color = RGB(255, 0, 0) ' Red
        ' Ajouter le mot au dictionnaire du premier ensemble de doublons
            dictPremier(LCase(match.Value)) = 1
        Else
        ' Sinon, ajouter le mot au dictionnaire
            dict(LCase(match.Value)) = 1
        End If
    Next match
'
    Set matches = Nothing
    Set match = Nothing
End Sub
Merci bien pour le code, fin de galère.
Bonne journée.