HELP Suppression champs multi-lignes

Signaler
Messages postés
3
Date d'inscription
samedi 13 octobre 2007
Statut
Membre
Dernière intervention
16 octobre 2007
-
FPignon
Messages postés
3
Date d'inscription
samedi 13 octobre 2007
Statut
Membre
Dernière intervention
16 octobre 2007
-
Bonjour à tous,

Je suis nouvea sur le site, donc j'espère que je poste au bon endroit...

Je dois réaliser une macro dans Word qui doit supprimer certaines lignes identifiées par un numéro entre parenthèse en début de ligne

Mon document est de la forme suivante :

(7)Blablablablablabla

(12)Blablablablablabla
Blablablablablabla

(28)Blablablablablabla

(72)Blablablablablabla
Blablablablablabla

(152)Blablablablablabla
Blablablablablabla

(170)Blablablablablabla

(198)Blablablablablabla
Blablablablablabla
Blablablablablabla
Blablablablablabla

(200)Blablablablablabla
...

Je ne veux supprimer que les intitulés (28), (152) et (170) ainsi que leur contenu. J'ai donc fait la macro suivante :

Sub MacroSupChamp()
'
' MacroSupChamp Macro

Selection.Find.ClearFormatting

'Déclaration du tableau de champs
Dim mesChamps(3) As String
mesChamps(1) = "(28)"
mesChamps(2) = "(152)"
mesChamps(3) = "(170)"

' Déclaration du compteur
Dim i As Integer
i = 1

'début du parcours de tableau
While i < = 3

'Debut recherche
    Do
    With Selection.Find
        .Text = mesChamps(i) 'cherche le champ i du tableau
        .Replacement.Text = ""
        .Forward = True
        .Wrap = wdFindAsk
        .Format = False
        .MatchCase = False
        .MatchWholeWord = False
        .MatchWildcards = False
        .MatchSoundsLike = False
        .MatchAllWordForms = False
    End With

    Selection.Find.Execute 'execution de la macro, la selection apparait en surbrillance
'Fin recherche

'Suppression du champ sélectionné
    With Selection
        If .Find.Forward = True Then

            Selection.MoveRight Unit:= wdCharacter, Count:=0 'Place le curseur en début de ligne
            Selection.Extend 'active la fonction de sélection
            Selection.EndKey Unit: =wdLine 'Sélection jusqu'à la fin de la ligne
            Selection.TypeBackspace 'Effacer la ligne ainsi sélectionnée
            Selection.Fields.Update 'sortir de la fonction sélection (facultatif)

        End If
    End With
    'Selection.Find.Execute
    i = i + 1 'Passe à la recherche du champ suivant

    Loop While Selection.Find.Found 'Fin de la boucle

Wend ' fin du parcours de tableau

End Sub
Visiblement cela fonctionne pour les champs 28 et 170.
En revanche pour le champ 152 cela ne supprime que la première ligne (ce qui est logique vu que je ne sélectionne que la ligne qui suit l'intitulé numérique) mais pas la deuxième ligne.
Or, cette deuxième ligne faisant partie du contenu de (152) je dois la supprimer aussi.
Je peux d'ailleurs avoir aussi plusieurs ligne pour un même intitulé (pas seulement deux, cf. intitulé (198) dans mon exemple).

Je ne trouve donc pas comment dire que je prends la première ligne ainsi que les suivantes jusqu'à la prochaine ligne vide (vu que les intitulés et leur contenu sont chacun séparés par une ou plusieurs lignes vides)

J'ai quand même essayé ça :
Selection.EndKey Unit: =wdLine & "^p"
pour dire "jusqu'à la prochaine marque de paragraphe", mais ça ne fonctionne pas...

J'aimerai donc obtenir ce résultat là :

(7)Blablablablablabla

(12)Blablablablablabla
Blablablablablabla

(72)Blablablablablabla
Blablablablablabla

(198)Blablablablablabla
Blablablablablabla
Blablablablablabla
Blablablablablabla

(200)Blablablablablabla
...

Si quelqu'un pouvait me proposer une piste, un conseil, de l'aide, je lui en serait très reconnaissant ! :)

NB : je dois garder cette structure là de macro (càd : tableau des champs au début, parcours du tableau, recherche de l'intitulé, etc.)

Merci d'avance !

---------
FPignon

3 réponses

Messages postés
180
Date d'inscription
jeudi 21 août 2003
Statut
Membre
Dernière intervention
26 novembre 2007
1
Bonjour,

Je pense que pour répondre à ton besoin tu peux faire appel à "Selection.EndOf Unit:=wdParagraph, Extend:=wdExtend".

Sans trop entrer
dans les détails, voici ce que je te propose , note qu'au passage j'ai rectifié
quelques petites erreurs :

Selection.Find.ClearFormatting

'Déclaration du tableau de champs
Dim mesChamps(3) As String
mesChamps(1) = "(28)"
mesChamps(2) = "(152)"
mesChamps(3) = "(170)"

' Déclaration du compteur
Dim i As Integer
i = 1

'début du parcours de tableau
While i <= 3

'Debut recherche
    Do
    With Selection.Find
        .Text = mesChamps(i) 'cherche le champ i du tableau
        .Replacement.Text = ""
        .Forward = True
        .Wrap = wdFindAsk
        .Format = False
        .MatchCase = False
        .MatchWholeWord = False
        .MatchWildcards = False
        .MatchSoundsLike = False
        .MatchAllWordForms = False
    End With

    Selection.Find.Execute 'execution de la macro, la selection apparait en surbrillance
'Fin recherche

    If Not Selection.Find.Found Then Exit Do
   
'Suppression du champ sélectionné
    With Selection
        If .Find.Forward = True Then

            Selection.MoveRight Unit:=wdCharacter, Count:=0 'Place le curseur en début de ligne
            Selection.Extend 'active la fonction de sélection
            Selection.EndOf Unit:=wdParagraph, Extend:=wdExtend
            Selection.TypeBackspace 'Effacer la ligne ainsi sélectionnée
            Selection.Fields.Update 'sortir de la fonction sélection (facultatif)

        End If
    End With
   
    'Selection.Find.Execute

    Loop While Selection.Find.Found 'Fin de la boucle
    i = i + 1 'Passe à la recherche du champ suivant

Wend ' fin du parcours de tableau

Bonne programmation.

Cordialement medelidrissi

<hr />En Informatique, rien n'est impossible. Mais, ce n'est pas toujours évident.
Messages postés
3
Date d'inscription
samedi 13 octobre 2007
Statut
Membre
Dernière intervention
16 octobre 2007

Bonsoir Medelidrissi,

Avant toute chose, merci beaucoup pour ta réponse et tes corrections

Ca fonctionne mais pas totalement :os Je m'explique :

Quand j'ai une intitulé et un contenu du type :
(52)Blablablablabla
Blablablablabla
Ca fonctionne pas à tous les coups. (M'enfin c'est déjà mieux que ce que j'avais fait :))
Par contre là où c'est plus ennuyeux c'est quand j'ai des cas avec plusieurs ligne comme :
(99)Blablablablabla
Blablablablabla
Blablablablabla
Blablablablabla
Blablablablabla
Blablablablabla

Blablablablabla
Blablablablabla
Blablablablabla
où là ça me supprime la première et le deuxième ligne et ensuite ça passe à l'intitulé suivant de mon tableau de départ. Donc ça me laisse encore tout le reste du contenu :
Blablablablabla
Blablablablabla
Blablablablabla
Blablablablabla

Blablablablabla
Blablablablabla
Blablablablabla
 et je ne vois pas comment y remédier, parce que ta commande avec "wdParagraph" me paraissait être ce qu'il me manquait pour dire "tout le paragraphe" (vu que je peux avoir plusieurs lignes de contenu..) mais là je sèche..

Aurais tu une autre piste...?

Merci encore

 

---------
FPignon
Messages postés
3
Date d'inscription
samedi 13 octobre 2007
Statut
Membre
Dernière intervention
16 octobre 2007

Enf ait je me dis qu'il faudrait trouver comment dire supprime tout ce qu'il y a après l'intitulé numérique jusqu'àcelui qui suit.

Par exemple si je dois supprimer le champ (63) dans le contexte suivant :

(63)Blablablablablablablabla
Blablablablablablablabla
Blablablablablablablabla

Blablablablablablablabla

(88)Blablablablablablablabla
Blablablablablablablabla
Blablablablablablablabla

faudrait pouvoir dire : supprime à partir de (63) (qui serait l'incide i das mon tableau de départ) jusqu'à la prochaine parenthèse ouvrante (non-incluse) çàd ici la parenthèse du (88)

De cette façon je pourrais régler le problème du multilignes ainsi que la possibilité d'avoir une ligne vide dans un contenu, etc.

Si tu as une idée ?

ou même d'autres VBnautes :) n'hésitez pas

---------
FPignon