formateur informatique

Crochets automatiques autour de la sélection

Accueil  >  Bureautique  >  Word  >  Word VBA  >  Crochets automatiques autour de la sélection
Livres à télécharger


Pour partager cette vidéo sur les réseaux sociaux ou sur un site, voici son url :


Inscription Newsletter    Inscription Newsletter
Sujets que vous pourriez aussi aimer :


Encadrer automatiquement les textes

Les crochets sont plutôt fastidieux à mettre en place. Il faut les ouvrir et les fermer différemment à l'aide d'une combinaison au clavier exploitant la touche Alt Gr. Pourtant et même si leur utilisation n'est pas coutumière, ils offrent un intérêt certain. Ils permettent de "souligner" discrètement des informations complémentaires ou explicatives. En outre, ils peuvent agrémenter subtilement un document. L'enjeu ici est qu'un simple clic sur un bouton de macro encadre de crochets l'expression sélectionnée sur la présentation.



Document source
Pour la démonstration de cette nouvelle astuce VBA Word, nous proposons de récupérer un document offrant quelques paragraphes de textes à manipuler. Nous découvrons un document classique constitué de quelques paragraphes de textes. Certes, ils n'offrent pas d'informations complémentaires à proprement parlé et destinées à être subtilement identifiées par des crochets. Mais pour les besoins des démonstrations, nous nous en accommoderons. N'importe quelle expression fera l'affaire.
  • Au début du troisième paragraphe, sélectionner l'expression : thèmes et les styles,
Sélectionner un texte à faire ressortir sur un document Word

Si vous réalisez la sélection à la souris plutôt qu'au clavier, il y a fort à parier que l'espace de fin est inclus dans la plage. Mais ce n'est pas grave. Nous devons monter un petit code VBA Word capable de s'adapter au contexte.



Encadrer la sélection
Comme cet automatisme à monter peut s'avérer intéressant dans de multiples contextes, nous proposons de créer la procédure de code VBA dans le modèle Word, le Normal.dotm.
  • 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,
C'est lui qui représente le modèle Word. Au cours des différentes astuces, nous avons développé un certain nombre de modules. Et pour accueillir cette nouvelle procédure, nous choisissons le module Formats. Il permet d'influer sur l'apparence des textes sélectionnés. Si vous ne disposez d'aucun module, vous devez en créer un (Menu Insertion / Module).
  • Dans la page de code du module au centre, créer la procédure encadrer,
Sub encadrer()

End Sub
  • Puis, dans les bornes de la procédure, ajouter les trois instructions VBA suivantes :
Sub encadrer()
Selection. InsertAfter "]"
Selection.InsertBefore "["
Selection.MoveRight wdCharacter, 1

End Sub


Nous connaissons bien désormais les méthodes InsertAfter et InsertBefore de l'objet VBA Selection. Comme leurs noms l'indiquent, elles permettent respectivement d'insérer du texte après et avant la sélection. Et ce texte est passé en paramètre. Dans le premier cas, il s'agit d'un crochet fermant. Dans le second, il s'agit d'un crochet ouvrant. En d'autres termes, ces deux instructions devraient avoir suffi pour encadrer le texte de la sélection entre crochets. Puis, nous exploitons la méthode MoveRight du même objet Selection pour engager un déplacement du point d'insertion vers la droite. Avec le premier paramètre (wdCharacter), nous définissons l'unité de déplacement sur le caractère. Avec la valeur 1 en second argument, nous engageons un déplacement d'un caractère vers la droite. Bref, nous replaçons le point d'insertion juste après le texte sélectionné.
  • Enregistrer les modifications (CTRL + S) puis exécuter le code (F5),
  • Ensuite, basculer sur le document Word (ALT + Tab),
Texte sélectionné placé entre crochets par le code VBA Word

Comme vous pouvez le voir, le texte préalablement sélectionné est effectivement encadré de crochets.

Mais dans le cas où la sélection n'est pas suffisamment précise, incluant l'espace consécutif, celui-ci est considéré dans l'expression à encadrer.



Supprimer l'espace de fin résiduel
Pour plus de sureté et de souplesse, nous proposons de supprimer le potentiel espace situé à la fin de la sélection avant d'ajouter les crochets. Pour cela, il suffit de tester le dernier caractère grâce à la fonction VBA Right. S'il s'agit d'un espace, nous devons contracter la sélection d'une unité vers la gauche.
  • Au début du deuxième paragraphe, sélectionner l'expression : "aspect professionnel ",
Pour les démonstrations à venir, il est cette fois important d'englober dans la sélection l'espace placé après le mot professionnel.
  • Revenir dans l'éditeur VBA Word,
  • Dans la procédure et avant les instructions précédentes, ajouter le code VBA suivant :
Sub encadrer()

If (Right(Selection.Text, 1) = " ") Then
Selection.MoveLeft wdCharacter, 1, wdExtend
End If


Selection.InsertAfter "]"
Selection.InsertBefore "["
Selection.MoveRight wdCharacter, 1
End Sub


Le test est donc réalisé par une instruction conditionnelle (If). Et si le critère est vérifié, donc si l'espace est trouvé en bout de chaîne (= " "), alors nous exploitons la méthode MoveLeft de l'objet VBA Selection. Mais notez cette fois la présence importante du troisième paramètre (wdExtend). Avec cette valeur, nous étendons la sélection ou plutôt nous la contractons d'un caractère vers la gauche ici. De cette manière, nous excluons l'espace résiduel de la sélection proposée par l'utilisateur.
  • Enregistrer les modifications (CTRL + S), exécuter le code (F5) et basculer sur le document,
Encadrer la sélection sur le document en VBA Word en supprimant les espaces de fin

Comme vous pouvez l'apprécier, les crochets encadrent seulement l'expression. Grâce au code VBA, l'espace résiduel a automatiquement été exclu. C'est tout l'intérêt de la programmation. L'utilisateur peut s'autoriser quelques approximations pour une exploitation plus souple de la solution.



Etendre la sélection
Nous proposons maintenant de gérer un autre cas spécifique. Il intervient lorsque l'utilisateur n'émet aucune sélection mais déclenche tout de même l'exécution de la macro. Nous pourrions nous contenter d'intercepter cette exception et d'ordonner l'arrêt du traitement. Mais comme le point d'insertion est vraisemblablement placé au beau milieu d'un mot, nous souhaitons étendre la sélection de manière à l'englober intégralement. De cette manière, il sera naturellement encadré de crochets malgré l'absence de consignes précises.
  • Sur la deuxième ligne du troisième paragraphe, cliquer n'importe où dans le mot SmartArt ,
De cette manière, nous y plaçons le point d'insertion de façon aléatoire.
  • Revenir dans l'éditeur VBA Word (Alt + Tab),
  • Au début de la procédure, ajouter l'instruction conditionnelle suivante :
Sub encadrer()

If (Selection.Characters.Count = 1) Then

End If


If (Right(Selection.Text, 1) = " ") Then
Selection.MoveLeft wdCharacter, 1, wdExtend
End If

Selection.InsertAfter "]"
Selection.InsertBefore "["
Selection.MoveRight wdCharacter, 1
End Sub


Elle ne doit donc pas englober les précédents traitements que nous gardons en dehors et en bas du code de la procédure. Son rôle est de traiter le cas spécifique où aucune sélection n'est définie pour deviner automatiquement le mot à encadrer. C'est la raison pour laquelle nous exploitons la propriété Count. Ainsi associée à la collection Characters de l'objet Selection, elle retourne le nombre de caractères contenus dans la sélection. Et le critère à vérifier (= 1) est sans appel. Il est honoré lorsqu'aucune sélection n'est définie par l'utilisateur.

Nous allons donc maintenant devoir remonter caractère à caractère jusqu'à l'espace situé devant le mot où réside le point d'insertion. Dès lors, nous devrons étendre la sélection vers la droite, toujours caractère à caractère, jusqu'à atteindre l'espace situé juste après ce mot.
  • Dans les bornes de l'instruction conditionnelle, créer la boucle While suivante :
Sub encadrer()

If (Selection.Characters.Count = 1) Then
While Left(Selection.Text, 1) <> "" And Left(Selection.Text, 1) <> Chr(13)
Selection.MoveLeft wdCharacter, 1, wdExtend
Wend

End If

If (Right(Selection.Text, 1) = " ") Then
Selection.MoveLeft wdCharacter, 1, wdExtend
End If

Selection.InsertAfter "]"
Selection.InsertBefore "["
Selection.MoveRight wdCharacter, 1
End Sub


C'est un double critère que nous exploitons pour poursuivre le traitement. Tant que le premier caractère de la chaîne n'est pas un espace (Left(Selection.Text, 1) <> " ") et tant qu'il ne s'agit pas non plus d'un retour à la ligne (Left(Selection.Text, 1) <> Chr(13)), alors nous continuons d'étendre la sélection d'une unité vers la gauche (Selection.MoveLeftwdCharacter, 1, wdExtend).

En revanche, dès qu'un espace sera rencontré, la boucle While mettra fin à son traitement. Nous serons donc arrêtés sur une sélection dont le premier caractère est un espace. Pour sélectionner intégralement le mot à encadrer, nous devons replacer le point d'insertion juste devant le mot puis étendre la sélection vers la droite jusqu'à rencontrer l'espace de fin.
  • A la suite du code de l'instruction conditionnelle, ajouter les lignes VBA suivantes :
Sub encadrer()

If (Selection.Characters.Count = 1) Then
While Left(Selection.Text, 1) <> " " And Left(Selection.Text,1) <> Chr(13)
Selection.MoveLeft wdCharacter, 1, wdExtend
Wend

Selection.MoveLeft wdCharacter, 1
Selection.MoveRight wdCharacter, 1

While Right(Selection.Text, 1) <> " " And Right(Selection.Text,1) <> Chr(13)
Selection.MoveRight wdCharacter, 1, wdExtend
Wend
Selection.MoveLeft wdCharacter, 1, wdExtend

End If

If (Right(Selection.Text, 1) = " ") Then
Selection.MoveLeft wdCharacter, 1, wdExtend
End If

Selection.InsertAfter "]"
Selection.InsertBefore "["
Selection.MoveRight wdCharacter, 1
End Sub


Tout d'abord, nous positionnons le point d'insertion juste devant l'espace (Selection.MoveLeft wdCharacter, 1) puis juste après (Selection.MoveRightwdCharacter, 1). De fait, nous sommes placés juste devant le mot à encadrer. C'est pourquoi nous engageons une nouvelle boucle While. Elle doit étendre la sélection vers la droite jusqu'à ce que le dernier caractère rencontré soit un espace ou un retour à la ligne (Selection.MoveRight wdCharacter, 1, wdExtend). Lorsque l'espace de fin est effectivement atteint, la boucle stoppe son traitement. C'est pourquoi juste après, nous restreignons la sélection d'une unité vers la gauche (Selection.MoveLeft wdCharacter, 1,wdExtend) afin d'exclure cet espace.
  • Enregistrer les modifications, exécuter le code puis basculer sur le document,
Encadrer automatiquement un mot dans le document en VBA Word sans sélection préalable

Comme vous pouvez le voir, même dans ce contexte particulier, notre procédure sait s'adapter pour trouver le terme à encadrer automatiquement de crochets. Bien sûr et comme nous l'avons démontré à maintes reprises dans des astuces passées, il conviendrait maintenant d'associer cette procédure à un bouton de macro à greffer dans l'un des rubans en haut de la fenêtre Word.

 
Sur Facebook
Sur Youtube
Les livres
Contact
Mentions légales



Abonnement à la chaîne Youtube
Partager la formation
Partager sur Facebook
Partager sur Twitter
Partager sur LinkedIn