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

Bonsoir @DoubleZero

Regex : Mots entre Balises
Fonction : Mots avec caractères ITALIC
Gestion des Doublons : Colonne D et E (Résultat sans doublons)
Colonne A : Mise en couleurs chaine de caractères ITALIC / Mots entre Balises : Rouge + Gras (Doublons Inclus)

Code en Poste #10 Revus par celui ci-dessous via ce Poste#16 qui Semble conforme à la demande en Poste #1 et Poste #15.

VB:
Sub ExtractPatternsAvecBaliseSansDoublons()
    ' 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
    Dim arrKeys As Variant
    Dim j As Long
    Dim keysString As String
    ' Pour Chaques cellules / Gestions des doublons
    Dim italicsWordsDoublon As Object ' Dictionnaire pour les mots en italique
 
    Application.ScreenUpdating = False
    On Error GoTo ErrorHandler
 
    ' Initialiser le dictionnaire pour les mots en italique aux Global
        Set italicsWords = CreateObject("Scripting.Dictionary")
    ' Initialiser le dictionnaire pour les mots en italique Doublons -->> Déjà connus
        Set italicsWordsDoublon = 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
  
    ' Parcourir chaque cellule dans la colonne A
        For i = 2 To Rng.Rows.Count
     
            ' Identifier les mots en italique
                textItalique = IdentifierItalique(Rng(i), italicsWords)
         
            ' Récupération des clés dans un tableau
                arrKeys = italicsWords.Keys ' Tableau des clés
            ' Nettoyage des espaces autour des clés
                For j = LBound(arrKeys) To UBound(arrKeys)
                    arrKeys(j) = Trim(arrKeys(j)) ' Supprime les espaces
                    arrKeys(j) = Replace(arrKeys(j), Chr(160), "") ' Supprime les espaces insécables
                Next j
            ' Conversion des clés en chaîne de caractères (séparées par "|")
                keysString = Join(arrKeys, "|") ' Exemple : "Nom|Ville|Pays"
                Erase arrKeys
            ' Configuration de la regex
                 regex.pattern = "\([^)]*\)|\[[^\]]*\]|""[^""]*""|'[^']*'|«[^»]*»|\*[^*]*\*|_[^_]*_|(\|[^|]*\|)|" & keysString
            ' Ajouter le texte avec les balises trouvées en italique au texte original
                text = Rng.Cells(i, 1).Value
            ' 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
                    If Not italicsWordsDoublon.exists(match.Value) Then
                        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 Rng.Cells(i, 1).Characters(match.FirstIndex + 1, 1).Font.Italic = True Then
                                    patternType = "Italique"
                            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
                         
                        ' Remplir le dictonaire
                            italicsWordsDoublon.Add match.Value, True
                    Else
                        ' 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
                    End If
                    Next match
                End If
        Next i

' Libération des objets
    On Error Resume Next ' Pour éviter les erreurs si l'objet n'existe pas
    Set Sh = Nothing
    Set Rng = Nothing
    Set regex = Nothing
    Set matches = Nothing
    Set match = Nothing
    Set italicsWords = Nothing
    Set italicsWordsDoublon = Nothing
    On Error GoTo 0 ' Réactiver la gestion normale des erreurs

    ' Réinitialisation des variables simples
    i = 0
    textItalique = vbNullString
    text = vbNullString
    outputRow = 0
    patternType = vbNullString
    StartPos = 0

    ' Réinitialisation des tableaux et autres variables spécifiques
    arrKeys = Empty
    keysString = vbNullString
    j = 0

    ' Confirmation de déchargement (facultatif)
    Debug.Print "Toutes les variables ont été déchargées.", vbInformation, "Déchargement terminé"
    Application.ScreenUpdating = True
    Exit Sub

ErrorHandler:
    MsgBox "Erreur dans l'exécution : " & Err.Description, vbExclamation
' Libération des objets
    On Error Resume Next ' Pour éviter les erreurs si l'objet n'existe pas
    Set Sh = Nothing
    Set Rng = Nothing
    Set regex = Nothing
    Set matches = Nothing
    Set match = Nothing
    Set italicsWords = Nothing
    Set italicsWordsDoublon = Nothing
    On Error GoTo 0 ' Réactiver la gestion normale des erreurs

    ' Réinitialisation des variables simples
    i = 0
    textItalique = vbNullString
    text = vbNullString
    outputRow = 0
    patternType = vbNullString
    StartPos = 0

    ' Réinitialisation des tableaux et autres variables spécifiques
    arrKeys = Empty
    keysString = vbNullString
    j = 0

    ' Confirmation de déchargement (facultatif)
    Debug.Print "Toutes les variables ont été déchargées.", vbInformation, "Déchargement terminé"
  Application.ScreenUpdating = True
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 Trim(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
 ' Réinitialisation des variables simples
    i = 0
    word = vbNullString
    msg = vbNullString
    msgTemp = vbNullString

    ' Confirmation de déchargement (facultatif)
    Debug.Print "Les variables supplémentaires ont été déchargées.", vbInformation, "Déchargement terminé"
End Function
 
Dernière édition:
Re à tous, 🙂
Bonjour laurent950 🙂

Pour le fun, j'ai inclus les «» dans le motif. Pour le reste, je laisse la place aux pros 🤩

VB:
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)
         
            ' motif chaine incluse dans () [] et commencant par une majuscule sauf  «»
            .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
                        ElseIf m.Submatches(2) <> "" Then
                            r(, ii).Value = m.Submatches(2)    ' «»
                        End If
                    Next
                End If
            Next
        End With
    End With
    Application.ScreenUpdating = True
End Sub

Edit : pour moi il ne faut pas capturer ceci :
(anaphylactiques ou cutanées)
(inhibiteurs de la recapture de la sérotonine-noradrénaline)
(nausées, maux de ventre, toux)

klin89
 
Dernière édition:
Bonjour le fil,
une proposition avec 2 options possibles.
J'avais compris que chaque mot de la partie encadré (crochet, parenthèse, .... ou en italique) devait être inscrit séparément en colonne D.
J'ai vu le résultat avec le code de @laurent950, qui lui ne découpait pas chaque mot.
Sans savoir laquelle était la bonne interprétation (@DoubleZero nous le dira) j'ai laissé le 2. Le pilotage est fait par la constante DECOUPER_CHAQUE_MOT à positionner à True ou False
[EDIT] Nouvelle version du code avec le lien HyperTexte vers le Vidal
Ce qui me fait pencher plutôt pour une demande avec un découpage par mot car avec le groupe de mots, le lien hypertexte n'est pas vraiement pertinent
VB:
Option Explicit
Const DECOUPER_CHAQUE_MOT = True
Dim CelluleI As Range
Dim Trouve As Boolean

Sub EtablirListeNoire()
Dim i As Integer, j As Integer, k As Integer, l As Integer
Dim MotsListeNoire As String
Dim MotListeNoire As String
Dim UneLetrre As String
Dim Derligne As Double
    
    Application.ScreenUpdating = False
    Derligne = ActiveSheet.Cells(Rows.Count, 1).End(xlUp).Row
    ActiveSheet.Range("D:D").ClearContents

    k = 2
    For i = 2 To Derligne
        Set CelluleI = Cells(i, 1)
        Trouve = False
        MEF_TexteEncadré CelluleI, "(", ")"
        MEF_TexteEncadré CelluleI, "[", "]"
        MEF_TexteEncadré CelluleI, "«", "»"
        Mef_TexteItalique CelluleI
        '------------
        MotsListeNoire = ""
        If Trouve Then
            For j = 1 To Len(CelluleI.Value)
                If CelluleI.Characters(j, 1).Font.Bold And CelluleI.Characters(j, 1).Font.Color = vbRed Then
                    MotsListeNoire = MotsListeNoire & CelluleI.Characters(j, 1).text
                Else
                    If DECOUPER_CHAQUE_MOT Then
                        If MotsListeNoire <> "" Then
                            'fin de mot ou groupe de mot
                            MotListeNoire = ""
                            For l = 1 To Len(MotsListeNoire)
                                UneLetrre = Mid(MotsListeNoire, l, 1)
                                If UneLetrre <> " " And _
                                    UneLetrre <> "(" And _
                                    UneLetrre <> ")" And _
                                    UneLetrre <> "[" And _
                                    UneLetrre <> "]" And _
                                    UneLetrre <> "," And _
                                    UneLetrre <> "«" And _
                                    UneLetrre <> "»" And _
                                    UneLetrre <> "(" Then
                                    MotListeNoire = MotListeNoire & UneLetrre
                                Else
                                    'mot suivant
                                    If MotListeNoire <> "" Then
                                        Cells(k, 4) = MotListeNoire
                                        ActiveSheet.Hyperlinks.Add Anchor:=Cells(k, 4), Address:="https://www.vidal.fr/recherche.html?query=" & MotListeNoire, TextToDisplay:=MotListeNoire
                                        MotListeNoire = ""
                                        k = k + 1
                                    End If
                                End If
                            Next l
                            If MotListeNoire <> "" Then
                                Cells(k, 4) = MotListeNoire
                                ActiveSheet.Hyperlinks.Add Anchor:=Cells(k, 4), Address:="https://www.vidal.fr/recherche.html?query=" & MotListeNoire, TextToDisplay:=MotListeNoire
                                MotListeNoire = ""
                                k = k + 1
                            End If
                            MotsListeNoire = ""
                        End If
                    Else
                        ' pas de découpage par mot
                        If MotsListeNoire <> "" Then
                            'fin de mot ou groupe de mot
                            Cells(k, 4) = MotsListeNoire
                            MotsListeNoire = ""
                            k = k + 1
                        End If
                    End If
                End If
            Next j
        End If
    Next i

    Application.ScreenUpdating = True

End Sub

Sub Mef_TexteItalique(pCellule As Range)
Dim j As Integer
    For j = 1 To Len(pCellule.Value)
        If pCellule.Characters(j, 1).Font.Italic Then
            Trouve = True
            MEF_Applique pCellule, j, 1
        End If
    Next j
End Sub
Sub MEF_TexteEncadré(pCellule As Range, pRechDeb As String, pRechFin As String)
Dim Pos As Integer
Dim Fin As Boolean
Dim PosRechDeb As Integer, PosRechFin As Integer

    Fin = False
    Pos = 1
    While Not Fin
        PosRechDeb = InStr(Pos, pCellule.Value, pRechDeb)
        If PosRechDeb = 0 Then
            Fin = True
        Else
            ' Texte trouvé (
            PosRechFin = InStr(PosRechDeb, pCellule.Value, pRechFin)
            If PosRechFin <> 0 Then
                'groupe de mots trouvé
                Trouve = True
                MEF_Applique pCellule, PosRechDeb, PosRechFin - PosRechDeb + 1
                Pos = PosRechFin + 1
            Else
                Pos = PosRechDeb + 1
            End If
            If Pos > Len(pCellule) Then Fin = True
        End If
    Wend

End Sub
'----------------------------------------------------------------------------------------------------------------------------------
Sub MEF_Applique(pCellule As Range, pPosDeb As Integer, pLongueur As Integer)
    pCellule.Characters(pPosDeb, pLongueur).Font.Bold = True
    pCellule.Characters(pPosDeb, pLongueur).Font.Color = vbRed
End Sub
 
Dernière édition:
Bonsoir @klin89

Améliorations apportées : du code en poste #16

  1. Séparation en sous-procédures :
    • IdentifyItalics : Identifie les mots en italique.
    • BuildRegexFromDict : Construit une regex à partir des mots trouvés.
    • GetPatternType : Identifie le type de balise.
    • FormatText : Applique le formatage.
  2. Réduction des répétitions : Utilisation des sous-procédures pour éviter de dupliquer les mêmes tâches.
  3. Compact : Plus facile à lire et à maintenir.
VB:
Sub ExtractPatternsOptimized()
    Dim ws As Worksheet, rng As Range, cell As Range
    Dim regex As Object, matches As Object, match As Object
    Dim italicsDict As Object, foundDict As Object
    Dim outputRow As Long, patternType As String
    Dim matchValue As String, startPos As Long
    
    Application.ScreenUpdating = False
    On Error GoTo ErrorHandler
    
    ' Initialisation
    Set ws = Worksheets("a")
    Set rng = ws.Range(ws.Cells(2, 1), ws.Cells(ws.Rows.Count, 1).End(xlUp))
    Set regex = CreateObject("VBScript.RegExp")
    Set italicsDict = CreateObject("Scripting.Dictionary")
    Set foundDict = CreateObject("Scripting.Dictionary")
    regex.Global = True
    regex.IgnoreCase = True
    
    ' Nettoyage des colonnes D et E
    ws.Range("D2:E" & ws.Rows.Count).ClearContents
    outputRow = 2
    
    ' Parcourir les cellules
    For Each cell In rng
        ' Identifier les mots en italique
        Call IdentifyItalics(cell, italicsDict)
        
        ' Construire le pattern
        regex.Pattern = "\([^)]*\)|\[[^\]]*\]|""[^""]*""|'[^']*'|«[^»]*»|\*[^*]*\*|_[^_]*_|" & BuildRegexFromDict(italicsDict)
        
        If regex.Test(cell.Value) Then
            Set matches = regex.Execute(cell.Value)
            For Each match In matches
                matchValue = Trim(match.Value)
                If Not foundDict.exists(matchValue) And match.Value <> vbNullString Then
                    ' Détecter le type de balise
                    patternType = GetPatternType(matchValue, cell)
                    
                    ' Ajouter aux résultats
                    ws.Cells(outputRow, 4).Value = matchValue
                    ws.Cells(outputRow, 5).Value = patternType
                    outputRow = outputRow + 1
                    
                    ' Appliquer le formatage
                    startPos = InStr(1, cell.Value, matchValue, vbTextCompare)
                    If startPos > 0 Then FormatText cell, startPos, Len(matchValue)
                    
                    foundDict.Add matchValue, True
                ElseIf match.Value <> vbNullString Then
                    ' Appliquer le formatage
                    startPos = InStr(1, cell.Value, matchValue, vbTextCompare)
                    If startPos > 0 Then FormatText cell, startPos, Len(matchValue)
                End If
            Next match
        End If
    Next cell

Cleanup:
    Set ws = Nothing: Set rng = Nothing: Set regex = Nothing
    Set italicsDict = Nothing: Set foundDict = Nothing
    Application.ScreenUpdating = True
    Exit Sub

ErrorHandler:
    MsgBox "Erreur : " & Err.Description, vbExclamation
    Resume Cleanup
End Sub

Private Sub IdentifyItalics(ByVal cell As Range, ByRef dict As Object)
    Dim i As Integer, word As String
    word = ""
    For i = 1 To Len(cell.Value)
        If cell.Characters(i, 1).Font.Italic Then
            word = word & Mid(cell.Value, i, 1)
        ElseIf word <> "" Then
            If Not dict.exists(word) Then dict.Add word, True
            word = ""
        End If
    Next i
    If word <> "" And Not dict.exists(word) Then dict.Add word, True
End Sub

Private Function BuildRegexFromDict(ByVal dict As Object) As String
    Dim key As Variant, keys() As String, i As Integer
    i = 0
    If dict.Count > 0 Then
    ReDim keys(dict.Count - 1)
    For Each key In dict.keys
        keys(i) = Replace(key, "|", "\|") ' Échapper les barres verticales
        i = i + 1
    Next key
    BuildRegexFromDict = Join(keys, "|")
    End If
End Function

Private Function GetPatternType(ByVal text As String, ByVal cell As Range) As String
    Select Case True
        Case Left(text, 1) = "(" And Right(text, 1) = ")": GetPatternType = "Parenthèses"
        Case Left(text, 1) = "[" And Right(text, 1) = "]": GetPatternType = "Crochets"
        Case Left(text, 1) = """" And Right(text, 1) = """": GetPatternType = "Guillemets doubles"
        Case Left(text, 1) = "'" And Right(text, 1) = "'": GetPatternType = "Guillemets simples"
        Case Left(text, 1) = "«" And Right(text, 1) = "»": GetPatternType = "Guillemets français"
        Case Else
            GetPatternType = "Italique"
    End Select
End Function

Private Sub FormatText(ByVal cell As Range, ByVal startPos As Long, ByVal length As Long)
    With cell.Characters(startPos, length).Font
        .Color = RGB(255, 0, 0)
        .Bold = True
    End With
End Sub
 
Bonjour à t🙂utes et à t🙂us,

Depuis ce matin, je teste les cadeaux que vous m’avez offerts (les zones de texte (fond jaune) lancent une macro).

Par ordre alphabétique :

crocrocro, job75, jurassic pork, klin89, laurent950, patricktoulon, Rheeem,

Je vous remercie pour votre travail, votre patience.

Vous êtes des médecins qui ne peuvent tuer.

Cependant, mon petit neurone est sur le point d'expl😀oser !

Je vous souhaite une santé de fer, un moral d’acier, une année 2025 en… tout ce que la vie rend heureuse.

Merci encore et encore,

🙂🙂
 

Pièces jointes

bonjour ne ne sais pas pour vous
mais après avoir supprimé les lien hypertext supprimer la couleur
converti en html avec le .value(11) et récupération du innertext COMPLET DE LA PLAGE ENTIERE dans le html je me retrouve avec une ouverture et une fermeture de balise par les "( et )" dans deux cellules différentes
parti de là c'est compliqué de couper par les (...)
 
Hello DoubleZero,
c'est normal que ma macro ne marche pas dans Excel. C'est une macro pour Word. Et comme je l'indiquais vu que tu dois traiter du texte, cela serait plus approprié d'utiliser Word. Moi ce que j'ai fait c'est copier le texte de ta feuille Excel que j'ai mis dans un document Word et c'est dans ce document que j'ai mis ma macro. A noter que si tu veux tes résultats en table , on peut en créer dans Word. Il n'y a pas tout dans ce que je récolte , il faut modifier l'expression régulière mais je n'ai pas été plus loin vu que tu as beaucoup de propositions.
Ami calmant, J.P
 

Pièces jointes

Dernière édition:
Re à tous 🙂

La chaine contenue entre les guillemets à la française « » est toujours entourée d'espaces insécables.
J'ai modifié le regex pour obtenir la chaine sans ces espaces.

VB:
.Pattern = "«(?:\xA0|\s)*([^»]*?)(?:\xA0|\s)*»"

VB:
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)
        .Range(.Columns(2), .Columns(20)).ClearContents
        Set rng = .Range("a1", .Range("a" & .Rows.Count).End(xlUp))

        With CreateObject("VBScript.RegExp")
            .Global = True
            ' motif guillemet à la française « »
            .Pattern = "«(?:\xA0|\s)*([^»]*?)(?:\xA0|\s)*»"
            For Each r In rng
                ii = 1
                If .test(r.Value) Then
                    Set matches = .Execute(r.Value)
                    For Each m In matches
                        ii = ii + 1
                        r(, ii).Value = m.Submatches(0)    ' Capturer uniquement la chaîne sans espaces
                    Next
                End If
            Next
        End With
    End With
    Application.ScreenUpdating = True
End Sub
Corrigez-moi au cas où.
klin89
 
Re à tous 🙂

La chaine contenue entre les guillemets à la française « » est toujours entourée d'espaces insécables.
J'ai modifié le regex pour obtenir la chaine sans ces espaces.

VB:
.Pattern = "«(?:\xA0|\s)*([^»]*?)(?:\xA0|\s)*»"

VB:
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)
        .Range(.Columns(2), .Columns(20)).ClearContents
        Set rng = .Range("a1", .Range("a" & .Rows.Count).End(xlUp))

        With CreateObject("VBScript.RegExp")
            .Global = True
            ' motif guillemet à la française « »
            .Pattern = "«(?:\xA0|\s)*([^»]*?)(?:\xA0|\s)*»"
            For Each r In rng
                ii = 1
                If .test(r.Value) Then
                    Set matches = .Execute(r.Value)
                    For Each m In matches
                        ii = ii + 1
                        r(, ii).Value = m.Submatches(0)    ' Capturer uniquement la chaîne sans espaces
                    Next
                End If
            Next
        End With
    End With
    Application.ScreenUpdating = True
End Sub
Corrigez-moi au cas où.
klin89
 
Re à tous 🙂

La chaine contenue entre les guillemets à la française « » est toujours entourée d'espaces insécables.
J'ai modifié le regex pour obtenir la chaine sans ces espaces.

VB:
.Pattern = "«(?:\xA0|\s)*([^»]*?)(?:\xA0|\s)*»"

VB:
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)
        .Range(.Columns(2), .Columns(20)).ClearContents
        Set rng = .Range("a1", .Range("a" & .Rows.Count).End(xlUp))

        With CreateObject("VBScript.RegExp")
            .Global = True
            ' motif guillemet à la française « »
            .Pattern = "«(?:\xA0|\s)*([^»]*?)(?:\xA0|\s)*»"
            For Each r In rng
                ii = 1
                If .test(r.Value) Then
                    Set matches = .Execute(r.Value)
                    For Each m In matches
                        ii = ii + 1
                        r(, ii).Value = m.Submatches(0)    ' Capturer uniquement la chaîne sans espaces
                    Next
                End If
            Next
        End With
    End With
    Application.ScreenUpdating = True
End Sub
Corrigez-moi au cas où.
klin89
 
tBonour à toues et à tous,
Je vous remrcie iniiniment pour votre aide acharnée et bienveillante.
Pour l'heure, mon cerveau est contnue d''être suis HS
vous êtes adorable
Encore merci pour vos travaux acharnés à rendre la vie plus aisée.
Bien amicalement,
🙂🙂
P.S.Pardon pour mes "fôtes"...
 
- 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