Pour partager cette vidéo sur les réseaux sociaux ou sur un site, voici son url :
Sujets que vous pourriez aussi aimer : 
Corrections sur des recherches spécifiques 
Au fil des découvertes précédentes en 
VBA Word , nous avons appris à parcourir tous les éléments d'un document pour maîtriser la correction de défauts. Nous avons aussi appris à exploiter la méthode globale de remplacement grâce notamment à la 
propriété Find  de l'
objet VBA Selection . Mais lorsqu'il est question d'intervenir sur des recherches spécifiques qui ne doivent pas impacter les autres éléments du même type, le remplacement global ne peut être envisagé. Nous allons apprendre à maîtriser chaque élément trouvé pour les analyser tour à tour.
Dans l'exemple illustré par la capture, l'utilisateur souhaite la 
mise en exposant  globale de la valeur numérique associée à un code précis et répété à de multiples reprises dans le document. Ici, il s'agit du code XY45 à transformer en XY
45 . Le nombre de chiffres de cette valeur numérique doit pouvoir varier.
L'utilisateur sélectionne précisément le code XY45, puis il clique sur un 
bouton de macro  disposé dans un ruban. Une boîte de dialogue apparaît. Elle restitue le code sélectionné et demande de préciser la longueur du nombre à passer en 
exposant . Les deux informations sont séparées par une barre verticale (|). Suite à ce renseignement, l'utilisateur clique sur le bouton Ok de la boîte de dialogue pour procéder. Instantanément, tous les codes concernés sont parfaitement transformés dans une opération automatisée. Ceux qui présentent la même forme avec le même nombre comme YT45 ne sont pas impactés.
Document source 
Pour développer ce 
code VBA Word , nous proposons d'intervenir sur un 
document  proposant déjà ces spécificités à corriger.
Comme vous pouvez le voir, nous récupérons un 
document  dans lequel des codes à transformer jonchent le texte.
Récupérer la sélection de l'utilisateur 
Nous proposons de développer ce 
code VBA  dans le 
modèle de Word  (Normal.dotm). Il peut s'avérer utile en certaines circonstances. De cette manière, il sera disponible pour chaque 
document  à traiter.
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 , 
Nous désignons ainsi le 
modèle Word .
En haut de la fenêtre de l'éditeur, cliquer sur le menu Insertion , 
Puis, dans les propositions, choisir Module , 
Nous créons ainsi un nouveau 
module VBA . Sa 
feuille de code  apparaît au centre de l'écran. Elle est vierge pour l'instant.
Dans cette feuille de code, créer la procédure exp  comme suit : Sub exp() 
Des variables sont nécessaires pour traiter les informations et entreprendre les corrections.
Sub exp()Dim Code As String: Dim Longueur As Byte  
La 
variable Code  est déclarée comme un texte (String). Son rôle est de stocker l'information sélectionnée par l'utilisateur sur le 
document . La 
variable longueur  est déclarée comme un entier court (Byte). Elle doit mémoriser la seconde donnée transmise par l'utilisateur par le biais de la boîte de dialogue, sur la 
longueur du nombre  dans le code. Nous déclarons aussi un 
tableau de variables nommé Valeurs , en atteste la présence des parenthèses. C'est lui qui doit recevoir les deux informations scindées pour les diffuser dans les deux 
variables  évoquées précédemment. Enfin, la 
variable Plage  est déclarée comme un 
objet de type Range . Dans le processus d'analyse des codes, elle permettra d'étudier les chaînes seulement sur un fragment correspondant à l'information transmise sur la longueur du 
nombre à passer en exposant .
Ensuite et avant de débuter l'implémentation du code, une 
gestion d'erreur  apparaît opportune.
Après les déclarations de variables , ajouter les instructions VBA  suivantes : Sub exp()On Error GoTo Pb  
De cette manière, si une erreur est détectée (On Error), la suite du traitement est renvoyée à l'étiquette Pb (GoTo Pb). Cette étiquette doit intervenir en dernière position dans la procédure. Tout le reste du code que nous allons développer sera placé au-dessus. Dans cette étiquette, c'est une 
boîte de dialogue  qui livre des indications à l'utilisateur, grâce à la 
fonction VBA MsgBox . Ces erreurs peuvent intervenir lorsque les informations transmises par l'utilisateur ne sont pas conformes.
Il est temps maintenant de communiquer avec l'utilisateur. Et comme nous l'avons vu à l'occasion de l'astuce précédente, c'est la 
fonction VBA InputBox  qui fournit une 
boîte de dialogue avec une zone de saisie . Comme il s'agit d'une 
fonction , elle retourne une valeur. Cette valeur n'est autre que l'information contenue dans la zone de saisie. Et nous devons la mémoriser dans la 
variable Code  dans un premier temps.
Au-dessus de l'étiquette Pb , ajouter l'instruction VBA  suivante :Sub exp()Code = InputBox("Texte pour la mise en exposant", "", Selection.Text & "|Longueur_exposant_à_préciser")  
Nous l'avons déjà expliqué, en 
premier paramètre  de la 
fonction InputBox , nous fournissons l'indication à afficher sur la boîte de dialogue. En deuxième paramètre, nous pouvons définir son titre. Ici, nous choisissons de ne pas le renseigner avec une succession de deux guillemets. Enfin, le troisième argument représente la valeur par défaut à afficher dans la zone de saisie. Nous pourrions très bien ne pas le renseigner. Mais dans notre cas, il est utile. Nous restituons tout d'abord la donnée sélectionnée par l'utilisateur sur le document grâce à la 
propriété Text  de l'
objet VBA Selection . Par concaténation (&), nous ajoutons une information à renseigner, à destination de l'utilisateur (|Longueur_exposant_à_préciser). Cette chaine assemblée est dès lors stockée dans la 
variable Code .
Nous allons maintenant devoir fractionner l'indication contenue dans cette 
variable Code . Il s'agit de dissocier la partie textuelle de la partie numérique. Pour être stockées indépendamment, le 
tableau de variables Valeurs  est essentiel. Et pour réaliser la découpe sur un caractère remarquable, c'est la 
fonction VBA Split  que nous devons utiliser.
A la suite de l'instruction précédente, ajouter la ligne VBA  suivante : Sub exp()Valeurs = Split(Code, "|")  
Comme seules deux informations sont séparées par la barre verticale, utilisée comme 
caractère de découpe  puisque fourni en second argument de la 
fonction Split , il en résulte un 
tableau de deux rangées .
Le code complet est placé sur la première ligne du tableau tandis que l'information sur la longueur du nombre est stockée sur la deuxième ligne. En conséquence, nous savons comment récupérer ces données pour les stocker dans les variables dédiées.
Toujours à la suite du code, ajouter l'instruction VBA  suivante : Sub exp()Code = Valeurs(0): Longueur = Valeurs(1)  
Dans la 
syntaxe VBA , c'est le symbole deux points (:) qui permet de réaliser plusieurs affectations sur une même ligne. Nous récupérons le code de la première rangée à l'indice 0 pour le stocker dans la 
variable Code . Puis, nous récupérons l'information sur le nombre de chiffres dans la seconde rangée, soit à l'indice 1 et que nous stockons dans la 
variable Longueur .
Chercher l'information sélectionnée 
Maintenant que nous connaissons précisément quelle est l'information à traiter, nous pouvons envisager de la parcourir à travers tout le document, comme vous le savez, à l'aide de la 
propriété Find  de l'
objet VBA Selection . Mais avant cela et pour n'omettre aucune occurrence, nous devons nous assurer de replacer le point d'insertion au tout début du document. C'est la 
méthode HomeKey  désormais bien connue qui permet de réaliser ce type de déplacement.
A la suite du code, ajouter l'instruction VBA  suivante : Sub exp()Selection.HomeKey wdStory  
Nous l'avons précisé à de multiples reprises par le passé, c'est la 
valeur wdStory  passée à la 
méthode HomeKey  qui désigne l'
article , soit le 
document Word dans sa globalité . C'est la raison pour laquelle nous engageons un repositionnement du point d'insertion sur le tout premier caractère de ce dernier.
Désormais, il s'agit d'engager la recherche du code pour pouvoir l'étudier, notamment sur les caractères numériques. Nous le savons, nous devons exploiter la 
propriété Find  de l'
objet VBA Selection . Mais cette 
propriété  désigne la recherche au sens large. Nous devons préciser certains attributs par le biais de 
propriétés enfants . Il s'agit notamment du sens de la recherche ou encore du texte cherché. Et plutôt que de répéter à chaque reprise le nom de l'objet et de sa propriété parente, il convient d'
optimiser le code  avec un 
bloc With .
A la suite du code, ajouter le bloc With  comme suit : Sub exp()With Selection.Find  
Grâce à lui, nous allons maintenant pouvoir régler les attributs de la recherche.
Dans le bloc With , ajouter les réglages suivants : Sub exp().ClearFormatting  
D'anciennes recherches peuvent avoir été faites sur des attributs de format particuliers. Nous décidons de ne pas en tenir compte grâce à la 
méthode ClearFormatting  de la 
propriété Find  de l'
objet Selection . Nous définissons le 
sens de la recherche  vers l'avant grâce à la 
propriété enfant Forward  que nous réglons à 
True . Nous indiquons ensuite quel est le 
texte à trouver dans le document , grâce à la 
propriété enfant Text . Il s'agit de la sélection de l'utilisateur mémorisée dans la 
variable Code . Enfin, nous lançons la recherche grâce à la 
méthode Execute  de la 
propriété Find  de l'
objet Selection .
Cette 
méthode Execute , sans aucun paramètre fourni, va s'arrêter sur la prochaine occurrence. C'est l'occasion de l'analyser pour passer son extension numérique en exposant, si elle correspond. Suite à cela, nous devons poursuivre le processus pour atteindre l'occurrence suivante jusqu'à la dernière. En conséquence, une boucle est nécessaire pour poursuivre le traitement, tant qu'un terme correspondant est trouvé.
A la suite du code, créer les bornes de la boucle  comme suit : Sub exp()While .Found  
C'est donc la 
propriété booléenne Found  de la 
propriété Find  de l'
objet Selection  qui permet de renseigner sur le statut de la recherche. Tant que la dernière occurrence cherchée n'est pas atteinte, la suivante est demandée.
Mais avant de passer à la prochaine occurrence, nous devons analyser celle sur laquelle nous sommes arrêtés. Et pour cela, nous devons exploiter notre 
objet Plage . Il s'agit d'analyser les données numériques après l'information textuelle, grâce à la précision sur la longueur, fournie par l'utilisateur. Comme il s'agit d'un 
objet , nous devons l'initialiser grâce au 
mot clé Set .
Dans les bornes de la boucle , ajouter l'instruction VBA  suivante : Sub exp()Set Plage = ActiveDocument.Range(Selection.Range.Start + Len(Code) - Longueur, Selection.Range.End)  
Nous l'initialisons donc sur une 
plage de texte  dont nous précisons la 
borne de départ  et la 
borne de fin  grâce à l'
objet enfant Range  de l'
objet parent ActiveDocument  qui désigne donc le document sur lequel nous travaillons. La 
propriété Range  de l'
objet Selection  fournit des propriétés enfants que nous exploitons dans ces paramètres. Nous définissons le point de départ de la plage de texte sur le premier caractère numérique. Pour cela, à la longueur de la chaîne fournie par la 
fonction Len  (Len(Code)), nous retranchons le nombre de caractères numériques.
Il ne nous reste plus qu'à définir l'action de mise en forme, soit la transformation en exposant et de passer à l'occurrence suivante pour poursuivre le traitement de la boucle.
A la suite du code de la boucle , ajouter les deux instructions VBA  suivantes :Sub exp()Plage.Font.Superscript = True  
C'est donc la 
propriété enfant Superscript  de la 
propriété Font  d'un 
objet de type Range  qui permet de passer le 
texte en Exposant . Ensuite et comme nous le savons, la 
méthode Execute  de la 
propriété Find  de l'
objet Selection  permet de poursuivre la recherche.
Avant de tester le code, nous devons ajouter une dernière instruction. Elle est destinée à quitter la procédure juste avant la gestion d'erreur, lorsqu'aucune anomalie n'a été croisée.
Ajouter l'instruction Exit Sub  juste avant l'étiquette Pb: , 
Désormais, nous pourrions créer un 
bouton de macro  et le disposer dans un 
ruban personnalisé . Mais comme nous avons démontré la procédure à maintes reprises, nous proposons d'exécuter la macro directement dans le flux du document.
Basculer sur le document Word  (Alt + Tab), 
Sélectionner alors précisément l'un des codes XY45 , 
En haut de la fenêtre Word , cliquer sur l'onglet Développeur  pour activer son ruban, 
S'il n'est pas visible dans votre environnement, vous devez cliquer droit n'importe où sur le ruban actif. Dans le menu contextuel, vous devez choisir la 
commande Personnaliser le ruban . Dans la liste de droite de la boîte de dialogue qui suit, vous devez 
cocher la case Développeur  et valider par le bouton Ok.
Dans la section Codes  à gauche du ruban Développeur , cliquer sur le bouton Macros , 
Dans la boîte de dialogue qui suit, sélectionner la macro exp , 
Puis, cliquer sur le bouton Exécuter  pour lancer le traitement, A l'invite de la boîte du InputBox , double cliquer sur le texte après la barre verticale, 
Ainsi, toute l'information à remplacer est sélectionnée.
Taper le chiffre 2 pour renseigner sur les 2 chiffres du code, 
Puis, cliquer sur le bouton ok de la boîte de dialogue, 
Aussitôt, tous les nombres accompagnant le code désigné sont passés en exposant dans l'intégralité du document. Tous ceux qui ne sont pas de la même forme ne sont pas impactés. Et la 
procédure VBA  que nous avons construite s'adapte à tout type de code dans la mesure où l'information numérique fournie est correcte.
Nous pourrions par exemple réitérer l'opération sur l'inconnue x2 qui est présente à deux reprises. La longueur à fournir dans la boîte de dialogue est de 1 caractère. Après exécution, nous constatons que toutes les inconnues concernées ont parfaitement été formatées (X
2 ).