Remplacer plusieurs boucles successives en une seule [Résolu]

cs_tatayet 10 Messages postés lundi 5 avril 2004Date d'inscription 20 juillet 2006 Dernière intervention - 20 juil. 2006 à 13:55 - Dernière réponse : cs_tatayet 10 Messages postés lundi 5 avril 2004Date d'inscription 20 juillet 2006 Dernière intervention
- 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

Afficher la suite 

Votre réponse

9 réponses

Meilleure réponse
ntm113 12 Messages postés dimanche 19 octobre 2003Date d'inscription 20 juillet 2006 Dernière intervention - 20 juil. 2006 à 15:18
3
Merci
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.

Merci ntm113 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 101 internautes ce mois-ci

Commenter la réponse de ntm113
tof008 707 Messages postés jeudi 5 mai 2005Date d'inscription 5 janvier 2010 Dernière intervention - 20 juil. 2006 à 14:00
0
Merci
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 
Commenter la réponse de tof008
cs_tatayet 10 Messages postés lundi 5 avril 2004Date d'inscription 20 juillet 2006 Dernière intervention - 20 juil. 2006 à 14:14
0
Merci
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
Commenter la réponse de cs_tatayet
ntm113 12 Messages postés dimanche 19 octobre 2003Date d'inscription 20 juillet 2006 Dernière intervention - 20 juil. 2006 à 14:19
0
Merci
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
Commenter la réponse de ntm113
cs_tatayet 10 Messages postés lundi 5 avril 2004Date d'inscription 20 juillet 2006 Dernière intervention - 20 juil. 2006 à 14:32
0
Merci
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.
Commenter la réponse de cs_tatayet
ntm113 12 Messages postés dimanche 19 octobre 2003Date d'inscription 20 juillet 2006 Dernière intervention - 20 juil. 2006 à 14:48
0
Merci
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.
Commenter la réponse de ntm113
cs_tatayet 10 Messages postés lundi 5 avril 2004Date d'inscription 20 juillet 2006 Dernière intervention - 20 juil. 2006 à 15:05
0
Merci
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"
Commenter la réponse de cs_tatayet
cs_tatayet 10 Messages postés lundi 5 avril 2004Date d'inscription 20 juillet 2006 Dernière intervention - 20 juil. 2006 à 15:14
0
Merci
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
Commenter la réponse de cs_tatayet
cs_tatayet 10 Messages postés lundi 5 avril 2004Date d'inscription 20 juillet 2006 Dernière intervention - 20 juil. 2006 à 15:25
0
Merci
Tatayet



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

Merci encore de l'attention, à une prochiane fois peut être.
Commenter la réponse de cs_tatayet

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.