Faire boucle dans macro Word en VB

Signaler
-
 JeanClaudeDusse -
Bonjour,

Je voudrais faire des macros dans Word, pour faire des suppressions automatiques ou des déplacements automatiques de paragraphes standardisés.

J'ai créé une macro via le machin Word qui enregistre les actions faites au clavier, le problème, c'est que je sais pas comment faire une boucle pour que les actions se fassent sur chaque nouveau paragraphe et ce jusqu'à la fin du document Word: ça s'arrête à la fin du premier paragraphe. Je suis débutant et je comprends pas encore bien le Visual Basic, alors je crois qu'il y a un truc avec "Loop" mais je sais pas comment faire concrètement et je comprends pas ce que je peux voir sur internet à ce sujet...

Est-ce que qn peut m'aider? Merci d'avance.
Je vous poste le code obtenu jusqu'à présent:

Sub XmlToLpEffacerChampsInutiles()
'
' XmlToLpEffacerChampsInutiles Macro
' Macro enregistrée le 09/11/2013 par JeanClaude
'
    Selection.Find.ClearFormatting
    With Selection.Find
        .Text = "<identifiant>"
        .Replacement.Text = ""
        .Forward = True
        .Wrap = wdFindContinue
        .Format = False
        .MatchCase = False
        .MatchWholeWord = False
        .MatchWildcards = False
        .MatchSoundsLike = False
        .MatchAllWordForms = False
    End With
    Selection.Find.Execute
    Selection.MoveLeft Unit:=wdCharacter, Count:=1
    Selection.MoveDown Unit:=wdParagraph, Count:=1, 

Extend:=wdExtend
    Selection.TypeBackspace
    Selection.Find.ClearFormatting
    With Selection.Find
        .Text = "<image>"
        .Replacement.Text = ""
        .Forward = True
        .Wrap = wdFindContinue
        .Format = False
        .MatchCase = False
        .MatchWholeWord = False
        .MatchWildcards = False
        .MatchSoundsLike = False
        .MatchAllWordForms = False
    End With
    Selection.Find.Execute
    Selection.MoveLeft Unit:=wdCharacter, Count:=1
    Selection.MoveDown Unit:=wdParagraph, Count:=3, 

Extend:=wdExtend
    Selection.TypeBackspace
    Selection.Find.ClearFormatting
    With Selection.Find
        .Text = "<enqueteur>"
        .Replacement.Text = ""
        .Forward = True
        .Wrap = wdFindContinue
        .Format = False
        .MatchCase = False
        .MatchWholeWord = False
        .MatchWildcards = False
        .MatchSoundsLike = False
        .MatchAllWordForms = False
    End With
    Selection.Find.Execute
    Selection.MoveLeft Unit:=wdCharacter, Count:=1
    Selection.MoveDown Unit:=wdParagraph, Count:=11, 

Extend:=wdExtend
    Selection.TypeBackspace
    Selection.Find.ClearFormatting
    With Selection.Find
        .Text = "<DonneesMorpho>"
        .Replacement.Text = ""
        .Forward = True
        .Wrap = wdFindContinue
        .Format = False
        .MatchCase = False
        .MatchWholeWord = False
        .MatchWildcards = False
        .MatchSoundsLike = False
        .MatchAllWordForms = False
    End With
    Selection.Find.Execute
    Selection.MoveLeft Unit:=wdCharacter, Count:=1
    Selection.MoveDown Unit:=wdParagraph, Count:=2, 

Extend:=wdExtend
    Selection.TypeBackspace
    Selection.Find.ClearFormatting
    With Selection.Find
        .Text = "<type>"
        .Replacement.Text = ""
        .Forward = True
        .Wrap = wdFindContinue
        .Format = False
        .MatchCase = False
        .MatchWholeWord = False
        .MatchWildcards = False
        .MatchSoundsLike = False
        .MatchAllWordForms = False
    End With
    Selection.Find.Execute
    Selection.MoveLeft Unit:=wdCharacter, Count:=1
    Selection.MoveDown Unit:=wdParagraph, Count:=9, 

Extend:=wdExtend
    Selection.TypeBackspace
End Sub

5 réponses

Messages postés
18038
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
232
Bonjour,
Je ne travaille personnellement pas avec Word, mais serais étonné de ce que n'existe pas une collection Paragrahs dont chaque élément est précisément un paragraphe.
Dès lors ta boucle peut être du genre :
For each p in paragraphs
  .... ton code
next

ou encore
For i = 1 to paragraphs.count
  .... code à appliquer au paragraphe paragrahs(i)
Next

Enfin ... c'est ce que je pense d'instinct.
Messages postés
18038
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
232
C'est bien ce que je pensais ...
Lis donc la solution figurant dans cette discussion pour un problème presque identique au tien :
http://computer-programming-forum.com/1-vba/e47b3fe5c461f458.htm
Te reste à adapter à tes transformations à toi.

Merci mais dans le topic que tu cites, y a pas la réponse à la question posée... :(
Messages postés
18038
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
232
Ah ?
et pourtant :
citation :
"je sais pas comment faire une boucle pour que les actions se fassent sur chaque nouveau paragraphe et ce jusqu'à la fin du document Word"
A chaque nouveau paragraphe, la collection Paragraphs est incrémentée de 1 unite (Paragraphs.count), non ?
Si l'index du pararaphe précédent était n, celui du nouveau sera n+1 (forcément)
Un paragraphe d'index x est à traiter lorsque tu passes au suivant (x+1)
Cà, c'est la logique.
Je te laisse maintenant là, si tu permets...il me faudrait sinon aller moi-même dans Word, son VBA, et écrire tout à ta place ... Or, Word n'est pas ma tasse de thé.

Par ailleurs : si tout cela te parait à ce point complexe : ne fais donc ton traitement qu'in fine, avec une boucle sur les éléments de la collection paragraphs. Si, par contre, tu tiens à le faire au fur et à mesure : à toi de te retrousser les manches pour ce qui n'intéresse vraiment que toi.
Bonne chance.

>si tout cela te parait à ce point complexe : ne fais donc ton >traitement qu'in fine, avec une boucle sur les éléments de la >collection paragraphs.

non, ça m'est complètement égal en fait.
Bon, merci de ta réponse, je vais essayer de comprendre en relisant ton message et l'autre forum (pour être franc, je pense que je me démerderais mieux pour comprendre du chinois - au moins en chinois y a des dicos lol)
merci
A+