Précédent   Forum des professionnels en informatique > Logiciels > Microsoft Office > Word > VBA Word
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 30/01/2012, 20h39   #1
Invité de passage
 
Inscription : janvier 2012
Messages : 2
Détails du profil
Informations forums :
Inscription : janvier 2012
Messages : 2
Points : 1
Points : 1
Par défaut passer en revue tous les paragraphes d'un document

J'ai fait une macro pour changer automatiquement le style d'un paragraphe, si la première lettre = £
Les instructions qui sont dans le corps de la macro fonctionnent bien, pour un paragraphe, mais quand je lance la macro complète, le programme reste bloqué sur le premier paragraphe et ne passe jamais au suivant.
Comment faire pour que la macro passe en revue tous les paragraphes du document ?
Ci-dessous la macro :

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
Sub TEST2()
Dim par As Paragraph
For Each par In ActiveDocument.Paragraphs
 
    Selection.HomeKey Unit:=wdLine
    Selection.MoveRight Unit:=wdCharacter, Count:=1, Extend:=wdExtend
    If Selection = "£" Then
    Selection.HomeKey Unit:=wdLine
    Selection.EndKey Unit:=wdLine, Extend:=wdExtend
    Selection.Style = ActiveDocument.Styles("Titre 5")
    End If
 
Next par
 
End Sub
isardi est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 31/01/2012, 01h37   #2
Rédacteur/Modérateur
 
Avatar de Sepia
 
Homme JF Jousseaume
Inscription : octobre 2007
Messages : 2 390
Détails du profil
Informations personnelles :
Nom : Homme JF Jousseaume
Âge : 48
Localisation : France

Informations professionnelles :
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : octobre 2007
Messages : 2 390
Points : 3 356
Points : 3 356
Salut isardi,

Ta macro pose beaucoup de problèmes car elle part (certainement) de l'enregistreur de macros. Mais je vais les expliquer au fur et à mesure car cette macro est vraiment un cas d'école. Tous les macros vont (enfin devraient ) fonctionner, tu peux donc t'arrêter à la 1ère qui corrige rapidement ton pb.

Étape 1: Tu veux adapter le code que l'enregistreur de macros t'a fourni, au plus simple
Pb1-1 : L'enregistreur de macro travaille sur l'objet Sélection mais ta boucle travaille sur l'objet ActiveDocument ==> Affecte ton objet Selection au paragraphe que tu utilises dans ta boucle
Pb1-2 : L'enregistreur de macro enregistre ce que tu fais mais pas forcément ce que tu veux ==> ici tu as utilisé la touche End pour sélectionner ton paragraphe de test mais en fait End sélectionne la ligne et comme l'affectation d'un style se base sur un paragraphe, tu dois utiliser <Ctrl>+<Maj>+<flêche bas> qui sélectionne ton paragraphe
Code :
Selection.MoveDown Unit:=wdParagraph, Count:=1, Extend:=wdExtend
Pb1-3 : L'enregistreur de macro n'enregistre tout ce que tu fais ==> la sélection du paragraphe suffit, il n'y a pas besoin de déselectionner le 1er caractère ==> on supprime la ligne inutile
Citation:
Selection.HomeKey Unit:=wdLine
==> code de l'algo n° 1 (très beurk )
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
Sub AffecteLeStyleTitre5SiLeParagrapheCommenceParUnMarqueur()
    Dim aPara As Paragraph
 
    For Each aPara In ActiveDocument.Paragraphs
        aPara.Range.Select
        Selection.HomeKey Unit:=wdLine
        Selection.MoveRight Unit:=wdCharacter, Count:=1, Extend:=wdExtend
        If Selection = "£" Then
            Selection.MoveDown Unit:=wdParagraph, Count:=1, Extend:=wdExtend
            Selection.Style = ActiveDocument.Styles("Titre 5")
        End If
    Next
End Sub
Étape 2: Tu veux adapter le code que l'enregistreur de macros t'a fourni mais on vient de voir que la boucle travaille sur l'objet ActiveDocument et pas sur l'objet Selection ==> on va l'utiliser en gardant le même principe :
  • Sélectionner les paragraphes, les uns après les autres
  • Vérifier si le 1er caractère du paragraphe sélectionné correspond au marqueur
  • Si oui, comme le paragraphe est déjà sélectionné, on lui applique directement le traitement
  • On passe au suivant
==> code de l'algo n° 2 (seulement beurk )
Code :
1
2
3
4
5
6
7
8
9
10
Sub AffecteLeStyleTitre5SiLeParagrapheCommenceParUnMarqueur()
    Dim aPara As Paragraph
 
    For Each aPara In ActiveDocument.Paragraphs
        aPara.Range.Select
        If InStr(aPara, "£") = 1 Then
            Selection.Style = ActiveDocument.Styles("Titre 5")
        End If
    Next
End Sub

Étape 3: Tu veux adapter le code que l'enregistreur de macros t'a fourni mais on vient de voir que la boucle travaille sur l'objet ActiveDocument et pas sur l'objet Selection ==> on ne va plus utiliser l'objet Selection en gardant le même principe :
Mais sur un objet comme Paragraph, la fonction Select n'est pas dispo. Il faut alors passer par un truc très spécifique du VBA, le Range. Le Range (en gros) désigne la plage visuelle qui représente graphiquement l'objet et va permettre d'utiliser l'objet au travers la fenêtre que vous utilisez dans Word. Attention, c'est super puissant mais bonjour, l'arrachage de cheveux au départ avant de bien le comprendre et le maitriser (mais c'est essentiel, non vital en VBA)
==> code de l'algo n° 3 (presque pas beurk )
Code :
1
2
3
4
5
6
7
8
9
10
Sub AffecteLeStyleTitre5SiLeParagrapheCommenceParUnMarqueur()
    Dim aPara As Paragraph
 
    For Each aPara In ActiveDocument.Paragraphs
        aPara.Range.Select
        If InStr(aPara, "£") = 1 Then
            aPara.Style = ActiveDocument.Styles("Titre 5")
        End If
    Next
End Sub
Étape 4: On vient de voir que la boucle travaille sur l'objet ActiveDocument et pas sur l'objet Selection, mais si on n'utilise plus l'objet Selection, on effectue quand même une sélection ==> on ne va plus utiliser de sélection ==> on casse le principe de l'enregistreur de macros :
On commence donc par supprimer cette sélection dont on ne veut plus
Citation:
aPara.Range.Select
Et ben c'est tout puisque la variable aPara désigne la paragraphe et que la boucle le fait passer un à un sur tous les paragraphes, c'est OK
==> code de l'algo n° 4 (plus du tout beurk voire )
Code :
1
2
3
4
5
6
7
8
9
Sub AffecteLeStyleTitre5SiLeParagrapheCommenceParUnMarqueur()
    Dim aPara As Paragraph
 
    For Each aPara In ActiveDocument.Paragraphs
        If InStr(aPara, "£") = 1 Then
            aPara.Style = ActiveDocument.Styles("Titre 5")
        End If
    Next
End Sub
Certes cette réponse est un peu longue mais elle a pour but de faire comprendre le passage entre l'enregistreur de macro et du code VBA avec des boucles. Attention, l'enregistreur de macro reste un outil puissant et rien n'est plus rapide que lui pour disposer d'une fonction rapide qui fonctionne en une seule fois mais qui est réutilisable sur plusieurs fichiers (en gros un seul traitement pour plusieurs fichiers alors que le VBA permet de faire plusieurs fois le même traitement (ou différents traitements aussi) pour plusieurs fichiers).

@+
Sepia est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 31/01/2012, 21h58   #3
Invité de passage
 
Inscription : janvier 2012
Messages : 2
Détails du profil
Informations forums :
Inscription : janvier 2012
Messages : 2
Points : 1
Points : 1
Merci beaucoup pour cette réponse très détaillée et parfaitement claire.
J'avais déjà fait des macros sur Excel, mais jamais sur Word, et faute de connaître l'instruction adéquate pour extraire le premier caractère d'un paragraphe, j'ai "bricolé" à partir de l'enregistreur de macros. Effectivement, il n'y a pas photo entre mon code et le tien (je parle du code final) : concis et efficace !
isardi est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/02/2012, 02h04   #4
Rédacteur/Modérateur
 
Avatar de Sepia
 
Homme JF Jousseaume
Inscription : octobre 2007
Messages : 2 390
Détails du profil
Informations personnelles :
Nom : Homme JF Jousseaume
Âge : 48
Localisation : France

Informations professionnelles :
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : octobre 2007
Messages : 2 390
Points : 3 356
Points : 3 356
Salut isardi,

Citation:
Envoyé par isardi
Merci beaucoup pour cette réponse très détaillée et parfaitement claire.
On est là pour ça
Citation:
J'avais déjà fait des macros sur Excel, mais jamais sur Word, et faute de connaître l'instruction adéquate pour extraire le premier caractère d'un paragraphe, j'ai "bricolé" à partir de l'enregistreur de macros.
Ce "bricolage" comme tu dis est habituel avec l'enregistreur de macros et que tu ne connais le VBA de Word mais pour apprendre il faut bien commencer un jour.

Citation:
Effectivement, il n'y a pas photo entre mon code et le tien (je parle du code final) : concis et efficace !
Merci
Sepia est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 07h04.


 
 
 
 
Partenaires

Hébergement Web