XL 2021 Mots et maux : colorer et lister

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 !

DoubleZero

XLDnaute Barbatruc
Bonjour à toutes et à tous,

L'onglet "a" contient des mots parfois entre :
- parenthèses ;
- crochets ;
- parenthèses et crochets ;
- italique ;
- guillements.

Serait-il possible de :
- colorer les mots en rouge, gras mentionnés en colonne A et de les lister en colonne D ;
- accéder au site VIDAL (rubrique recherche du mot sélectionné en D).

Pardon pour mes propos sans doute confus... J'essaie de me "soigner" !

Je vous remercie infiniment pour votre aide,

🙂🙂
 

Pièces jointes

Bonjour
ha ben là mon ami tu n'a pas choisi le truc le plus facile a faire pour vba
en effet si tu cherchais des mots je te dirais dans un do/loop incrementé avec instr pour raccourcir les boucles

mais tu cherche une couleur ce qui implique que si on sort pas des sentiers battus ben ça va durer des plombes parce que il nous faut à tester lettres par lettres

sortir des sentiers battus = synonyme de patricktoulon ( même pas peur) 🤣 🤣 🤪

en effet pour ce genre de chose je ne suis pas en reste
je te propose donc une ébauche (en debug.print) en travaillant en mode html que tu arrangera à ta convenance
moyennant quelque replace et modif du value(11)de la plage (donc xml) renvoyé
je le transforme en html
et d’analyser donc les textes en html et de rechercher les balises "FONT" qui ont pour attribut color "#ff0000"
et on passe donc de plus de 4 minutes a quelques microsecondes

ha ben oui c'est ça le hors piste
ebauche
VB:
Sub test()
    Dim At$, p1$, p2$, code$, elem
    With CreateObject("htmlfile")
        code = Range("A1", Cells(Rows.Count, 1).End(xlUp)).Value(11)
        code = Replace(code, "html:", "")
        code = Replace(code, "ss:", "")
        code = "<Table" & Split(code, "<Table")(1)
        code = Split(code, "Table>")(0)

        code = Replace(Replace(code, "<Row", "<TR"), "<Cell", "<TD")
        code = Replace(Replace(code, "/Row", "/TR"), "/Cell", "/TD")
        For Each elem In .all
            For Each att In elem.Attributes
                If att.Name <> "color" Then elem.removeattribute (att)
            Next
        Next
        .body.innerhtml = code
        For Each elem In .all
            p1 = "": p2 = ""
            If elem.tagname = "FONT" Then
                If elem.getattribute("color") = "#ff0000" Then
                    p1 = elem.parentelement.tagname
                    p2 = elem.parentelement.parentelement.tagname

                    If p1 = "B" Or p2 = "B" Then At = "gras "
                    If p1 = "I" Or p2 = "I" Then At = At & "italic "

                    Debug.Print elem.innertext & " "; At
                End If
            End If
        Next

        'Debug.Print .body.innerhtml
    End With

End Sub
te reste plus qu'a regarder dans la console
Patrick
 
Bonjour le forum, 🙂
Salut à tous, 🙃

Pour un début, une petite macro pour trouver toute les chaines entre parenthèses à l'aide d'un Regex.
Mais bon, est-ce cela que tu recherches vraiment DoubleZero ?

VB:
Option Explicit

Sub test()
    Dim r As Range, rng As Range, ii As Long
    Dim m As Object, matches As Object
 
    Application.ScreenUpdating = False
    With Sheets(1)    ' Travailler avec la feuille en 1ère position
        ' Définir la plage contenant les données à analyser
        ' La plage commence à A1 et se termine à la dernière cellule non vide de la colonne A
        Set rng = .Range("a1", .Range("a" & Rows.Count).End(xlUp))

        ' Créer une instance de l'objet VBScript.RegExp pour les opérations regex
        With CreateObject("VBScript.RegExp")
            .Global = True    ' Activer la recherche globale (toutes les correspondances seront trouvées)
            .Pattern = "\((.*?)\)"    ' Définir le motif regex pour trouver du texte entre parenthèses

            ' Boucle sur chaque cellule de la plage définie
            For Each r In rng
                ii = 1    ' Réinitialiser l'index de colonne où écrire les résultats (commence à la colonne adjacente)

                ' Vérifier si le motif regex est présent dans la valeur de la cellule
                If .test(r.Value) Then
                    ' Exécuter le motif regex et obtenir toutes les correspondances dans la cellule
                    Set matches = .Execute(r.Value)

                    ' Boucler sur chaque correspondance trouvée
                    For Each m In matches
                        ii = ii + 1    ' Passer à la colonne suivante
                        ' Insérer la correspondance extraite dans la cellule correspondante
                        r(, ii).Value = m.Submatches(0)
                    Next
                End If
            Next
        End With
    End With
    Application.ScreenUpdating = True
End Sub
DoubleZero, peux-tu nous fournir des exemples de ce que tu souhaites ressortir, il faut nous fixer des règles bien précises pour l'extraction.

klin89
 
Dernière édition:
non moi j'ai compris "lister les mots ou expressions en rouge dans les textes qui sont dans la colonne A" avec annotation parenthèses guillemet etc....

l'inverse serait plus facile bien sur
mais chercher le texte en rouge implique l'examen du texte lettre par lettre
 
j'ai donc raison toutes les fonctions existante vba ne seront que les lourdes taches
donc comme c'est la couleur qui prévaut instr(x,texte," ")+1 sera la solution la plus courte
resultat 4 minutes sur toute la colonnes

ma solution propose de prendre les expressions dans les font color=#ff0000
résultat instantané sur toute la colonne
 
Re le forum, 🙂

J'ai remarqué que les noms de médicament figuraient entre parenthèses ou crochets et commençaient par une majuscule.

le pattern pour les capturer :
VB:
.Pattern = "\((\b[A-Z][^)]*?)\)|\[(\b[A-Z][^\]]*?)\]"
En conséquence, on ne tient pas compte de ceci :
(nausées, maux de ventre, toux)

VB:
Option Explicit
Sub test()
    Dim r As Range, rng As Range, ii As Long
    Dim m As Object, matches As Object

    Application.ScreenUpdating = False
    With Sheets(1)    ' Travailler avec la feuille en 1ère position
        .Range(.Columns(2), .Columns(20)).ClearContents
     
        ' Définir la plage contenant les données à analyser
        ' La plage commence à A1 et se termine à la dernière cellule non vide de la colonne A
        Set rng = .Range("a1", .Range("a" & Rows.Count).End(xlUp))

        ' Créer une instance de l'objet VBScript.RegExp pour les opérations regex
        With CreateObject("VBScript.RegExp")
            .Global = True    ' Activer la recherche globale (toutes les correspondances seront trouvées)

            .Pattern = "\((\b[A-Z][^)]*?)\)|\[(\b[A-Z][^\]]*?)\]"
            ' Boucle sur chaque cellule de la plage définie
            For Each r In rng
                ii = 1    ' Réinitialiser l'index de colonne où écrire les résultats (commence à la colonne adjacente)

                ' Vérifier si le motif regex est présent dans la valeur de la cellule
                If .test(r.Value) Then
                    ' Exécuter le motif regex et obtenir toutes les correspondances dans la cellule
                    Set matches = .Execute(r.Value)

                    ' Boucler sur chaque correspondance trouvée
                    For Each m In matches
                        ii = ii + 1    ' Passer à la colonne suivante
                        If m.Submatches(0) <> "" Then
                            r(, ii).Value = m.Submatches(0)    ' Parenthèses
                        ElseIf m.Submatches(1) <> "" Then
                            r(, ii).Value = m.Submatches(1)    ' Crochets
                        End If
                    Next
                End If
            Next
        End With
    End With
    Application.ScreenUpdating = True
End Sub
klin89
 

Pièces jointes

Bonsoir le Forum

Voici une explication concise du code :
  1. But principal :
    Le code recherche et extrait différents types de motifs (entre parenthèses, crochets, guillemets, italiques, etc.) dans la colonne A d'une feuille Excel. Les résultats sont enregistrés dans les colonnes D (valeur trouvée) et E (type de motif). Les éléments trouvés sont également mis en rouge et en gras dans la colonne A.
  2. Fonctionnement :
    • Une première boucle parcourt chaque cellule de la colonne A.
    • Un objet RegExp (expression régulière) identifie les motifs tels que :
      • Texte entre (), [], "", '', «», *...*, ou _..._.
    • Une fonction séparée, IdentifierItalique, identifie les mots en italique grâce à la mise en forme de la cellule.
    • Les résultats sont ajoutés dans un dictionnaire pour éviter les doublons.
    • Une autre fonction, MotItalique, applique une mise en forme rouge et en gras pour les mots italiques spécifiques. (à l'aide d'une autres fonction REGEX)
  3. Particularités :
    • Les mots en italique ne peuvent pas être détectés avec RegExp. Ils nécessitent une vérification de la propriété .Font.Italic des caractères dans chaque cellule.
    • Les motifs trouvés sont mis en forme directement dans la cellule d'origine (colonne A).
    • La gestion des erreurs empêche l'interruption en cas de problème.
  4. Résultat :
    À la fin de l'exécution, les colonnes D et E contiennent les valeurs et types de motifs trouvés, tandis que les mots et motifs dans la colonne A sont visuellement mis en évidence.
  5. Points d'amélioration :
    • Simplifier les fonctions pour éviter les répétitions.
    • Gérer les cas où des motifs se chevauchent dans le texte.
    • Clarifier la logique de séparation des mots italiques pour une meilleure lisibilité.
VB:
Sub ExtractPatternsAvecBalise()
    ' Recherche dans la colonne A pour détecter :
    ' - Parenthèses : ( ... )
    ' - Crochets : [ ... ]
    ' - Guillemets : " ... ", ' ... ', « ... »
    ' - Italiques : ...
    ' Résultats :
    ' - Colonne D : Mot trouvé entre les balises
    ' - Colonne E : Type de balise trouvé (ex. Parenthèses, Italique, etc.)
    ' Le texte trouvé est mis en rouge et gras dans la colonne A.
   
    Dim Sh As Worksheet
    Dim Rng As Range
    Dim i As Long
    Dim textItalique As String
    Dim text As String
    Dim regex As Object
    Dim matches As Object
    Dim match As Object
    Dim outputRow As Long
    Dim patternType As String
    Dim StartPos As Long
    Dim italicsWords As Object ' Dictionnaire pour les mots en italique
   
    Application.ScreenUpdating = False
    On Error GoTo ErrorHandler
   
    ' Initialiser le dictionnaire pour les mots en italique
        Set italicsWords = CreateObject("Scripting.Dictionary")
   
    ' Définir la feuille de calcul et la plage
    Set Sh = Worksheets("a")
    Set Rng = Sh.Range(Sh.Cells(2, 1), Sh.Cells(Sh.Rows.Count, 1).End(xlUp)) ' Commence à la ligne 2
   
    ' Effacer les anciennes données dans les colonnes D et E
    Sh.Range(Sh.Cells(2, 4), Sh.Cells(Sh.Rows.Count, 4)).ClearContents ' Colonne D
    Sh.Range(Sh.Cells(2, 5), Sh.Cells(Sh.Rows.Count, 5)).ClearContents ' Colonne E
   
    ' Initialiser la ligne de départ pour les résultats
    outputRow = 2
   
    ' Initialiser RegExp
    Set regex = CreateObject("VBScript.RegExp")
    regex.IgnoreCase = True
    regex.Global = True
   
    ' Définir le pattern pour capturer les éléments spécifiques
    regex.pattern = "\([^)]*\)|\[[^\]]*\]|""[^""]*""|'[^']*'|«[^»]*»|\*[^*]*\*|_[^_]*_|(\|[^|]*\|)"
   
    ' Parcourir chaque cellule dans la colonne A
    For i = 1 To Rng.Rows.Count
       
        ' Identifier les mots en italique
        textItalique = IdentifierItalique(Rng(i), italicsWords)
       
        ' Ajouter le texte avec les balises trouvées en italique au texte original
        text = Rng.Cells(i, 1).Value & " | " & textItalique
       
        ' Exécuter la recherche avec RegExp
        If regex.Test(text) Then
            Set matches = regex.Execute(text)
           
            ' Ajouter chaque correspondance dans la colonne D et le type en colonne E
            For Each match In matches
                Sh.Cells(outputRow, 4).Value = match.Value ' Colonne D : correspondance trouvée
               
                ' Déterminer le type de pattern trouvé
                If Left(match.Value, 1) = "(" And Right(match.Value, 1) = ")" Then
                    patternType = "Parenthèses"
                ElseIf Left(match.Value, 1) = "[" And Right(match.Value, 1) = "]" Then
                    patternType = "Crochets"
                ElseIf Left(match.Value, 1) = """" And Right(match.Value, 1) = """" Then
                    patternType = "Guillemets doubles"
                ElseIf Left(match.Value, 1) = "'" And Right(match.Value, 1) = "'" Then
                    patternType = "Guillemets simples"
                ElseIf Left(match.Value, 1) = "«" And Right(match.Value, 1) = "»" Then
                    patternType = "Guillemets français"
                ElseIf Left(match.Value, 1) = "|" Then
                    patternType = "Italique"
                    MotItalique textItalique, text, Rng, i
                Else
                    patternType = "Inconnu"
                End If
               
                ' Écrire le type dans la colonne E
                Sh.Cells(outputRow, 5).Value = patternType ' Colonne E : type de pattern
               
                ' Mettre en forme les mots trouvés dans la colonne A (rouge et gras)
                StartPos = InStr(1, text, match.Value, vbTextCompare)
                If StartPos > 0 Then
                    With Rng.Cells(i, 1).Characters(StartPos, Len(match.Value)).Font
                        .Color = RGB(255, 0, 0) ' Rouge
                        .Bold = True           ' Gras
                    End With
                End If
               
                ' Passer à la ligne suivante
                outputRow = outputRow + 1
            Next match
        End If
    Next i
   
    ' Libérer les objets
    Set Sh = Nothing
    Set Rng = Nothing
    Set regex = Nothing
    Set matches = Nothing
    Application.ScreenUpdating = True
    Exit Sub

ErrorHandler:
    MsgBox "Erreur dans l'exécution : " & Err.Description, vbExclamation
    Set Sh = Nothing
    Set Rng = Nothing
    Set regex = Nothing
    Set matches = Nothing
End Sub

Function IdentifierItalique(ByRef cell As Range, ByRef italicsWords As Object) As String
    Dim i As Integer
    Dim word As String
    Dim msg As String
    Dim msgTemp As String

    ' Initialiser la chaîne de message pour les mots en italique
    msg = ""
   
    ' Vérifie chaque caractère dans la cellule
    For i = 1 To Len(cell.Value)
        ' Si le caractère est en italique, l'ajouter à la chaîne de message
        If cell.Characters(i, 1).Font.Italic = True Then
            word = Mid(cell.Value, i, 1)
            msg = msg & word
                ' Ajouter un séparateur "|" après chaque mot en italique
                If cell.Characters(i + 1, 1).Font.Italic <> True Then
                    msgTemp = Application.Trim(Split(msg, "|")(UBound(Split(msg, "|"))))
                    If Not italicsWords.exists(msgTemp) Then
                    ' Ajouter le mot au dictionnaire
                        italicsWords.Add msgTemp, True
                        msg = msg & " | "
                        msgTemp = Empty
                    End If
                End If
        End If
    Next i
    ' Retourner le message des mots en italique
    If Len(msg) > 0 Then
        Debug.Print "Mots en italique trouvés dans la cellule " & cell.Address & ": " & msg
        IdentifierItalique = msg
    End If
End Function


Sub MotItalique(ByVal textItalique As String, ByVal text As String, _
                ByRef Rng As Range, ByVal j As Long)
    Dim Searsh As Variant
    Dim regex As Object
    Dim matches As Object
    Dim match As Object
    ' Initialiser RegExp
    Set regex = CreateObject("VBScript.RegExp")
    regex.IgnoreCase = True
    regex.Global = True
    Searsh = Split(textItalique, "|")
    For i = LBound(Searsh) To UBound(Searsh)
    regex.pattern = Trim(Searsh(i))
            If regex.Test(text) Then
                Set matches = regex.Execute(text)
                    For Each match In matches
                        ' Mettre en forme les mots trouvés dans la colonne A (rouge et gras)
                            StartPos = InStr(1, text, match.Value, vbTextCompare)
                                If StartPos > 0 And Len(match.Value) > 0 Then
                                    With Rng.Cells(j, 1).Characters(StartPos, Len(match.Value)).Font
                                        .Color = RGB(255, 0, 0) ' Rouge
                                        .Bold = True           ' Gras
                                    End With
                                End If
                    Next match
            End If
    Next i
End Sub
 
Hello,
c'est certainement plus facile à faire dans Word que dans Excel.
J'ai copié le texte du classeur à traiter dans un document word et avec cette macro dans word :

VB:
Sub RechercheMédicaments()
Dim find As Object, Liste1, Liste2
Set find = ActiveDocument.Content.find
    With find
        Do While .Execute(findText:="\([A-Z]*\)", MatchWildcards:=True, Forward:=True) = True
              Liste1 = Liste1 + .Parent.Text + ","
        Loop
    End With
    Debug.Print Left(Liste1, Len(Liste1) - 1)
Debug.Print "========================="
Set find = ActiveDocument.Content.find
    With find
        Do While .Execute(findText:="\[[A-Z]*\]", MatchWildcards:=True, Forward:=True) = True
              Liste2 = Liste2 + .Parent.Text + ","
        Loop
    End With
    Debug.Print Left(Liste2, Len(Liste2) - 1)
End Sub
.
et voici ce que j'obtiens :
(Mopral),(Valdoxan),(Stablon),(Prozac),(Befizal),(Lipanthyl),(Alteis),(Cartrex),(Voltarène),(Mobic),(Feldène),(Tilcotil),(Nurofen),(Apranax),(Seropram),(Seroplex),(Cymbalta),(Effexor)
=========================
[Smecta],[Rennieliquo],[Bedelix],[Doleptan],[Vogalène],[Primpéran],[Toplexil],[Muxol],[Bisolvon],[Lumirelax],[Miorel],[Cozaar],[Tareg],[Célébrex],[Arcoxia],[Dynastat]

Pour les mises en forme c'est plus facile aussi.

Ami calmant, J.P
 
Bonjour à tous
ho les gars !!! quand on vous dit lister les mots en rouge et éventuellement entre parentheses ou guillemet ou autres vous comprenez quoi vous ?

  1. recenser les mot entre symbole et éventuellement rouge?
  2. recenser les mots en rouge et éventuellement en symbole ?
comment fait on si le mot en rouge n'est pas entre symbole ?
par exemple ici recensés ou encore liste noire qui est entouré d'un espace entre le guillemets
1735458309143.png


je pense qu'il faut attendre notre ami double zero a fin d'avoir une demande claire
si tant est que ça lui soit possible

patrick
 
re
bonjour @job75 pour moi aussi c'est très clair
- colorer les mots en rouge, gras mentionnés en colonne A et de les lister en colonne D ;
ça veux bien dire ce que ça veut dire
lister tout les mots en rouge dans la colonne A dans la colonne D
ça veut bien dire que la recherche doit se faire EN PREMIER !! par la couleur et éventuellement les symboles qui entourent les mots ou expressions

donc pour moi ,toute fonction allant chercher les mots par des parenthèses ou autres en premier est hors contexte
je pense parler le français et le comprendre quand même même si @DoubleZero est légèrement confus dans sa demande
 
Bonjour à toutes et à tous,

Je vais tenter d'expliciter mes propos abscons.

Le texte mentionné en colonne A n'est qu'un copier-coller paru dans le Web. Aucun mot n'est de couleur rouge.

Je souhaiterais "simplement" appliquer un format rouge et gras dans le texte (en colonne A) selon leur entourage (cf. colonne E).

Merci mille fois pour votre travail et votre patience,

🙂🙂
 

Pièces jointes

- 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

Retour