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.
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é.
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.