Pour partager cette vidéo sur les réseaux sociaux ou sur un site, voici son url :
Sujets que vous pourriez aussi aimer :
Remplacer et formater la sélection
Avec cette nouvelle
astuce VBA Word , nous allons offrir une
boîte de dialogue qui se déclenche au clic de l'utilisateur sur un
bouton de macro enregistré dans le modèle. Celle-ci doit réceptionner le
texte sélectionné sur le document pour remplacer toutes ses occurrences. Et pour cela, l'utilisateur doit disposer d'une
zone de saisie et de
cases à cocher pour définir en même temps les attributs de format à appliquer lors du remplacement.
Sources de travail
Pour mener à bien cette étude, nous proposons de récupérer un
document présentant un texte à manipuler ainsi qu'un
formulaire préconçu pour axer les travaux sur le
code VBA .
La décompression livre le
document Word accompagné de deux fichiers aux extensions respectives
frx et
frm . La première extension correspond au fichier du
userForm graphique . La seconde correspond au
code VBA qui lui est associé, s'il existe.
Importer le UserForm dans le modèle
Pour commencer, nous avons tout d'abord besoin d'
importer le formulaire dans le
modèle Word pour pouvoir l'exploiter par le
code VBA .
Double cliquer sur le fichier du document (docx) pour l'ouvrir dans Word ,
Nous découvrons un texte standard qui fera parfaitement l'affaire pour les besoins des manipulations. Il a été
inséré automatiquement grâce à une fonction Word .
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 Word . Tout ce que nous y enregistrerons sera disponible pour toutes les utilisations à venir et ce, quel que soit le document.
En haut de la fenêtre de l'éditeur, cliquer sur le menu Fichier ,
Puis, choisir la commande Importer un fichier ,
Dans la boîte de dialogue qui suit, pointer dans le dossier de décompression,
Puis, double cliquer sur le fichier rplcmt.frm ,
Un nouveau dossier apparaît dans l'arborescence du
modèle Normal . Il se nomme
Feuilles .
Double cliquer sur ce dossier pour le déployer,
Puis, double cliquer sur l'élément rplcmt qu'il contient,
Il s'agit du
UserForm , soit du
formulaire et ainsi nous affichons son interface graphique au centre de l'écran. Comme vous pouvez le voir, il est constitué d'une
zone de saisie pour le
texte de remplacement , de
trois cases à cocher pour choisir l'attribut de format à appliquer et de deux
boutons . Mais ce n'est pas tout. Il y a aussi deux contrôles Label soit des étiquettes dont le contenu est vide à ce stade. La première est située au-dessus de la zone du texte de remplacement. Son nom d'objet est
info . Elle doit servir à renseigner dynamiquement l'utilisateur sur l'action à entreprendre. La seconde est placée
sur la droite du bouton Annuler . Son nom d'objet est
mem . Elle doit servir à stocker le texte sélectionné par l'utilisateur.
La zone du texte de remplacement est nommée
texteRplcmt . Les trois cases à cocher sont respectivement intitulées
gras ,
italique et
souligne . Ces noms d'objets sont importants pour pouvoir piloter ces contrôles par le
code VBA . Pour consulter ces noms, il faut premièrement sélectionner l'un des contrôles puis regarder sa
propriété (Name) dans la
fenêtre des propriétés .
Si celle-ci n'est pas visible dans votre environnement, vous pouvez l'afficher en cliquant sur le
menu Affichage puis sur la rubrique
Fenêtre propriétés .
Remarque : Ce
formulaire est très dépouillé dans sa présentation. Mais il a le mérite d'exister. Libre à vous d'améliorer son esthétique, précisément avec la
fenêtre propriétés .
Bouton de macro et procédure
Pour débuter, nous devons commencer par créer les
bornes de la procédure principale à associer à un
bouton de macro à greffer dans l'un des
rubans Word . Le rôle de cette
procédure est de récolter l'information du
texte à remplacer pour le transmettre au
formulaire à ouvrir .
Sous le dossier Feuilles , déployer le dossier Modules ,
Dans la liste, double cliquer sur le module Textes ,
Nous affichons ainsi ses
procédures de code VBA au centre de l'écran. Il s'agit d'un module que nous avons créé à l'occasion d'astuces précédentes. S'il n'existe pas dans votre environnement, vous devez le créer en cliquant sur
menu Insertion puis en choisissant la
commande Modules . Ensuite, il est très simple de lui attribuer ce nom avec la
propriété (Name) de la
fenêtre propriétés .
Dans la feuille de code, après toute procédure, créer la procédure remplacerPartout :
Sub remplacerPartout()
End Sub
Bien qu'elle soit encore vide, maintenant qu'elle existe, nous pouvons d'ores et déjà établir la liaison avec un
bouton de macro .
Enregistrer les modifications (CTRL + S),
Revenir sur le document Word ,
Cliquer droit n'importe où sur le ruban Actif,
Dans le menu contextuel, choisir la commande Personnaliser le ruban ,
La boîte de dialogue des
options Word apparaît sur la catégorie nommée
Personnaliser le ruban .
Au centre de l'écran, déployer la liste déroulante au-dessus des commandes,
Dans les propositions, choisir la catégorie Macros ,
Glisser la macro remplacerPartout dans la section Textes du ruban Outils ,
Là encore, il s'agit d'une section et d'un ruban que nous avons créés à l'occasion de précédentes
astuces VBA Word . Si vous ne les possédez pas, vous pouvez les créer ou encore choisir de glisser la macro dans un ruban existant.
Cliquer sur le bouton Renommer en bas de la boîte de dialogue,
Dans la zone Nom complet de celle qui suit, taper par exemple l'intitulé : Remplacer&Format ,
Puis, choisir une icône représentative dans la liste de celles qui sont proposées,
Cliquer alors sur le bouton Ok,
Puis, cliquer de nouveau sur le bouton Ok de la première boîte de dialogue,
Nous sommes ainsi de retour sur le
document Word et si vous activez le
ruban Outils en haut de la fenêtre, vous constatez la présence du
nouveau bouton dans la
section Textes .
Son rôle est de lancer le
code VBA que nous allons construire dans la procédure
remplacerPartout .
Informations à transmettre au formulaire
Il est temps de développer cette procédure. Elle doit entre autres se charger de récupérer le texte sélectionné qu'elle doit ensuite
transmettre au formulaire qui se chargera de la suite du traitement.
Revenir dans l'éditeur VBA Word ,
Dans la procédure remplacerTout , ajouter la déclaration et l'affectation suivantes :
Sub remplacerPartout()
Dim texte As String
texte = Trim(Selection.Text)
End Sub
Nous déclarons tout d'abord la
variable texte de type texte (String) pour pouvoir mémoriser l'information choisie par l'utilisateur. Cette information, nous lui affectons ensuite, grâce à la
propriété Text de l'
objet VBA Selection . Comme nous l'avons déjà appris, elle restitue simplement le texte sélectionné sur le document actif. Notez l'emploi de la
fonction Trim pour purger les espaces de début et de fin. Nous nous protégeons ainsi des sélections imprécises et hasardeuses.
Maintenant, nous devons
transmettre cette donnée au
formulaire . Pour cela, nous devons désigner le
contrôle cible par son nom. Et pour l'atteindre, ce
nom d'objet doit être préfixé du
nom du formulaire lui-même.
A la suite du code de la procédure , ajouter les instructions VBA suivantes :
Sub remplacerPartout()
Dim texte As String
texte = Trim(Selection.Text)
rplcmt.info.Caption = "Le texte à remplacer est : " & texte & Chr(13) & "Son remplaçant sera formaté selon votre choix."
rplcmt.texteRplcmt.Value = texte
rplcmt.mem.Caption = texte
rplcmt.gras.Value = 1
End Sub
La
zone info est l'étiquette en entête du formulaire à laquelle nous transmettons une information indicative à destination de l'utilisateur. Elle est concaténée au texte ramassé sur le document. Notez l'emploi de la
fonction Chr avec la
valeur 13 en paramètre pour repousser la suite sur la ligne suivante du Label. Ensuite, nous transmettons le
texte sélectionné à la zone de saisie nommée
texteRplcmt . C'est lui qu'il devra changer ou conserver s'il souhaite simplement appliquer des attributs de format à toutes ses occurrences. Nous transmettons cette même information à l'étiquette mem placée sur la droite du
bouton Annuler . Notez que pour écrire dans un
Label , il faut exploiter la
propriété Caption et non plus
Text comme c'est le cas pour une zone de saisie (TextBox). Grâce à cette étiquette, le formulaire connaîtra le
texte de remplacement , tandis que le
texte à remplacer lui est fourni par la
zone de saisie texteRplcmt . Enfin, nous activons la première des cases à cocher pour que le gras soit le formatage proposé par défaut.
Maintenant, nous devons appeler le
formulaire , si et seulement si la sélection n'est pas vide.
A la suite du code de la procédure , ajouter l'instruction conditionnelle suivante :
Sub remplacerPartout()
Dim texte As String
texte = Trim(Selection.Text)
rplcmt.info.Caption = "Le texte à remplacer est : " & texte & Chr(13) & "Son remplaçant sera formaté selon votre choix."
rplcmt.texteRplcmt.Value = texte
rplcmt.mem.Caption = texte
rplcmt.gras.Value = 1
If (Len(texte) > 1) Then rplcmt.Show
End Sub
Nous testons simplement la longueur de la chaîne sélectionnée grâce à la
fonction VBA Len . Si elle ne comporte pas plus d'un caractère, la procédure est abandonnée. Dans le cas contraire, le
formulaire est appelé à se montrer grâce à la
méthode Show associée à son
nom d'objet .
Enregistrer les modifications (CTRL + S) et revenir sur le document (Alt + Tab),
Sélectionner le mot fichier à la toute fin du premier paragrahe,
Le plus simple est de double cliquer dans le mot.
Dans le ruban Outils, cliquer sur le bouton Remplacer&Format ,
Comme vous pouvez l'apprécier, le
UserForm s'affiche restituant les informations concoctées. Le texte d'accueil, sur deux lignes, est bien placé au-dessus de la zone de remplacement et il est explicite. Le terme sélectionné est clairement rapatrié dans la zone de saisie. L'utilisateur n'a plus qu'à le changer s'il le souhaite pour impacter toutes ses occurrences. La première case est effectivement cochée pour le format à appliquer. En revanche, le texte sélectionné et rappelé dans le Label situé à droite du bouton Annuler n'est pas visible. En effet, la
propriété Visible de ce contrôle est réglée Ã
False . Cette indication est nécessaire pour le code mais pas indispensable pour l'utilisateur.
Remplacer avec mise en forme
Maintenant que le
formulaire est susceptible de détenir les informations nécessaires à la recherche et au remplacement de l'expression sélectionnée, il est temps d'implémenter le code du traitement.
Revenir dans l'éditeur VBA Word ,
Dans l'explorateur de projet, double cliquer sur le userForm rplcmt ,
Sur le formulaire en conception, double cliquer sur le bouton Remplacer ,
Ainsi, nous basculons dans la feuille de
code VBA entre les bornes de la
procédure événementielle remplacer_Click .
Private Sub remplacer_Click()
Dim texteAr As String: Dim texteR As String
End Sub
Nous déclarons et typons les
variables texteAr et
texteR comme des
String respectivement pour manipuler le
texte à remplacer et le
texte de remplacement .
Il est temps maintenant de réceptionner les informations et de les afficher à l'écran en guise de test. Nous devons donc procéder à l'affectation des deux premières variables.
A la suite du code de la procédure , ajouter les instructions VBA suivantes :
Private Sub remplacer_Click()
Dim texteAr As String: Dim texteR As String
texteAr = mem.Caption
texteR = texteRplcmt.Value
MsgBox "Le texte à remplacer est : " & texteAr & Chr(13) & "Le texte de remplacement est : " & texteR
End Sub
Nous récupérons les informations transmises au
formulaire par le biais des
contrôles mem et
texteRplcmt pour les stocker dans les
variables texteAr et
texteR . Nous pouvons donc les afficher à l'écran pour les tester en supposant qu'entre temps, l'utilisateur a bien inscrit le texte de remplacement dans la
zone de saisie texteRplcmt . C'est ce que nous faisons avec la
fonction VBA MsgBox .
Sur le document Word , sélectionner le texte Fichier et cliquer sur le bouton de macro ,
Dans la zone de saisie de la boîte de dialogue, remplacer le texte fichier par le texte document ,
Puis, cliquer sur le bouton Remplacer ,
Comme vous pouvez le voir, les informations consolidées s'affichent à l'écran attestant que nous sommes en mesure de manipuler les informations transmises pour la
recherche et le remplacement .
Cliquer sur la croix du userForm pour le fermer,
Puis, revenir dans l'éditeur VBA Word dans les bornes de la procédure remplacer_Click ,
Passer la ligne du MsgBox en commentaire en la préfixant d'une apostrophe,
Maintenant, pour effectuer ce remplacement automatique, nous devons exploiter la
propriété Find de l'
objet VBA Selection . Une
macro automatique nous avait appris cette propriété et ses dépendances. Et ce sont ces dernières que nous allons régler pour effectuer tous les paramétrages avant de procéder au remplacement global. Et pour cela, nous allons regrouper les instructions dans un
bloc With afin de ne pas répéter à chaque reprise l'
objet Selection et sa
propriété Find . Ce mécanisme d'optimisation de code, nous l'avons aussi appris et mis en pratique à l'occasion de précédentes
astuces VBA Word .
A la suite du code de la procédure, ajouter les instructions VBA suivantes :
Private Sub remplacer_Click()
Dim texteAr As String: Dim texteR As String
texteAr = mem.Caption
texteR = texteRplcmt.Value
'MsgBox "Le texte à remplacer est : " & mem.Caption & Chr(13) & "Le texte de remplacement est : " & texteR
Selection.HomeKey wdStory
With Selection.Find
End With
End Sub
Comme vous pouvez le voir, avant le
bloc With et donc avant d'enclencher le mécanisme de
recherche et de remplacement , nous prenons soin de replacer le point d'insertion au
tout début du document . Et pour cela comme nous l'avons appris, nous exploitons la
méthode HomeKey de l'
objet Selection avec le
paramètre wdStory qui désigne le document. Une recherche est effectivement chronologique. En partant du tout début, nous nous assurons de ne rater aucune occurrence.
Maintenant et toujours avant d'engager le
remplacement , nous devons nous assurer que des
réglages de mise en forme n'avaient pas été définis lors d'une précédente
recherche . Car dans ces conditions, Word les conserve en mémoire. Nous allons simplement prendre soin de les annuler s'ils existaient.
Dans les bornes du bloc With , ajouter les deux instructions VBA suivantes :
...
'MsgBox "Le texte à remplacer est : " & mem.Caption & Chr(13) & "Le texte de remplacement est : " & texteR
Selection.HomeKey wdStory
With Selection.Find
.ClearFormatting
.Replacement.ClearFormatting
End With
...
La
méthode ClearFormatting associée à la
propriété Find annule les réglages de mise en forme définis pour la
recherche . Cette même méthode mais associée à la
propriété dérivée
Replacement annule les attributs définis pour le remplacement.
Par contre nous, nous devons définir les
attributs de format pour le
texte de remplacement en fonction du choix utilisateur, c'est à dire en fonction de la
case cochée . Pour cela, il suffit d'utiliser des
instructions conditionnelles en cascade afin de vérifier quelle est la case qui porte une valeur.
A la suite du code du bloc With , ajouter les instructions conditionnelles suivantes :
...
With Selection.Find
.ClearFormatting
.Replacement.ClearFormatting
If gras.Value Then
.Replacement.Font.Bold = True
ElseIf italique.Value Then
.Replacement.Font.Italic = True
ElseIf souligne.Value Then
.Replacement.Font.Underline = True
End If
End With
...
Nous exploitons donc la
propriété Value de l'objet
case à cocher . Si cette dernière renvoie une valeur, nous définissons le
format à appliquer grâce à la
propriété Font qui permet de descendre jusqu'aux attributs à régler (Bold pour gras) sinon si (ElseIf) c'est la suivante, nous adaptons les attributs en conséquence.
Enfin et nécessairement, il ne nous reste plus qu'à indiquer quel est le
texte à remplacer ainsi que le
texte de remplacement pour pouvoir lancer l'exécution du processus.
A la fin du bloc With , ajouter les trois instructions VBA suivantes :
...
With Selection.Find
.ClearFormatting
.Replacement.ClearFormatting
If gras.Value Then
.Replacement.Font.Bold = True
ElseIf italique.Value Then
.Replacement.Font.Italic = True
ElseIf souligne.Value Then
.Replacement.Font.Underline = True
End If
.Text = texteAr
.Replacement.Text = texteR
.Execute Replace:=wdReplaceAll
End With
...
La
propriété Text appliquée à la
propriété Find de l'
objet Selection permet de définir le texte cherché. Cette même propriété appliquée à la
propriété dérivée
Replacement permet de définir le texte de remplacement. Enfin, nous utilisons la
méthode Execute . Celle-ci offre de nombreux arguments facultatifs. Pour pointer directement sur celui qui nous intéresse, nous utilisons son intitulé (Replace:=). Et pour un
remplacement global , nous lui passons la valeur
wdReplaceAll .
Enregistrer les modifications (CTRL + S) puis basculer sur le document Word (ALT + Tab),
Double cliquer dans le mot fichier à la fin du premier paragraphe pour le sélectionner,
Dans le ruban Outils, cliquer sur le bouton Remplacer&Format ,
Dans la zone de saisie du UserForm , remplacer le texte fichier par le texte document ,
Puis, cliquer sur le bouton Remplacer ,
Comme vous pouvez l'apprécier, toutes les occurrences du
mot fichier sont bien remplacées par le
mot document et dans le même temps, ce dernier se pare des attributs de mise en forme choisis.
Pour finir, il conviendrait de rendre fonctionnel le
bouton Annuler . Comme vous le savez, il suffit d'exploiter la
méthode Hide associée au
nom de l'objet formulaire . Comme son nom l'indique, cette
méthode permet de
masquer le formulaire , comme s'il était fermé.