Remplacer plusieurs boucles successives en une seule

Résolu
cs_tatayet Messages postés 10 Date d'inscription lundi 5 avril 2004 Statut Membre Dernière intervention 20 juillet 2006 - 20 juil. 2006 à 13:55
cs_tatayet Messages postés 10 Date d'inscription lundi 5 avril 2004 Statut Membre Dernière intervention 20 juillet 2006 - 20 juil. 2006 à 15:25
Tatayet






Bonjour je fais un traîtement sur un fichier word contenant environ 400-500 pages. Chaque page correspond a un bon de commande. Je mets en gras les lignes les plus importantes, 4 lignes par page. Mon soucis c'est que je passe 4 fois dans tout le fichier ce qui allonge le temps de triatement de la macro. Je voulais savoir si il est possible de remplacer 4 boucles successives en une seule.

   '-----------------------------------------------------------------------------
    '                     MISE EN GRAS DE LIGNES SPECIFIQUES
    '-----------------------------------------------------------------------------
    Selection.HomeKey Unit:=wdStory
    Selection.Find.ClearFormatting
    Selection.Find.Replacement.ClearFormatting
    With Selection.Find
        .MatchWildcards = True
        .Text = "SECTEUR"
        While .Execute
            Selection.Paragraphs(1).Range.Select
            Selection.Range.Bold = wdToggle
            Selection.Collapse wdCollapseEnd
        Wend
    End With
   
    Selection.HomeKey Unit:=wdStory
    Selection.Find.ClearFormatting
    Selection.Find.Replacement.ClearFormatting
    With Selection.Find
        .MatchWildcards = True
        .Text = "LIBELLE"
        While .Execute
            Selection.Paragraphs(1).Range.Select
            Selection.Range.Bold = wdToggle
            Selection.Collapse wdCollapseEnd
        Wend
    End With
   
    Selection.HomeKey Unit:=wdStory
    Selection.Find.ClearFormatting
    Selection.Find.Replacement.ClearFormatting
    With Selection.Find
        .MatchWildcards = True
        .Text = "COL "
        While .Execute
            Selection.Paragraphs(1).Range.Select
            Selection.Range.Bold = wdToggle
            Selection.Collapse wdCollapseEnd
        Wend
    End With
   
    Selection.HomeKey Unit:=wdStory
    Selection.Find.ClearFormatting
    Selection.Find.Replacement.ClearFormatting
    With Selection.Find
        .MatchWildcards = True
        .Text = "RECEPTION"
        While .Execute
            Selection.Paragraphs(1).Range.Select
            Selection.Range.Bold = wdToggle
            Selection.Collapse wdCollapseEnd
        Wend
    End With

EN GROS je voudrais que ca donne un truc comme ca au cas ou je me suis mal fais comprendre.

le code ci dessous ce fonctionne pas

    Selection.HomeKey Unit:=wdStory
    Selection.Find.ClearFormatting
    Selection.Find.Replacement.ClearFormatting
    With Selection.Find
        .MatchWildcards = True
        .Text = "SECTEUR" and  "LIBELLE" and  "COL " and  "RECEPTION"
        While .Execute
            Selection.Paragraphs(1).Range.Select
            Selection.Range.Bold = wdToggle
            Selection.Collapse wdCollapseEnd
        Wend
    End With
   

Merci d'avance de l'attention porté à ce message

9 réponses

ntm113 Messages postés 12 Date d'inscription dimanche 19 octobre 2003 Statut Membre Dernière intervention 20 juillet 2006
20 juil. 2006 à 15:18
Désolé il y avait un truc que j'ai pas vu mais je pouvais pas savoir :
Moi, mon code je l'avais mis directement dans ThisDocument. Mais si on le met dans un Module il faut présiser à quel document s'applique Paragraph. Donc là je suis sûr que çà marche :

For Each p In ActiveDocument.Paragraphs
        If InStr(p.Range.Text, "SECTEUR") Or InStr(p.Range.Text, "LIBELLE") _
        Or InStr(p.Range.Text, "COL") Or InStr(p.Range.Text, "RECEPTION") Then
           p.Range.Bold = True
        End If
    Next

Il fallait aussi remplacer wdToggle par True parce sinon çà fait passer les paragraphes qui sont déjà en gras en normal.

Sinon le meilleur moyen pour cibler une erreur c'est de passer en mode déboggage et de demander des espions express sur les différents éléments.
3
tof008 Messages postés 695 Date d'inscription jeudi 5 mai 2005 Statut Membre Dernière intervention 5 janvier 2010 33
20 juil. 2006 à 14:00
Tu peux eventuellement mettre 4 emplacements dans un tableau et tu boucle sur la longueur du tableau et les mettant a chaque fois dans une variable....
en gros :
for i = 1 to 4
emp = tab(i)
Selection.HomeKey Unit:=wdStory
    Selection.Find.ClearFormatting
    Selection.Find.Replacement.ClearFormatting
    With Selection.Find
        .MatchWildcards = True
        .Text = "" & emp & ""
        While .Execute
            Selection.Paragraphs(1).Range.Select
            Selection.Range.Bold = wdToggle
            Selection.Collapse wdCollapseEnd
        Wend
    End With
next

Je ne sais pas si c'est ca que tu veux mais j'espere que fca t aidera!

         (Si la réponse vous convient, appuyez sur réponse acceptée...).

                           Noubliez pas de lire le REGLEMENT 
0
cs_tatayet Messages postés 10 Date d'inscription lundi 5 avril 2004 Statut Membre Dernière intervention 20 juillet 2006
20 juil. 2006 à 14:14
Merci mais cela va juste alléger mon code mais pas ma macro. Je vois ce que tu veux dire mais il passera toujours 4 fois ds mon fichier






En fait j'ai page1
...
SECTEUR
...
LIBELLE
....
COL
COL
COL
COL
COL
COL
...
RECPETION


En fait j'ai page2
...

SECTEUR

...

LIBELLE

....

COL

...

RECPETION


En fait j'ai page3
...

SECTEUR

...

LIBELLE

....

COL
COL
COL
COL

...

RECPETION



.
.
.
.


En fait j'ai page450
...

SECTEUR

...

LIBELLE

....

COL
COL
...

RECPETION








donc il défile tout le document pour mettre toutes les lignes commencant par SECTEUR jusque la derniere page




aprés il reviens a la page 1 et il met toutes les lignes commencant par LIBELLE  jusque la derniere page




puis reviens à la page 1
et il met toutes les lignes commencant par COL  jusque la derniere page



puis reviens à la page 1
et il met toutes les lignes commencant par RECEPTION  jusque la derniere page








donc ca fais 4 passages, moi je voudrais n'en faire qu un
0
ntm113 Messages postés 12 Date d'inscription dimanche 19 octobre 2003 Statut Membre Dernière intervention 20 juillet 2006
20 juil. 2006 à 14:19
Je pense qu'utiliser la fonction Find n'est pas un bon moyen pour la rapidité.
Cette méthode revient à faire édition Rechercher et il n'y a pas moyen de rechercher 2 textes différents en même temps.

Une solution plus efficace serait de faire un truc du genre :

For Each p in Paragraphs
   If Instr(p.text,"SECTEUR") Or Instr(p.text,"LIBELLE") Or Instr(p.text,"COL ") Or Instr(p.text,"RECEPTION") Then
      p.Range.Bold = wdToggle
      p.Collapse wdCollapseEnd
   End If
Next
0

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

Posez votre question
cs_tatayet Messages postés 10 Date d'inscription lundi 5 avril 2004 Statut Membre Dernière intervention 20 juillet 2006
20 juil. 2006 à 14:32
Tatayet





Merci je pense que si je peux reduire le temps de traitement par cela ca m interesse franchement de plus qu au boulot ca tourne sur un p2. Par contre g du apprendre le vba il y a peu de temps donc g pas toute les notions.

Sur le code que tu m as donné le compilateur bloque sur "For Each p In Paragraphs"
mais je vois pas l 'erreur, faut il initialiser p ou la declarer en variable.
0
ntm113 Messages postés 12 Date d'inscription dimanche 19 octobre 2003 Statut Membre Dernière intervention 20 juillet 2006
20 juil. 2006 à 14:48
Non en fait c'est p.text qui marche pas mais là il faudrait que t'apprennes à te servir de l'aide. Pour avoir le texte du paragraphe p il faut faire  p.Range.Text

Le code qui marche sur mon PC est :

    For Each p In Paragraphs
        If InStr(p.Range.Text, "SECTEUR") Or InStr(p.Range.Text, "LIBELLE") _
        Or InStr(p.Range.Text, "COL") Or InStr(p.Range.Text, "RECEPTION") Then
           p.Range.Bold = wdToggle
        End If
    Next

Pense aussi à vérifier si tu n'es pas en Option Explicit dans quel cas il faut déclarer toutes les variables.
0
cs_tatayet Messages postés 10 Date d'inscription lundi 5 avril 2004 Statut Membre Dernière intervention 20 juillet 2006
20 juil. 2006 à 15:05
Tatayet





merci
il bloque toujours sur le For Each p In Paragraphs
néanmoins je vais essyaer de chercher dans l'aide et pour l'opton explicit si tu dis que le code est bon
pour l 'option explicit, c'etait décoché si c bien ds l 'onglet editeur menu outil "déclaration des vairables obligatoires"
0
cs_tatayet Messages postés 10 Date d'inscription lundi 5 avril 2004 Statut Membre Dernière intervention 20 juillet 2006
20 juil. 2006 à 15:14
Tatayet



'-----------------------------------------------------------------------------
    '                     MISE EN GRAS DE LIGNES SPECIFIQUES
    '-----------------------------------------------------------------------------
    Dim p As Object
   
   For Each p In Paragraphs
        If InStr(p.Range.Text, "SECTEUR") Or InStr(p.Range.Text, "LIBELLE") _
        Or InStr(p.Range.Text, "COL") Or InStr(p.Range.Text, "RECEPTION") Then
           p.Range.Bold = wdToggle
        End If
    Next

si je met dim p as variant ou rien du tout ca bloque qd meme sur le for each p in Paragraphes
0
cs_tatayet Messages postés 10 Date d'inscription lundi 5 avril 2004 Statut Membre Dernière intervention 20 juillet 2006
20 juil. 2006 à 15:25
Tatayet



Merci beaucoup en effet ca va beaucoup plus rapide, impressionnant.

Merci encore de l'attention, à une prochiane fois peut être.
0
Rejoignez-nous