Pour partager cette vidéo sur les réseaux sociaux ou sur un site, voici son url :
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 .
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 .
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,
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.