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()
End Sub
Des variables sont nécessaires pour traiter les informations et entreprendre les corrections.
Sub exp()
Dim Code As String: Dim Longueur As Byte
Dim Plage As Range: Dim Valeurs() As String
End Sub
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()
Dim Code As String: Dim Longueur As Byte
Dim Plage As Range: Dim Valeurs() As String
On Error GoTo Pb
Pb:
MsgBox "Les données fournies ne sont pas correctes"
End Sub
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()
Dim Code As String: Dim Longueur As Byte
Dim Plage As Range: Dim Valeurs() As String
On Error GoTo Pb
Code = InputBox("Texte pour la mise en exposant", "", Selection.Text & "|Longueur_exposant_à _préciser")
Pb:
MsgBox "Les données fournies ne sont pas correctes"
End Sub
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()
Dim Code As String: Dim Longueur As Byte
Dim Plage As Range: Dim Valeurs() As String
On Error GoTo Pb
Code = InputBox("Texte pour la mise en exposant", "", Selection.Text & "|Longueur_exposant_à _préciser")
Valeurs = Split(Code, "|")
Pb:
MsgBox "Les données fournies ne sont pas correctes"
End Sub
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()
Dim Code As String: Dim Longueur As Byte
Dim Plage As Range: Dim Valeurs() As String
On Error GoTo Pb
Code = InputBox("Texte pour la mise en exposant", "", Selection.Text & "|Longueur_exposant_à _préciser")
Valeurs = Split(Code, "|")
Code = Valeurs(0): Longueur = Valeurs(1)
Pb:
MsgBox "Les données fournies ne sont pas correctes"
End Sub
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()
Dim Code As String: Dim Longueur As Byte
Dim Plage As Range: Dim Valeurs() As String
On Error GoTo Pb
Code = InputBox("Texte pour la mise en exposant", "", Selection.Text & "|Longueur_exposant_à _préciser")
Valeurs = Split(Code, "|")
Code = Valeurs(0): Longueur = Valeurs(1)
Selection.HomeKey wdStory
Pb:
MsgBox "Les données fournies ne sont pas correctes"
End Sub
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()
Dim Code As String: Dim Longueur As Byte
Dim Plage As Range: Dim Valeurs() As String
On Error GoTo Pb
Code = InputBox("Texte pour la mise en exposant", "", Selection.Text & "|Longueur_exposant_à _préciser")
Valeurs = Split(Code, "|")
Code = Valeurs(0): Longueur = Valeurs(1)
Selection.HomeKey wdStory
With Selection.Find
End With
Pb:
MsgBox "Les données fournies ne sont pas correctes"
End Sub
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()
Dim Code As String: Dim Longueur As Byte
Dim Plage As Range: Dim Valeurs() As String
On Error GoTo Pb
Code = InputBox("Texte pour la mise en exposant", "", Selection.Text & "|Longueur_exposant_à _préciser")
Valeurs = Split(Code, "|")
Code = Valeurs(0): Longueur = Valeurs(1)
Selection.HomeKey wdStory
With Selection.Find
.ClearFormatting
.Forward = True
.Text = Code
.Execute
End With
Pb:
MsgBox "Les données fournies ne sont pas correctes"
End Sub
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()
Dim Code As String: Dim Longueur As Byte
Dim Plage As Range: Dim Valeurs() As String
On Error GoTo Pb
Code = InputBox("Texte pour la mise en exposant", "", Selection.Text & "|Longueur_exposant_à _préciser")
Valeurs = Split(Code, "|")
Code = Valeurs(0): Longueur = Valeurs(1)
Selection.HomeKey wdStory
With Selection.Find
.ClearFormatting
.Forward = True
.Text = Code
.Execute
While .Found
Wend
End With
Pb:
MsgBox "Les données fournies ne sont pas correctes"
End Sub
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()
Dim Code As String: Dim Longueur As Byte
Dim Plage As Range: Dim Valeurs() As String
On Error GoTo Pb
Code = InputBox("Texte pour la mise en exposant", "", Selection.Text & "|Longueur_exposant_à _préciser")
Valeurs = Split(Code, "|")
Code = Valeurs(0): Longueur = Valeurs(1)
Selection.HomeKey wdStory
With Selection.Find
.ClearFormatting
.Forward = True
.Text = Code
.Execute
While .Found
Set Plage = ActiveDocument.Range(Selection.Range.Start + Len(Code) - Longueur, Selection.Range.End)
Wend
End With
Pb:
MsgBox "Les données fournies ne sont pas correctes"
End Sub
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()
Dim Code As String: Dim Longueur As Byte
Dim Plage As Range: Dim Valeurs() As String
On Error GoTo Pb
Code = InputBox("Texte pour la mise en exposant", "", Selection.Text & "|Longueur_exposant_à _préciser")
Valeurs = Split(Code, "|")
Code = Valeurs(0): Longueur = Valeurs(1)
Selection.HomeKey wdStory
With Selection.Find
.ClearFormatting
.Forward = True
.Text = Code
.Execute
While .Found
Set Plage = ActiveDocument.Range(Selection.Range.Start + Len(Code) - Longueur, Selection.Range.End)
Plage.Font.Superscript = True
.Execute
Wend
End With
Pb:
MsgBox "Les données fournies ne sont pas correctes"
End Sub
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 ).