Pour partager cette vidéo sur les réseaux sociaux ou sur un site, voici son url :
Sujets que vous pourriez aussi aimer :
Parcourir un document par listes
Nous avons déjà découvert quelques
techniques de navigation au sein d'un
document Word grâce à des
astuces de code précédentes. Ici, nous proposons à l'utilisateur de pouvoir naviguer en marquant des étapes à chaque fois qu'une
liste à puces est rencontrée. Ces
listes à puces représentent en effet des sections remarquables du document. Elles engagent souvent à réaliser des actions.
Document source
Pour la démonstration de cette nouvelle
astuce VBA Word , nous proposons d'appuyer l'étude sur un
document existant offrant un certain nombre de
listes à puces harmonieusement réparties.
En faisant défiler le
document vers le bas, bien qu'il soit court, vous constatez qu'il est effectivement copieusement garni de
sections en listes à puces .
La procédure de code et le bouton
Pour débuter, nous souhaitons poser les fondations de la structure. Ce
système de navigation peut s'avérer intéressant et bien utile. Nous proposons donc d'enregistrer la
macro VBA dans le
modèle Word , le
normal.dotm . Et dans le même temps, nous suggérons de la relier à un
bouton d'accès rapide à greffer dans un
ruban personnalisé .
Réaliser le raccourci clavier ALT + F11 pour basculer dans l'éditeur VBA Word ,
Dans l'explorateur de projet, déployer le dossier Modules de l'élément Normal ,
C'est lui qui représente le
modèle et qui stocke tous les codes utilisables pour tous les documents Word et pas seulement pour celui en cours.
Puis, double cliquer sur le module Navigation ,
Ainsi, nous affichons ses
procédures de code VBA au centre de l'écran.
Nous avions créé ce module à l'occasion de précédentes
astuces . Si vous ne le possédez pas, vous pouvez le créer par le biais du
menu Insertion puis en choisissant l'
option Module . Dès lors, la
fenêtre Propriétés (Affichage / Fenêtre Propriétés) permet de le renommer.
En haut de la feuille de code, créer la procédure pointerListes comme suit :
Sub pointerListes()
End Sub
La procédure existe désormais. Nous l'implémenterons dans un deuxième temps. Comme nous l'annoncions, nous souhaitons tout d'abord l'associer à un bouton à placer dans un ruban.
Basculer sur le document Word (ALT + Tab),
Cliquer droit n'importe où sur le ruban actif,
Dans le menu contextuel qui apparaît, choisir la commande Personnaliser le ruban ,
Dans la boîte de dialogue qui suit, au-dessus de la première liste, déployer la zone déroulante,
Puis, choisir la rubrique Macros ,
Depuis la liste, glisser la macro pointerListes dans la section Navigation du ruban Outils ,
Il s'agit d'un ruban et de sa section que nous avions créés à l'occasion d'
astuces précédentes. Si vous ne les possédez pas, vous pouvez les créer ou choisir de glisser la
macro dans un ruban existant.
Cliquer alors sur le bouton Renommer en bas à droite de la boîte de dialogue,
Dans la boîte de dialogue qui suit, lui donner l'intitulé par Listes ,
Puis, cliquer sur une icône représentative afin de matérialiser le bouton,
Cliquer sur le bouton Ok pour revenir sur la première boîte de dialogue,
Puis, valider la création du bouton de nouveau par Ok,
En haut de la fenêtre Word , cliquer sur l'onglet Outils pour afficher son ruban,
Comme vous pouvez l'apprécier, le bouton de macro est effectivement présent. Bien sûr, il est encore inopérant à ce stade dans la mesure où sa procédure associée est vide.
Déclarer les variables
Maintenant que la liaison est établie entre le
bouton et sa
procédure , il est temps de
développer le code de la
macro VBA . Nous avons tout d'abord besoin de deux variables. La première doit être un
objet de type paragraphe pour l'employer dans une
boucle VBA For Each afin de les parcourir tous. C'est dans cette
boucle que nous devrons émettre un critère pour connaître la nature du paragraphe en cours d'analyse afin de déterminer s'il est porteur ou non d'une
liste à puces . La seconde variable doit être utilisée pour réceptionner la valeur du bouton cliqué sur une
boîte de dialogue que nous lui proposerons. Sa vocation sera de permettre à l'utilisateur de stopper la navigation pour garder actif le paragraphe de la liste à puces trouvée.
Revenir dans l'éditeur VBA Word (ALT + F11),
Dans les bornes de la procédure pointerListes, ajouter les déclarations de variables suivantes :
Sub pointerListes()
Dim parag As Word.Paragraph
Dim rep As Byte
End Sub
Nous déclarons la
variable rep en tant qu'
entier court . En effet, une boîte de dialogue de type
MsgBox répond par une petite valeur numérique pour identifier le bouton cliqué par l'utilisateur.
Parcourir tous les paragraphes
Maintenant, pour pouvoir identifier les sections de
listes à puces , nous devons pouvoir analyser
chaque paragraphe . Dans certaines précédentes
astuces , nous avons vu comment il était possible de les parcourir tous grâce à une
boucle for each .
A la suite du code de la procédure, ajouter les instructions VBA suivantes :
...
Selection.HomeKey wdStory
For Each parag In ActiveDocument.Paragraphs
Next
...
Tout d'abord et pour n'en manquer aucun, nous replaçons le pointeur de lecture tout en haut du document grâce à la
méthode HomeKey de l'
objet VBA Selection en lui passant le
paramètre wdStory qui désigne l'intégralité de la présentation. Puis, nous exploitons notre objet de type paragraphe (parag) pour les parcourir tous grâce à une
boucle For Each exercée dans la
collection des paragraphes du document. C'est la
méthode Paragraphs de l'
objet VBA Word ActiveDocument qui renvoie cette collection.
Reconnaître les listes à puces
Désormais, pour
chaque paragraphe analysé tour à tour dans cette
boucle , nous devons réaliser un test pour savoir s'il s'agit d'une section de
liste à puces . Et pour cela, notre
objet parag offre des propriétés dédiées.
Dans les bornes de la boucle , ajouter l'instruction conditionnelle suivante :
...
If parag.Range.ListFormat.ListType = wdListBullet Then
End If
...
Dans la hiérarchie, un
objet de type paragraphe permet de descendre jusqu'Ã des objets enfants. En l'occurrence ici, il s'agit de l'
objet Range qui désigne la plage ou la zone du paragraphe. Dès lors, cet objet offre des propriétés comme la
propriété ListFormat qui permet de descendre jusqu'à la
propriété enfant ListType . Comme son nom l'indique, elle est capable de déterminer la nature de la liste pour la zone analysée, si elle existe. Et c'est un paramètre VBA Word (wdListBullet) qui ne s'invente pas et qui est utilisé en critère.
Poursuivre ou stopper la navigation
Si ce critère est honoré, nous devons demander à l'utilisateur s'il souhaite poursuivre la navigation ou conserver actif le paragraphe en cours.
Dans les bornes de l'instruction conditionnelle , ajouter les instructions VBA suivantes :
...
parag.Range.Select
rep = MsgBox("Voulez-vous poursuivre ?", vbYesNo + vbQuestion, "Parcourir le document par listes à puces")
If (rep = 7) Then Exit For
...
C'est premièrement la
méthode Select de l'
objet enfant Range qui permet de sélectionner le paragraphe reconnu comme une section de
liste à puces . Ensuite, nous déclenchons l'affichage d'un message (Voulez-vous poursuivre ?) dans une boîte de dialogue avec deux boutons Oui et Non (vbYesNo) accompagnés de l'icône d'un point d'interrogation (+ vbQuestion). La valeur du bouton cliqué est stockée dans la
variable rep . S'il s'agit du chiffre 7, nous stoppons l'exécution de la boucle (Exit For) pour conserver actif le dernier paragraphe de liste à puces décelé.
Tester la navigation au travers des listes
Il est temps de tester cette procédure de
code VBA .
Enregistrer les modifications (CTRL + S) et basculer sur le document Word (ALT + Tab),
Dans le ruban Outils , cliquer sur le nouveau bouton par Listes ,
Comme vous pouvez le voir, le code s'arrête sur le premier paragraphe détecté avec une
liste à puces .
A chaque fois que vous cliquez sur le
bouton Oui , c'est le paragraphe de la liste suivante qui est sélectionné. Et dès lors que vous cliquez sur le
bouton Non , le dernier paragraphe reste actif pour
stopper la navigation sur la section trouvée.
Pour une telle
navigation , le code complet de la
procédure VBA que nous avons bâtie reste pourtant très simple :
Sub pointerListes()
Dim parag As Word.Paragraph
Dim rep As Byte
Selection.HomeKey wdStory
For Each parag In ActiveDocument.Paragraphs
If parag.Range.ListFormat.ListType = wdListBullet Then
parag.Range.Select
rep = MsgBox("Voulez-vous poursuivre ?", vbYesNo + vbQuestion, "Parcourir le document par listes à puces")
If (rep = 7) Then Exit For
End If
Next
End Sub