formateur informatique

Pour chaque paragraphe d'un document Word, For Each VBA

Accueil  >  Bureautique  >  Word  >  Word VBA  >  Pour chaque paragraphe d'un document Word, For Each VBA
Livres à télécharger


Pour partager cette vidéo sur les réseaux sociaux ou sur un site, voici son url :


Inscription Newsletter    Abonner à Youtube    Vidéos astuces Instagram
Sujets que vous pourriez aussi aimer :


Parcourir les paragraphes en VBA Word

Dans le volet précédent des astuces VBA Word, nous avons appris à éliminer automatiquement un caractère spécifique sur la globalité d'un document. En l'occurrence, il s'agissait de la tabulation lorsque celle-ci était placée en introduction de paragraphe. Et pour cela, nous avions exploité la méthode Find de l'objet VBA Selection. Mais cette méthode a ses limites. Elle ne nous permet pas de tout maîtriser.

Et précisément, avec cette nouvelle astuce, nous allons voir comment parcourir tous les paragraphes d'un document pour en étudier les spécificités et réaliser automatiquement des interventions de retouche.

Document source et objectif
Pour la démonstration de cette technique, nous proposons d'appuyer les découvertes sur le même document que celui de l'astuce précédente. Nous retrouvons donc le document avec cette page de garde, le sommaire et cette alternance d'orientations en son sein.
  • Faire défiler le document vers le bas jusqu'à atteindre la troisième page,
Elle est numérotée 1/7 dans le pied de page. En effet, la page de garde et le sommaire ne sont pas considérés dans la numérotation. A ce titre, nous avions appris à décaler le début de la numérotation des pages dans un document Word.

Après le titre et en entête des deux premiers paragraphes, vous notez la présence de tabulations.

Tabulations en entêtes de paragraphes Word à remplacer par des retraits de première ligne

Mais c'est le cas aussi sur d'autres paragraphes, y compris pour d'autres pages. Vous pouvez le constater en faisant défiler le document vers le bas. Nous l'avons expliqué dans le volet précédent, les tabulations doivent être exploitées pour réaliser des alignements fractionnés à l'intérieur même des paragraphes. Mais lorsqu'il s'agit de réaliser des décalages en entête, ces sont les retraits qui doivent être utilisés. Grâce à cette nouvelle astuce donc, nous proposons de parcourir tous les paragraphes du document Word avec le code VBA pour déceler la présence de ces tabulations illicites et pour les remplacer automatiquement par des retraits. En l'occurrence, il s'agit de retraits de première ligne. En effet, les autres lignes des paragraphes ne doivent pas être impactées.

For Each paragraph
Nous l'avions démontré en VBA Excel, il existe une boucle atypique permettant de parcourir tous les éléments d'un groupe. Il s'agit de la boucle For Each. Avec Excel, nous l'avions exploitée, notamment pour parcourir toutes les cellules d'une sélection. Avec Word, nous allons l'utiliser pour parcourir tous les paragraphes du document.
  • Réaliser le raccourci clavier ALT + F11 pour basculer dans l'éditeur VBA Word,
  • Dans l'explorateur de projet sur la gauche, double cliquer sur l'élément ThisDocument,
Il s'agit de l'élément ThisDocument du document chaque-paragraphe-du-document.

Feuille de code VBA du document Word actif

Ainsi, nous affichons la feuille de code VBA associée à nos pages, au centre de l'écran. Certes à ce stade elle est encore vierge.
  • Dans cette feuille de code, créer la procédure Corriger comme suit :
Sub Corriger()

End Sub


Nous pourrons soit l'associer à un bouton, soit l'exécuter directement depuis l'éditeur. Nous l'avons dit, sont rôle est de remplacer les tabulations en entêtes de paragraphes par un retrait de première ligne. Nous devons parcourir tous les paragraphes à la recherche de ces défauts. Et pour cela, nous avons besoin de déclarer un objet du même type.
  • Dans les bornes de la procédure, ajouter la déclaration VBA suivante :
Sub Corriger()
Dim paragraphe As Paragraph

End Sub


Nous déclarons donc une variable nommée paragraphe en français comme un objet VBA Word de type Paragraph.

Maintenant, nous devons nous assurer de n'omettre aucune ligne lors de l'inspection. Donc, il est nécessaire de débuter le traitement à partir du début du document, si d'aventure le point d'insertion avait été déplacé. Grâce aux astuces précédentes, nous connaissons bien certaines méthodes de déplacement associées à l'objet VBA Selection.
  • A la suite du code, ajouter l'instruction VBA suivante :
Sub Corriger()
Dim paragraphe As Paragraph

Selection.HomeKey wdStory

End Sub


C'est effectivement la méthode HomeKey de l'objet Selection, avec la valeur wdStory en paramètre qui permet de remonter tout en haut du document actif. Souvenez-vous, ce paramètre wdStory désigne l'article complet, soit l'intégralité du document.

Désormais, il est temps d'initialiser la boucle destinée à passer en revue chacun des paragraphes de ce document.
  • A la suite du code VBA, ajouter les instructions suivantes :
Sub Corriger()
Dim paragraphe As Paragraph

Selection.HomeKey wdStory

For Each paragraphe In ActiveDocument.Paragraphs

Next paragraphe


End Sub


Dans ce type particulier de boucle, l'objet à gauche de l'expression doit être du même type que l'objet à droite de l'expression. C'est la raison pour laquelle nous avons judicieusement déclaré un objet de type Paragraph. Et grâce à l'objet enfant Paragraphs (Au pluriel donc) de l'objet ActiveDocument, nous parcourons effectivement tous les paragraphes du document actif.

Pour pouvoir intervenir sur un paragraphe, nous devons premièrement le sélectionner. Ainsi, nous pourrons ensuite exploiter l'objet VBA Selection pour réaliser des déplacements et scruter les caractères à des emplacements bien précis, en l'occurrence ici en début de chaque paragraphe.
  • Dans les bornes de la boucle, ajouter l'instruction VBA suivante :
Sub Corriger()
Dim paragraphe As Paragraph

Selection.HomeKey wdStory

For Each paragraphe In ActiveDocument.Paragraphs
paragraphe.Range.Select
Next paragraphe

End Sub


C'est en effet la méthode Select de l'objet Enfant Range de l'objet Parent de type Paragraph (Notre variable paragraphe) qui réalise la sélection. Tout comme avec Excel, l'objet Range désigne une plage. Cette plage n'est autre que le paragraphe en cours d'analyse par la boucle. Nous les sélectionnons donc tour à tour. Mais entre-temps, nous avons des vérifications à réaliser et peut être des traitements à entreprendre.
  • Dans la boucle, à la suite du code, ajouter l'instruction VBA suivante :
Sub Corriger()
Dim paragraphe As Paragraph

Selection.HomeKey wdStory

For Each paragraphe In ActiveDocument.Paragraphs
paragraphe.Range.Select
Selection.HomeKey wdLine
Next paragraphe

End Sub


Nous exploitons de nouveau la méthode HomeKey de l'objet VBA Selection. Mais cette fois, avec le paramètre wdLine, nous remontons au tout début de la ligne, de la première ligne du paragraphe en l'occurrence. Le point d'insertion y est donc placé.

L'objectif maintenant est de sélectionner le premier caractère de ce paragraphe en cours d'analyse. Nous pourrons ainsi l'étudier pour savoir s'il s'agit d'une tabulation. Et là encore, nous connaissons les méthodes qui permettent d'entreprendre des déplacements au travers des lignes ou des caractères.
  • Toujours dans la boucle et à la suite du code, ajouter l'instruction VBA suivante :
Sub Corriger()
Dim paragraphe As Paragraph

Selection.HomeKey wdStory

For Each paragraphe In ActiveDocument.Paragraphs
paragraphe.Range.Select
Selection.HomeKey wdLine
Selection.MoveRight wdCharacter, 1, wdExtend
Next paragraphe

End Sub


Cette fois, c'est la méthode MoweRight de l'objet Selection qui permet de déplacer le point d'insertion vers la droite, mais pas de n'importe quelle façon. Et ce sont ses paramètres qui dictent sa conduite. Tout d'abord, en premier argument, la valeur wdCharacter indique que ce déplacement doit se faire sur les caractères et non sur les lignes ou les paragraphes. Avec la valeur 1 en deuxième paramètre, nous réalisons un déplacement d'un seul caractère vers la droite. Enfin, le dernier argument est loin d'être anodin. Avec la valeur wdExtend, nous étendons la sélection à partir du point de départ, c'est-à-dire à partir du début du paragraphe. En d'autres termes, nous sélectionnons le premier caractère du paragraphe en cours d'analyse. Sans cette valeur wdExtend, nous aurions placé le point d'insertion après ce premier caractère. Or, il doit être sélectionné pour être analysé.

Pour envisager une telle vérification, nous devons engager un test avec une instruction conditionnelle VBA.
  • Toujours dans la boucle et à la suite du code, créer l'instruction conditionnelle suivante :
Sub Corriger()
Dim paragraphe As Paragraph

Selection.HomeKey wdStory

For Each paragraphe In ActiveDocument.Paragraphs
paragraphe.Range.Select
Selection.HomeKey wdLine
Selection.MoveRight wdCharacter, 1, wdExtend

If Selection.Text = Chr(9) Then

End If

Next paragraphe

End Sub


C'est tout simplement la propriété Text de l'objet Selection qui renseigne sur le contenu de la sélection active sur le document. La fonction VBA Chr permet de simuler des caractères ou des actions au clavier. Avec la valeur 9 en paramètre, nous comparons la sélection du caractère avec une tabulation. Si ce critère est vérifié, nous devons supprimer ce caractère dans un premier temps car il indique qu'il s'agit bien d'une tabulation en entête du paragraphe.
  • Dans les bornes de l'instruction conditionnelle, ajouter la ligne de code suivante :
Sub Corriger()
Dim paragraphe As Paragraph

Selection.HomeKey wdStory

For Each paragraphe In ActiveDocument.Paragraphs
paragraphe.Range.Select
Selection.HomeKey wdLine
Selection.MoveRight wdCharacter, 1, wdExtend

If Selection.Text = Chr(9) Then
Selection.Delete
End If
Next paragraphe

End Sub


Trivialement, c'est la méthode Delete de l'objet Selection qui permet de supprimer la sélection en cours. Cette méthode fait son oeuvre sans le moindre paramètre nécessaire.

Il ne nous reste plus qu'à remplacer cette tabulation par un retrait de première ligne. Ainsi, notre document sera correctement formé, soit correctement mis en page. Parfois, pour trouver les propriétés et attributs qui permettent d'aboutir une action, rien ne vaut l'enregistrement d'une macro automatique. Le fait de déclencher une macro enregistrant l'action consistant à réaliser un retrait de première ligne sur un paragraphe, fournit le code qu'il ne reste plus qu'à prélever.
  • Précisément à la suite, ajouter cette ligne de code prélevée comme suit :
Sub Corriger()
Dim paragraphe As Paragraph

Selection.HomeKey wdStory

For Each paragraphe In ActiveDocument.Paragraphs
paragraphe.Range.Select
Selection.HomeKey wdLine
Selection.MoveRight wdCharacter, 1, wdExtend

If Selection.Text = Chr(9) Then
Selection.Delete
Selection.ParagraphFormat.FirstLineIndent = CentimetersToPoints(1.5)
End If
Next paragraphe

End Sub


L'objet VBA Selection offre une propriété ParagraphFormat. Mais cette propriété est bien vaste ou bien vague. De nombreux réglages de format peuvent en effet être entrepris sur les paragraphes. C'est la raison pour laquelle nous descendons dans la hiérarchie pour préciser l'attribut FirstLineIndent. Comprenez Retrait de première ligne. Et c'est enfin la fonction CentimetersToPoints qui permet de définir le décalage en centimètre dans le système de notation américain : 1.5, soit 1,5 centimètre.
  • Enregistrer les modifications (CTRL + S) puis exécuter le code VBA,
  • Dès lors, basculer sur le document Word,
Comme vous pouvez le voir, nous sommes positionnés sur la toute dernière page. Ce phénomène indique que le code VBA a bien parcouru l'intégralité des paragraphes et a laissé le point d'insertion au dernier emplacement possible à la fin du traitement.
  • Faire défiler les pages avec le scroll de la souris ou l'ascenseur vertical,
Retraits de première ligne pour remplacer les tabulations par le code VBA Word

Comme vous pouvez le constater, chaque tabulation en entête de paragraphe a effectivement été remplacée par un retrait de première ligne et ce, dans tout le document. Maintenant que nous savons parcourir tous les paragraphes d'un document par le code VBA, de nouvelles perspectives s'ouvrent à nous.

 
Sur Facebook
Sur Youtube
Les livres
Contact
Mentions légales



Abonnement à la chaîne Youtube
Partager la formation
Partager sur Facebook
Partager sur Twitter
Partager sur LinkedIn