Recherche expression + insérer texte + regexp

bob188 Messages postés 4 Date d'inscription mercredi 23 mars 2011 Statut Membre Dernière intervention 24 mars 2011 - 23 mars 2011 à 22:50
cs_loulou69 Messages postés 672 Date d'inscription mercredi 22 janvier 2003 Statut Membre Dernière intervention 2 juin 2016 - 24 mars 2011 à 16:46
Bonjour,

Je dois écrire une macro qui recherche un motif dans un fichier. Dès que ce caractère est trouvé, la macro doit sauter une ligne et écrire le texte fin_balise. Il doit le faire pour toutes les occurences du mot dans le fichier. Sur un exemple cela donne ça:

Protocol : ICMP-55
fin_balise

Pour ce faire, j'ai écrit ce programme :

Sub Balises()

Dim newExpr As String

' Deplacement du curseur en debut de document
Selection.Start = ActiveDocument.Content.Start
Selection.End = ActiveDocument.Content.Start

'Proprietes de la recherche a effectuer
With Selection.Find
.ClearFormatting
.Text = "^Protocol[\t ]*:[\t ]*([^ \t]+)[\t ]*"
.Forward = True
.Wrap = wdFindStop 'On arrête la recherche à la fin du document
.MatchWildcards = True 'Pour accepter les recherches avec expressions régulières
End With

'Ajout de la nouvelle expression pour chaque occurrence trouvée
While Selection.Find.Execute

newExpr = "fin_balise"

Selection.InsertParagraphAfter
Selection.InsertAfter (newExpr)
Selection.Start = Selection.End + 1
Selection.End = Selection.Start

Wend

'Replacement du curseur en debut de document
Selection.Start = ActiveDocument.Content.Start
Selection.End = ActiveDocument.Content.Start
End Sub


Pour rechercher le mot, j'utilise une expression régulière : "Protocol[\t ]*:[\t ]*([^ \t]+)[\t ]*"

Le programme plante au niveau du While Selection.Find.Execute et c'est l'expression régulière qui ne passe pas car l'exécution se passe bien si je ne mets pas d'expression régulière.

Est-ce que quelqu'un aurait une idée?

Bob188

8 réponses

Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 74
24 mars 2011 à 09:36
tu aurais un bout de fichier un peu plus gros pour faire la mise au point de ton code ?

tu joues dans un document Word, pas un fichier texte ?

J'ai des doutes sur le fait que Word accepte les regex...
une chaine avec des * et des ? ok (wildcards) mais des regexp...

enfin et d'une manière générale, que ce soit dans Excel ou Word, on a rarement a modifer la selection pendant une macro...
ca permet d'eviter de géner l'utilisateur et accelère l'execution.

Renfield - Admin CodeS-SourceS - MVP Visual Basic & Spécialiste des RegExp
0
bob188 Messages postés 4 Date d'inscription mercredi 23 mars 2011 Statut Membre Dernière intervention 24 mars 2011
24 mars 2011 à 10:13
Je suis dans un word qui contient des données et à la fin de chaque paquet de données, il y a une ligne qui commence par Protocol : suivi de caractères alphanumériques.
Ex: Protocol : ICMP-44

Le but est de rajouter fin_balise à la ligne en dessous de Protocol

Je pense que VB accepte les regex car je me suis inspiré de tutoriaux traitant du sujet pour écrire ma macro.
0
Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 74
24 mars 2011 à 10:40
Pas de Regexp a ce niveau là de Word...

je ferai juste :
    With CreateObject("VbScript.Regexp")
        .Pattern = "(\bProtocol\s*:\s*\S+\s*)"
        .Multiline = True
        .Global = True
        ActiveDocument.Content = .Replace(ActiveDocument.Content, "$1fin_balise" & vbNewLine)
    End With



Renfield - Admin CodeS-SourceS - MVP Visual Basic & Spécialiste des RegExp
0
bob188 Messages postés 4 Date d'inscription mercredi 23 mars 2011 Statut Membre Dernière intervention 24 mars 2011
24 mars 2011 à 14:56
Cela marche bien effectivement sur le principe. Le code est plus concis qu'avec ma proposition. Le problème est que je lance la macro word dans un document formaté qui contient des styles (titre1, Titre2), des images et des tableaux. Le fait de lancer cette macro me supprime toute la mise en forme du document, avec les tableaux et images qui vont avec. Comment rétablir cette mise en forme?
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 74
24 mars 2011 à 15:19
la disparition du style viens de ma manipulation de la propriété .Content, qui ne donne accès qu'au texte.


simplement faire :
Sub Balises()
Dim r As Range
Dim nPos As Long
    Set r = ActiveDocument.Range
    With r.Find
        .ClearFormatting
        .Text = "Protocol*:*" & Chr$(11) '# Saut de paragraphe
        .Forward = True
        .Wrap = wdFindStop 'On arrête la recherche à la fin du document
        .MatchWildcards = True
        
        Do While .Execute
            r.InsertAfter "fin_balise" & Chr$(11)
            r.Start = r.End + 1
            r.End = r.Start
        Loop
    End With
End Sub


Renfield - Admin CodeS-SourceS - MVP Visual Basic & Spécialiste des RegExp
0
bob188 Messages postés 4 Date d'inscription mercredi 23 mars 2011 Statut Membre Dernière intervention 24 mars 2011
24 mars 2011 à 16:10
A la suite du lancement de cette macro, vb ne reconnait pas l'expression Protocol: suivie de caractères alphanumériques et n'ajoute pas fin_balise. Visiblement les expressions régulières sont assez limitées en VB word... Dommage que la solution précédente enlève la mise en forme car cela marchait
0
Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 74
24 mars 2011 à 16:43
euh, on n'utilise pas d'expression regulière ici, un simple masque tout au plus...

j'ai pu tester ma macro, elle fonctionne.
mais je n'ai pas ton document, donc...
a TOI de jouer ^^

tentes en supprimant le premier Chr$(11) par exemple

Renfield - Admin CodeS-SourceS - MVP Visual Basic & Spécialiste des RegExp
0
cs_loulou69 Messages postés 672 Date d'inscription mercredi 22 janvier 2003 Statut Membre Dernière intervention 2 juin 2016 1
24 mars 2011 à 16:46
bonjour bob188, bonjour renfield

Le saut de paragraphe se code chapeau p
Essayez de Remplacer Chr$(11) par "^p"
0
Rejoignez-nous