formateur informatique

Chercher la partie numérique des chaînes de textes

Accueil  >  Bureautique  >  Word  >  Word VBA  >  Chercher la partie numérique des chaînes de textes
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 :


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.

Corrections globales sur des recherches spécifiques dans un document Word grâce au code VBA

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 XY45. 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,
Exécuter une macro VBA Word sur un texte sélectionné

  • 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.

Rechercher un code alphanumérique en VBA Word

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 (X2).

 
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