Pour partager cette vidéo sur les réseaux sociaux ou sur un site, voici son url :
Sujets que vous pourriez aussi aimer :Automatiser les réglages
Au fil des
astuces VBA Word, nous progressons. Dans ce nouveau volet, nous souhaitons ajouter une nouvelle fonctionnalité à notre
ruban d'outils. Elle doit consister Ã
formater automatiquement le ou les termes sélectionnés par l'utilisateur et ce, dans
tout le document. Pour cela, il est question d'interagir en offrant une boîte de dialogue de confirmation restituant la sélection. A confirmation, le
traitement VBA global doit être engagé.
Sur l'exemple illustré par la capture, après un
clic de l'utilisateur sur un bouton de macro dans le ruban, une
boîte de dialogue de type InputBox surgit. Elle affiche fièrement le texte sélectionné par l'utilisateur. Si ce dernier clique sur le bouton Ok, le
code VBA est déclenché pour
formater automatiquement toutes les occurrences du terme dans le document. Il s'agit d'un bon moyen d'optimiser les opérations de mise en forme.
Document source
Pour la démonstration de cette nouvelle
astuce nous avons besoin d'agir sur un
document Word offrant suffisamment de matière.
Il s'agit d'un document à partir duquel nous avons travaillé au cours des épisodes précédents. Il est composé d'une page de garde, d'un sommaire et d'un contenu qui débute à partir de la troisième page. Mais cette troisième page est considérée fort naturellement comme la première dans la numérotation opérée en pied de page.
Ce petit fascicule d'entraînement traite des
graphiques dans Excel. Le
mot Graphiques est donc un terme important de ce petit mémo. Il convient de mettre en valeur explicitement toutes ses occurrences dans l'
intégralité du document. Et bien entendu, il n'est pas question d'envisager d'intervenir manuellement. C'est pour cela entre autres que le
VBA Word existe. Une fois que nous aurons créé la procédure capable de faire ressortir le ou les termes sélectionnés, nous pourrons la traduire en
action de macro universelle, utile pour toutes les utilisations futures de
Word.
Dialogue InputBox
Dans un premier temps, il est question de
dialoguer avec l'utilisateur.
Au clic sur le bouton de macro que nous construirons, une
boîte de message doit se présenter. Cette
boîte de dialogue doit offrir une
zone de texte dans laquelle les termes sélectionnés par l'utilisateur doivent être rappelés. Si ce dernier confirme, alors le
traitement de mise en valeur doit être enclenché.
- Réaliser le raccourci clavier ALT + F11 pour basculer dans l'éditeur VBA Word,
- Dans l'explorateur de projet sur la gauche, cliquer sur l'élément Normal pour le sélectionner,
Il représente le
modèle de Word, celui qui rend les
macros fonctionnelles pour toute utilisation. C'est donc lui qui doit accueillir notre code.
- En haut de la fenêtre, cliquer sur le menu Insertion,
- Dans les propositions, choisir Module,
Le
module apparaît dans l'arborescence et sa
feuille de code encore vierge se rend disponible au centre de l'écran.
- Dans cette feuille de code, créer la procédure mef comme suit :
Sub mef()
End Sub
Mef est la contraction de
Mise en forme. Donc le
nom de procédure est suffisamment explicite.
Pour stocker les termes sélectionnés par l'utilisateur, nous avons besoin d'une
variable typée comme un texte.
- Dans les bornes de la procédure, ajouter la déclaration suivante :
Sub mef()
Dim cherche As String
End Sub
Déclarée en tant que
String, cette
variable peut mémoriser pratiquement n'importe quelle information. Et justement nous devons l'exploiter pour réceptionner la sélection de l'utilisateur.
VBA offre deux
fonctions pour afficher des
boîtes de dialogues classiques. Il s'agit des
fonctions MsgBox et
InputBox. La première n'offre pas de zone de saisie contrairement à la
fonction InputBox que nous allons utiliser.
Naturellement, une
fonction retourne une valeur. Il peut s'agir du texte récupéré après validation ou d'une information indiquant que l'utilisateur a choisi d'annuler.
- A la suite du code de la procédure, ajouter l'instruction VBA suivante :
Sub mef()
Dim cherche As String
cherche = InputBox("Texte cherché ?", "Recherche", Selection.Text)
End Sub
Comme vous pouvez le voir, la
fonction InputBox peut recevoir de nombreux paramètres. Mais seul le premier est obligatoire. Il concerne le message à afficher sur la boîte de dialogue. Le deuxième permet de personnaliser le titre de cette dernière. Le troisième est la valeur à afficher par défaut dans la zone de saisie. Avec la
propriété Text de l'
objet VBA Selection, nous y inscrivons donc le ou les termes sélectionnés par l'utilisateur sur le document. Nous pouvons réaliser un petit test à ce stade.
- Enregistrer les modifications (CTRL + S),
- Basculer sur le document Word (ALT + Tab),
- Atteindre la troisième page par exemple,
- Double cliquer dans un mot pour le sélectionner,
- Revenir dans l'éditeur VBA Word entre les bornes de la procédure,
- Exécuter le code, par exemple en enfonçant la touche F5 du clavier,
Le visuel est rendu au document. Et comme vous pouvez le voir, la
boîte de dialogue s'affiche avec la sélection restituée dans la zone de saisie.
- Cliquer sur le bouton Annuler de la boîte de dialogue,
Ainsi, nous sommes de retour dans l'
éditeur VBA Word.
Le résultat ou retour de cette
fonction est donc affecté à notre
variable cherche. Mais si l'utilisateur clique sur le
bouton Annuler de la boîte de dialogue, la valeur retournée est vide. Nous devons donc
tester le contenu de la variable cherche avant de poursuivre le traitement. Et pour cela, une
instruction conditionnelle est nécessaire.
- A la suite du code VBA, créer les bornes de l'instruction conditionnelle comme suit :
Sub mef()
Dim cherche As String
cherche = InputBox("Texte cherché ?", "Recherche", Selection.Text)
If cherche <> "" Then
End If
End Sub
Grâce à ce critère (cherche <> ""), nous entendons poursuivre le traitement lorsque le
contenu de la variable cherche n'est pas vide. Implicitement et inversement, puisque nous n'écrirons aucun code en dehors des bornes de cette instruction, le traitement s'arrêtera.
Rechercher toutes les occurrences
Maintenant, nous devons replacer le point d'insertion au tout début du document. De cette façon, aucun texte ne sera ignoré. Le cas échéant, la méthode de recherche débute à partir de l'emplacement actif. Nous le savons, c'est la
méthode HomeKey de l'
objet Selection que nous devons utiliser.
- Dans les bornes de l'instruction conditionnelle, ajouter la ligne de code VBA suivante :
Sub mef()
Dim cherche As String
cherche =InputBox("Texte cherché ?", "Recherche", Selection.Text)
If cherche <>"" Then
Selection.HomeKey wdStory
End If
End Sub
Vous le savez, la
valeur wdStory passée en argument de la
méthode HomeKey désigne l'article complet, soit le
document Word dans sa globalité. De fait, cette ligne de code a pour effet de replacer le point d'insertion au début du tout premier paragraphe.
Ensuite, toujours lorsque le critère est vérifié, il est question de rechercher toutes les occurrences du terme réceptionné. Nous le savons, l'objectif est de les mettre en valeur dans tout le document. Et pour cela, grâce à une précédente
astuce VBA Word, nous avions appris à domestiquer la
propriété Find de l'
objet Selection. Elle offre de nombreuses
propriétés enfants qu'il s'agit de calibrer pour déterminer la nature de la recherche mais aussi les attributs de remplacement. Et comme nous l'avons appris ensemble, lorsque les
propriétés d'un objet sont nombreuses à régler, il est judicieux de les regrouper dans un
bloc With.
- Dans les bornes de cette instruction conditionnelle, créer ce bloc With comme suit :
Sub mef()
Dim cherche As String
cherche = InputBox("Texte cherché ?", "Recherche", Selection.Text)
If cherche <> "" Then
Selection.HomeKey wdStory
With Selection.Find
End With
End If
End Sub
Désormais, nous devons commencer par définir le
texte à remplacer. Mais il n'est pas question de le changer. C'est sa mise en valeur qui doit être prononcée. Nous devons néanmoins le définir. Ce texte est mémorisé dans la
variable cherche. De plus, nous devons aussi le rappeler comme
texte de remplacement. En effet, la fonctionnalité de
remplacement de Word mémorise les anciennes recherches et donc les anciens réglages.
- Dans les bornes du bloc With, ajouter les instructions VBA suivantes :
Sub mef()
Dim cherche As String
cherche = InputBox("Texte cherché ?", "Recherche", Selection.Text)
If cherche <> "" Then
Selection.HomeKey wdStory
With Selection.Find
.Text = cherche
.Replacement.Text = cherche
End With
End If
End Sub
C'est donc la
propriété enfant Text de la
propriété Find de l'
objet Selection qui permet d'indiquer quel est l'élément cherché dans le document. Attention dans cette construction en
bloc With de bien inscrire le point en préfixe des
propriétés enfants appelées. Et c'est la
propriété enfant Text de la
propriété enfant Replacement qui permet d'indiquer le texte utilisé pour le remplacement.
Ce sont ensuite de nouvelles
propriétés enfants de la
propriété Find qui permettent de définir les attributs de mise en valeur dans ce processus de remplacement.
- A la suite du code dans le bloc With, ajouter les instructions VBA suivantes :
Sub mef()
Dim cherche As String
cherche = InputBox("Texte cherché ?", "Recherche", Selection.Text)
If cherche <> "" Then
Selection.HomeKey wdStory
With Selection.Find
.Text = cherche
.Replacement.Text = cherche
.Replacement.Font.Size = 12
.Replacement.Font.Bold = True
.Replacement.Font.Color = 192
End With
End If
End Sub
C'est donc la
propriété enfant Replacement qui permet de descendre encore dans la hiérarchie pour définir précisément quels sont les attributs sur lesquels des modifications doivent être entreprises. Nous agissons essentiellement sur la police grâce à la
propriété enfant Font. Mais là encore, il s'agit d'une considération généraliste. C'est pourquoi nous descendons jusqu'à la
propriété enfant Size pour augmenter la
taille du texte à 12 points. Puis, nous exploitons la
propriété enfant bold pour passer chaque occurrence en
gras. Enfin, c'est la
propriété enfant Color qui permet de changer la
couleur de chaque texte remplacé. Avec la valeur 192, nous optons pour un rouge assez foncé.
Maintenant et pour finir, il est question d'exécuter la
recherche et le remplacement. Il ne s'agit donc plus d'une
propriété enfant mais d'une
méthode que nous connaissons d'ailleurs.
- Toujours à la suite du code dans le bloc With, ajouter l'instruction VBA suivante :
Sub mef()
Dim cherche As String
cherche = InputBox("Texte cherché ?", "Recherche", Selection.Text)
If cherche <> "" Then
Selection.HomeKey wdStory
With Selection.Find
.Text = cherche
.Replacement.Text = cherche
.Replacement.Font.Size = 12
.Replacement.Font.Bold = True
.Replacement.Font.Color = 192
.Execute Replace:=wdReplaceAll
End With
End If
End Sub
C'est donc la
méthode Execute de la
propriété Find de l'
objet Selection qui permet de lancer l'opération de recherche et de remplacement. Cette
méthode propose de nombreux paramètres. Ils sont tous facultatifs. Et comme nous avons défini les réglages en amont avec les
propriétés enfants, nous désignons directement l'argument concerné par son intitulé
Replace suivi de la valeur à affecter, pour réaliser un remplacement global sur le document.
Remarque : Le code encapsulé dans le
bloc With aurait pu être fourni par une
macro automatique enregistrant l'utilisateur en train de définir tous ces réglages depuis la
boîte de dialogue de recherche et de remplacement. Si la technique vous intéresse, elle est enseignée par l'
astuce Word montrant comment formater automatiquement les mots clés d'un document.
Bouton de macro
L'outil que nous venons de construire a toutes les raisons de figurer parmi les commandes accessibles facilement. Cette
automatisation de mise en valeur globale sur des termes précis peut représenter un gain de temps non négligeable. C'est la raison pour laquelle nous souhaitons associer cette procédure à un
bouton de macro à greffer dans l'un des rubans.
- Basculer sur le document (ALT + Tab),
- En haut de la fenêtre Word, cliquer droit n'importe où sur le ruban actif,
- Dans le menu contextuel, choisir la commande Personnaliser le ruban,
- Dans la liste de droite de la boîte de dialogue, déployer l'affichage de l'onglet Outils,
- Puis, sélectionner le groupe Navigation,
Il s'agit d'un
ruban et d'une
section que nous avons créés à l'occasion des
astuces VBA Word précédentes. Si vous ne les possédez pas, vous pouvez les créer ou choisir d'incorporer le
bouton de macro dans un
ruban existant.
- Maintenant, cliquer sur le bouton Nouveau groupe en bas de la boîte de dialogue,
- Puis, cliquer sur le bouton Renommer situé juste à côté,
- Dans la nouvelle boîte de dialogue, saisir l'intitulé Formats et valider par Ok,
- Déployer alors l'affichage de la zone déroulante au-dessus de la liste du centre,
- Dans les propositions, choisir la catégorie des macros,
- Sélectionner la macro mef,
- Puis, cliquer sur le bouton Ajouter au centre de la boîte de dialogue,
Cette action a pour effet d'ajouter le bouton associé à la
macro VBA, Ã la suite dans la
section Formats du
ruban Outils.
- Dès lors, cliquer de nouveau sur le bouton Renommer en bas de la boîte de dialogue,
- Dans la nouvelle boîte, saisir l'intitulé Mef,
- Puis choisir une icône représentative de l'action entreprise,
- Cliquer alors sur le bouton Ok pour valider ces réglages,
- Cliquer de nouveau sur le bouton Ok pour valider la création du bouton,
Nous sommes ainsi de retour sur le
document Word.
Il convient maintenant de tester le bon fonctionnement de la
macro VBA que nous avons écrite.
- Atteindre la troisième page du document,
- Sur n'importe quel paragraphe, sélectionner le mot graphiques,
Veillez à réaliser une sélection précise sans espace ni avant, ni après le mot. Sinon, les occurrences suivies d'une virgule par exemple, ne seront pas prises en compte.
- En haut de la fenêtre Word, cliquer sur l'onglet Outils pour activer son ruban,
- Dès lors, dans la section Formats du ruban, cliquer sur le bouton Mef,
La
boîte de dialogue InputBox apparaît restituant le texte sélectionné.
- Déclencher l'opération en cliquant sur le bouton Ok,
Un message de confirmation peut surgir. Il convient de le valider. Pour neutraliser toutes les communications classiques de Word avec l'utilisateur, il suffit d'inscrire l'
instruction VBA suivante en entête de code de la procédure :
Application.DisplayAlerts = wdAlertsNone.
Quoiqu'il en soit, en faisant défiler le document vers le bas, vous constatez que toutes les occurrences du mot clé sélectionné ont été automatiquement mises en valeur. Il s'agit donc d'un très bon moyen pour faire ressortir des éléments importants sans en oublier et en gagnant un temps précieux.
Dernière remarque : Nous l'avons évoqué précédemment, la fonctionnalité de
recherche et de remplacement conserve la mémoire des réglages opérés lors d'un précédent traitement. C'est la raison pour laquelle nous avons redéfini le
texte de remplacement bien que nous ne souhaitions pas le modifier. Mais c'est aussi la raison pour laquelle il peut être opportun de
réinitialiser les attributs de format dans la
zone de recherche comme dans la
zone de remplacement. Et pour cela, il s'agit d'exploiter la
propriété enfant ClearFormatting.
Sub mef()
Dim cherche As String
Application.DisplayAlerts = wdAlertsNone
cherche = InputBox("Texte cherché ?", "Recherche", Selection.Text)
If cherche <> "" Then
Selection.HomeKey wdStory
With Selection.Find
.ClearFormatting
.Replacement.ClearFormatting
.Text = cherche
.Replacement.Text = cherche
.Replacement.Font.Size = 12
.Replacement.Font.Bold = True
.Replacement.Font.Color = 192
.Execute Replace:=wdReplaceAll
End With
End If
End Sub