bob188
Messages postés4Date d'inscriptionmercredi 23 mars 2011StatutMembreDernière intervention24 mars 2011
-
23 mars 2011 à 22:50
cs_loulou69
Messages postés672Date d'inscriptionmercredi 22 janvier 2003StatutMembreDerniè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
'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.
Renfield
Messages postés17287Date d'inscriptionmercredi 2 janvier 2002StatutModérateurDernière intervention27 septembre 202174 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.
bob188
Messages postés4Date d'inscriptionmercredi 23 mars 2011StatutMembreDernière intervention24 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.
bob188
Messages postés4Date d'inscriptionmercredi 23 mars 2011StatutMembreDernière intervention24 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?
Vous n’avez pas trouvé la réponse que vous recherchez ?
Renfield
Messages postés17287Date d'inscriptionmercredi 2 janvier 2002StatutModérateurDernière intervention27 septembre 202174 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
bob188
Messages postés4Date d'inscriptionmercredi 23 mars 2011StatutMembreDernière intervention24 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