VBA – Expressions Rationnelles (Regex)

Written by

Editorial Team

Reviewed by

Steve Rynearson

Translated by

David Gagnon

Last updated on décembre 23, 2021

Ce tutoriel montre comment utiliser Regex en VBA.

Qu’est-ce que Regex ?

Regex est l’abréviation de « regular expression » en anglais se traduit « expression rationnelles ». Une expression rationnelle est un modèle composé d’une séquence de caractères que vous pouvez utiliser pour trouver un modèle correspondant dans une autre chaîne. Pour utiliser la Regex dans VBA, vous devez utiliser l’objet RegExp.

Un motif tel que [A-C] peut être utilisé pour rechercher et faire correspondre une lettre majuscule de A à C dans une séquence. Les motifs Regex ont leur propre syntaxe et peuvent être construits à partir d’un caractère ou d’une séquence de caractères.

Caractères Correspondants

Le tableau suivant présente la syntaxe qui vous permettra de construire des motifs Regex.

Syntaxe du motif Description Exemple Correspondances trouvées
. Correspond à tout caractère unique, sauf vbNewLine f.n fan, fon, f@n, fwn
[caractères] Correspond à n’importe quel caractère entre crochets [] [fn] Ne correspondrait qu’à « f » ou « n » dans fan
[^caractères] Correspond à tout caractère unique qui n’est pas entre crochets[] [^fn] Correspondrait donc à « j » dans « fjn »
[début-fin] Correspond à tout caractère faisant partie de l’intervalle entre crochets[] [1-5] Correspondrait à « 4 » et « 5 » dans « 45 »
\w Correspond aux caractères alphanumériques et au trait de soulignement, mais pas au caractère espace \w Correspond à « c » dans « ,c. »
\W Correspond à tous les caractères non alphanumériques et au trait de soulignement \W Correspondrait à « @ » dans « bb@bb »
\s Correspond à tout caractère d’espace vide tel que les espaces et les tabulations \s Correspondrait à  »  » dans « C’est »
\S Correspond à tout caractère autre qu’un espace blanc \S Correspond à « T » et « h » dans « T h »
\d Correspond à tout chiffre décimal unique \d Correspond au « 7 » dans « a7h »
\D Correspond à n’importe quel chiffre non décimal \D Correspond au « j » dans « 47j »
\ Échappe les caractères spéciaux, ce qui vous permet de les rechercher \. Correspondrait à « . » dans « 59.pQ »
\t Tabulation \t Correspond à un caractère de tabulation
\r Retour chariot \r Correspond à un retour chariot (vbCr)
\n vbNewLine(vbTab) \n Correspond à une nouvelle ligne

Quantificateurs

Vous pouvez utiliser des quantificateurs pour indiquer combien de fois vous voulez que le motif corresponde à la chaîne.

Quantificateur Description Exemple Correspondances trouvées
* Correspond à zéro ou plusieurs occurrences fn*a fna, fa, fnna, fnnna, fnfnnna
+ Correspond à une ou plusieurs occurrences fn+a fna, fnna, fnfnna
? Correspond à zéro ou un fn?a fa, fna
{n} Correspond à « n » plusieurs fois d\W{4} Correspondrait à « d…. » dans « d….&5hi »
{n,} Correspond à au moins « n » fois d\W{4,} Correspondrait à « d….& » dans « d….&5hi »
{n,m} Correspond à un nombre de fois compris entre n et m d\W{1,8} Correspondrait à « d….&&&& » dans « d….&&&&5hi »

Regroupement

Le regroupement ou la capture vous permet d’utiliser un motif pour capturer et extraire une partie d’une chaîne. Ainsi, non seulement le motif est comparé, mais la partie de la chaîne qui correspond au motif est capturée.

Modèle Description Exemple Correspondances trouvées et capturées
(expression) Regroupe et capture le motif entre parenthèses (\W{4}) Regroupe et capture « @@@@ » dans « 1@@@@1jlmba »

Comment Utiliser Regex en VBA

Pour utiliser Regex dans VBA, vous devez d’abord définir la référence dans l’éditeur VBE. Dans l’éditeur VBE, allez dans Outils > Références > Microsoft VBScript Regular Expressions

Voici les propriétés de l’objet RegExp :

  • Pattern – Le motif que vous allez utiliser pour la correspondance avec la chaîne.
  • IgnoreCase – Si Vrai, alors la correspondance ignore la casse des lettres.
  • Global – Si Vrai, alors toutes les correspondances du motif dans la chaîne sont trouvées. Si Faux, seule la première correspondance est trouvée.
  • MultiLine – Si True, la correspondance du motif se fait à travers les sauts de ligne.

Voici les méthodes de l’objet RegExp :

  • Test – Recherche un motif dans une chaîne et renvoie True si une correspondance est trouvée.
  • Replace – Remplace les occurrences du motif par la chaîne de remplacement.
  • Execute – Renvoie les correspondances du motif avec la chaîne de caractères.

Test de la Correspondance d’un Motif avec une Chaîne de Caractères

Vous pouvez utiliser la méthode Test pour vérifier si un motif correspond à une séquence dans la chaîne d’entrée. Le résultat est Vrai si une correspondance est trouvée. Le code suivant vous montre comment tester un motif par rapport à une chaîne de caractères :

Sub RegexTesterUnMotif()

Dim chaineUn As String
Dim regexUn As Object
Set regexUn = New RegExp

regexUn.Pattern = "f....a"

chaineUn = "000111fjo88a8"

Debug.Print regexUn.Test(chaineUn)

End Sub

Le résultat est le suivant :

Remplacement d’un Motif dans une Chaîne de Caractères

Vous pouvez utiliser la méthode Replace pour remplacer la première instance d’un motif correspondant dans une chaîne ou toutes les instances d’un motif correspondant dans une chaîne. Si Global a la valeur Faux, seule la première instance est remplacée. Le code suivant vous montre comment remplacer un motif dans une chaîne de caractères :

Sub RegexRemplaceUnMotif()
Dim chaineUn As String
Dim regexUn As Object
Set regexUn = New RegExp

regexUn.Pattern = "Voici le numéro"
regexUn.Global = False
chaineUn = "Voici le numéro 718901"

Debug.Print regexUn.Replace(chaineUn, "Voici le nouveau numéro")
End Sub

Le résultat est le suivant :

Pour remplacer uniquement la partie numérotée de la chaîne utilisée ci-dessus, vous utiliseriez le code suivant :

Sub RegexRemplaceUnMotifNuméros()
Dim chaineUn As String
Dim regexUn As Object
Set regexUn = New RegExp

regexUn.Pattern = "[^\D]+"
regexUn.Global = False
chaineUn = "Voici le numéro 718901"

Debug.Print regexUn.Replace(chaineUn, "777192")
End Sub

Le résultat est le suivant :

Pour remplacer chaque instance d’un certain motif dans une chaîne de caractères, vous devez définir la valeur globale à True. Le code suivant vous montre comment remplacer chaque instance de -A1289C- dans la chaîne :

Sub RegexRemplaceChaqueInstanceMotif()
Dim chaineUn As String
Dim regexUn As Object
Set regexUn = New RegExp

regexUn.Pattern = "\W\A\d+C\W"
regexUn.Global = True
chaineUn = "ABC-A1289C-ABC-A1289C-ABC"

Debug.Print regexUn.Replace(chaineUn, "IJK")
End Sub

Mise en Correspondance et Affichage d’un Motif dans une Chaîne de Caractères

Vous pouvez utiliser la méthode Execute pour faire correspondre une ou toutes les instances d’un motif dans une chaîne. Le code suivant vous montre comment faire correspondre et afficher toutes les instances du motif de la chaîne :

Sub RegexCorrespondanceEtAffichageMotif()
Dim chaineUn As String
Dim regexUn As RegExp

Set regexUn = New RegExp

regexUn.Pattern = "A.C"
regexUn.Global = True
regexUn.IgnoreCase = True
chaineUn = "ABC-A1289C-ADC-A1289C-AJC"

Set lesCorrespondances = regexUn.Execute(chaineUn)

For Each correspondance In lesCorrespondances
    Debug.Print correspondance.Value
Next correspondance

End Sub

Le résultat est le suivant :

Supposons que nous voulions uniquement faire correspondre -ADC- à la chaîne ci-dessus. Le code suivant montre comment faire correspondre et afficher uniquement -ADC- dans la chaîne :

Sub RegexCorrespondanceEtAffichageMotifSpécifique()
Dim chaineUn As String
Dim regexUn As RegExp

Set regexUn = New RegExp

regexUn.Pattern = "\-\A.C\-"
regexUn.Global = False
regexUn.IgnoreCase = True
chaineUn = "ABC-A1289C-ADC-A1289C-AJC"

Set lesCorrespondances = regexUn.Execute(chaineUn)

For Each correspondance In lesCorrespondances
    Debug.Print correspondance.Value
Next correspondance

End Sub

L’apprentissage de Regex peut prendre un certain temps, mais c’est un outil extrêmement puissant pour identifier et manipuler des chaînes de texte. Elle est également largement utilisée dans les langages de programmation.

vba-free-addin

Module Complémentaire d'Exemples de Code VBA

Accédez facilement à tous les exemples disponibles sur le site.

Naviguez simplement dans le menu, cliquez, et le code sera inséré directement dans votre module. Module complémentaire .xlam.

(Aucune installation requise!)

Téléchargement gratuit

Retour aux exemples de code VBA