Table des matières
Dans ce tutoriel, nous allons voir en détail comment utiliser les expressions rationnelles pour faire correspondre des chaînes de caractères dans Excel.
Lorsque vous avez besoin de trouver une certaine valeur dans une plage de cellules, vous utilisez la fonction MATCH ou XMATCH. Lorsque vous cherchez une chaîne de caractères spécifique dans une cellule, les fonctions FIND et SEARCH sont très utiles. Et comment savoir si une cellule contient des informations qui correspondent à un modèle donné ? Évidemment, en utilisant des expressions régulières. Mais Excel ne supporte pas les expressions régulières ! Pas d'inquiétude, nous allons le forcer à le faire :)
Fonction Regex Excel VBA pour faire correspondre des chaînes de caractères
Comme le titre l'indique clairement, pour utiliser des expressions régulières dans Excel, vous devez créer votre propre fonction. RegExp que vous pouvez utiliser dans votre code comme indiqué ci-dessous :
Public Function RegExpMatch(input_range As Range, pattern As String , Optional match_case As Boolean = True ) As Variant Dim arRes() As Variant 'tableau pour stocker les résultats Dim iInputCurRow, iInputCurCol, cntInputRows, cntInputCols As Long 'index de la ligne courante dans la plage source, index de la colonne courante dans la plage source, nombre de lignes, nombre de colonnes On Error GoTo ErrHandlRegExpMatch = arRes Set regex = CreateObject ( "VBScript.RegExp" ) regex.pattern = pattern regex.Global = True regex.MultiLine = True If True = match_case Then regex.ignorecase = False Else regex.ignorecase = True End If cntInputRows = input_range.Rows.Count cntInputCols = input_range.Columns.Count ReDim arRes(1 To cntInputRows, 1 To cntInputCols) For iInputCurRow = 1 To cntInputRows ForiInputCurCol = 1 To cntInputCols arRes(iInputCurRow, iInputCurCol) = regex.Test(input_range.Cells(iInputCurRow, iInputCurCol).Value) Next Next RegExpMatch = arRes Exit Function ErrHandl : RegExpMatch = CVErr(xlErrValue) End FunctionCollez le code dans l'éditeur VBA, et votre nouvelle application RegExpMatch Si vous n'avez pas beaucoup d'expérience en VBA, ce guide peut vous être utile : Comment insérer un code VBA dans Excel.
Remarque : après avoir inséré le code, n'oubliez pas d'enregistrer votre fichier en tant que fichier classeur activé par macro (.xlsm).
Syntaxe de RegExpMatch
Le site RegExpMatch La fonction vérifie si une partie de la chaîne de caractères source correspond à une expression régulière. Le résultat est une valeur booléenne : VRAI si au moins une correspondance est trouvée, FAUX sinon.
Notre fonction personnalisée possède 3 arguments - les deux premiers sont obligatoires et le dernier est facultatif :
RegExpMatch(texte, motif, [match_case])Où :
- Texte (obligatoire) - une ou plusieurs chaînes de caractères à rechercher, pouvant être fournies comme référence de cellule ou de plage.
- Patronage (obligatoire) - l'expression régulière à comparer. Lorsqu'il est placé directement dans une formule, un motif doit être placé entre guillemets.
- Match_case (facultatif) - définit le type de correspondance. Si VRAI ou omis (par défaut), une correspondance sensible à la casse est effectuée ; si FAUX - insensible à la casse.
La fonction fonctionne dans toutes les versions d'Excel 365, Excel 2021, Excel 2019, Excel 2016, Excel 2013 et Excel 2010.
3 choses que vous devez savoir sur RegExpMatch
Avant de passer aux calculs pratiques, veuillez prendre note des points suivants qui clarifient certains aspects techniques :
- La fonction peut traiter un cellule unique ou gamme de cellules Dans ce dernier cas, les résultats sont renvoyés dans les cellules voisines sous la forme d'un tableau dynamique ou d'une plage de déversement, comme dans cet exemple.
- Par défaut, la fonction est sensible à la casse Pour ignorer la casse du texte, définissez le paramètre match_case En raison des limitations de VBA Regexp, le motif insensible à la casse (?i) n'est pas pris en charge.
- Si un motif valide n'est pas trouvé, la fonction renvoie FALSE ; si le modèle le modèle n'est pas valide une erreur #VALUE ! se produit.
Vous trouverez ci-dessous quelques exemples de correspondances regex créés à des fins de démonstration. Nous ne pouvons pas garantir que nos modèles fonctionneront parfaitement avec un éventail plus large de données d'entrée dans vos feuilles de calcul réelles. Avant de les mettre en production, assurez-vous de tester et d'ajuster nos exemples de modèles en fonction de vos besoins.
Comment utiliser les expressions rationnelles pour faire correspondre des chaînes de caractères dans Excel ?
Lorsque toutes les chaînes de caractères que vous souhaitez faire correspondre ont le même motif, les expressions régulières constituent une solution idéale.
Supposons que vous disposiez d'une plage de cellules (A5:A9) contenant divers détails sur certains articles. Vous souhaitez savoir quelles cellules comportent des numéros d'article (SKU). En supposant que chaque SKU se compose de 2 lettres majuscules, d'un tiret et de 3 chiffres, vous pouvez les faire correspondre en utilisant l'expression suivante.
Patronage : \b[A-Z]{2}-\d{3}\b
Où [A-Z]{2} signifie 2 lettres majuscules de A à Z et \d{3} signifie 3 chiffres de 0 à 9. Le caractère \b indique une limite de mot, ce qui signifie qu'un SKU est un mot distinct et ne fait pas partie d'une chaîne plus importante telle que 23-MAR-2022.
Le modèle étant établi, nous pouvons passer à l'écriture d'une formule. Essentiellement, l'utilisation d'une fonction personnalisée n'est pas différente de celle d'une fonction native. Dès que vous commencez à taper une formule, le nom de la fonction apparaît dans la liste proposée par l'autocomplétion d'Excel. Toutefois, il existe quelques nuances entre Excel Array dynamique (Microsoft 365 et Excel 2021) et Excel traditionnel (2019 et versions antérieures).
Faire correspondre une chaîne de caractères dans une cellule
Pour faire correspondre une chaîne dans une seule cellule, faites référence à cette cellule dans le premier argument. Le second argument est censé contenir une expression régulière.
=RegExpMatch(A5, "\b[A-Z]{2}-\d{3}\b")
Le motif peut également être conservé dans une cellule prédéfinie, qui est verrouillée avec une référence absolue ($A$2) :
=RegExpMatch(A5, $A$2)
Après avoir saisi la formule dans la première cellule, vous pouvez la faire glisser vers le bas sur toutes les autres lignes.
Cette méthode fonctionne parfaitement dans toutes les versions d'Excel .
Faire correspondre des chaînes de caractères dans plusieurs cellules à la fois
Pour faire correspondre plusieurs chaînes de caractères avec une seule formule, incluez une référence de plage dans le premier argument :
=RegExpMatch(A5:A9, "\b[A-Z]{2}-\d{3}\b")
Sur Excel 365 et Excel 2021 qui prennent en charge les tableaux dynamiques, cela fonctionne de la manière suivante : vous tapez la formule dans la première cellule, vous appuyez sur la touche Entrée et la formule se répand automatiquement dans les cellules inférieures.
Sur Excel 2019 et antérieures, elle fonctionne uniquement comme une formule de tableau CSE traditionnelle, qui est saisie dans une plage de cellules et complétée en appuyant simultanément sur les touches Ctrl + Shift + Enter.
Regex pour correspondre au numéro
Pour faire correspondre n'importe quel chiffre de 0 à 9, utilisez la fonction \d En fonction de votre tâche particulière, ajoutez un quantificateur approprié ou créez un motif plus complexe.
Regex pour correspondre à n'importe quel nombre
Pour faire correspondre n'importe quel nombre de n'importe quelle longueur, mettez le quantificateur + juste après le caractère /d, qui indique de rechercher les nombres contenant 1 ou plusieurs chiffres.
Patronage : \d+
=RegExpMatch(A5:A9, "\d+")
Regex pour correspondre à un nombre de longueur spécifique
Si votre objectif est de faire correspondre des valeurs numériques contenant un certain nombre de chiffres, utilisez \d avec un quantificateur approprié.
Par exemple, pour faire correspondre des numéros de facture composés d'exactement 7 chiffres, vous utiliserez \d{7}. Cependant, gardez à l'esprit qu'il fera correspondre 7 chiffres n'importe où dans la chaîne, y compris un numéro à 10 ou 100 chiffres. Si ce n'est pas ce que vous recherchez, mettez le mot limite \b des deux côtés.
Patronage : \b\d{7}\b
=RegExpMatch(A5:A9, "\b\d{7}\b")
Regex pour faire correspondre les numéros de téléphone
Comme les numéros de téléphone peuvent être écrits dans différents formats, leur mise en correspondance nécessite une expression régulière plus sophistiquée.
Dans l'ensemble de données ci-dessous, nous allons rechercher des nombres à 10 chiffres qui ont 3 chiffres dans les 2 premiers groupes et 4 chiffres dans le dernier groupe. Les groupes peuvent être séparés par un point, un trait d'union ou un espace. Le premier groupe peut être mis entre parenthèses ou non.
Motif : (\d{3}\N-)
En décomposant cette expression régulière, voici ce que nous obtenons :
- La première partie (\(\d{3}})
- La partie [-\.\s] ? signifie 0 ou 1 occurrence de n'importe quel caractère entre crochets : trait d'union, point ou espace.
- Ensuite, il y a un autre groupe de 3 chiffres d{3} suivis d'un trait d'union, d'un point ou d'un espace [\-\.\s] ? apparaissant 0 ou 1 fois.
- Le dernier groupe de 4 chiffres \d{4} est suivi d'une limite de mot \b pour indiquer clairement qu'un numéro de téléphone ne peut pas faire partie d'un numéro plus grand.
Avec la chaîne originale en A5 et l'expression régulière en A2, la formule prend cette forme :
=RegExpMatch(A5, $A$2)
... et fonctionne exactement comme prévu :
Notes :
- Les codes internationaux ne sont pas vérifiés, ils peuvent donc être présents ou non.
- Dans les expressions régulières, \s représente tout caractère d'espacement tel qu'un espace, une tabulation, un retour chariot ou une nouvelle ligne. Pour n'autoriser que les espaces, utilisez [-\. ] au lieu de [-\.\s].
- [^13] correspondra à tout caractère unique qui n'est pas 1 ou 3.
- [^1-3] correspondra à tout caractère unique qui n'est pas 1, 2 ou 3 (c'est-à-dire tout chiffre de 1 à 3).
- L'expression ci-dessus ne fonctionne que pour ligne unique Dans le cas de chaînes de caractères à plusieurs lignes, les caractères ^ et $ correspondent au début et à la fin de chaque ligne au lieu du début et de la fin de la chaîne d'entrée, par conséquent la regex ne recherche que dans la première ligne.
- Pour correspondre aux chaînes de caractères qui ne pas démarrer avec certains textes utilisez une expression régulière telle que ^(?!lemons).*$.
- Pour correspondre aux chaînes de caractères qui ne pas terminer avec certains textes pour inclure l'ancre de fin de chaîne dans le modèle de recherche : ^((?!lemons$).)*$.
- Nom d'utilisateur : En gardant à l'esprit que \w correspond à n'importe quelle lettre, chiffre ou trait de soulignement, nous obtenons la regex suivante : [\w\.\-]+.
- Nom de domaine peut inclure des lettres majuscules et minuscules, des chiffres, des traits d'union (mais pas en première ni en dernière position) et des points (dans le cas de sous-domaines). Les caractères de soulignement n'étant pas autorisés, nous utilisons 3 jeux de caractères différents au lieu de \w : [A-Za-z0-9]+[A-Za-z0-9\.\-]*[A-Za-z0-9]+.
- Domaine de premier niveau se compose d'un point suivi de lettres majuscules et minuscules. Il peut contenir de 2 à 24 lettres (le plus long TLD existant actuellement) : \.[A-Za-z]{2,24}
- Fournir une référence de plage à RegExpMatch, afin qu'il renvoie un tableau de valeurs VRAIES et FAUX.
- Utilisez une double négation (--) pour contraindre les valeurs logiques à des uns et des zéros.
- Utilisez la fonction SUM pour additionner les 1 et les 0 dans le tableau résultant.
- Sur le Ablebits Data dans l'onglet Texte cliquez sur Outils Regex .
- Sur le Outils Regex faites ce qui suit :
- Sélectionnez les chaînes sources.
- Entrez votre motif.
- Choisissez le Match option.
- Pour obtenir les résultats sous forme de formules, et non de valeurs, sélectionnez l'option Insérer comme une formule la case à cocher.
- Cliquez sur le bouton Match bouton.
- La fonction peut être inséré directement dans une cellule via la norme Fonction d'insertion où elle est classée sous la rubrique AblebitsUDFs .
- Par défaut, une expression régulière est ajoutée à la formule, mais vous pouvez également la conserver dans une cellule séparée. Pour cela, il suffit d'utiliser une référence de cellule pour le 2e argument.
- Par défaut, la fonction est sensible à la casse Pour une correspondance insensible à la casse, utilisez le modèle (?i).
Regex pour ne pas faire correspondre le caractère
Pour trouver des chaînes de caractères qui ne contiennent PAS un certain caractère, vous pouvez utiliser des classes de caractères négatives [^ ] qui correspondent à tout ce qui n'est PAS entre parenthèses. Par exemple :
Dans une liste de numéros de téléphone, supposons que vous vouliez trouver ceux qui n'ont pas de code de pays. En gardant à l'esprit que tout code international comprend le signe +, vous pouvez utiliser la classe de caractères [^\+] pour trouver les chaînes qui ne contiennent pas de signe plus. Il est important de réaliser que l'expression ci-dessus correspond à tout caractère unique qui n'est pas +. Parce qu'un numéro de téléphone peut être n'importe où dans une chaîne, pasnécessairement au tout début, le quantificateur * est ajouté pour vérifier chaque caractère suivant. Les ancres de début ^ et de fin $ garantissent que l'ensemble de la chaîne est traité. En conséquence, nous obtenons l'expression régulière ci-dessous qui dit "ne pas faire correspondre le caractère + dans n'importe quelle position de la chaîne".
Patronage : ^[^\+]*$
=RegExpMatch(A5, "^[^\+]*$")
Regex pour ne PAS correspondre à la chaîne de caractères
Bien qu'il n'existe pas de syntaxe d'expression régulière spéciale pour la non-correspondance d'une chaîne spécifique, vous pouvez émuler ce comportement en utilisant un lookahead négatif.
Supposons que vous souhaitiez trouver des chaînes de caractères qui ne contiennent pas le mot "lemons". Cette expression régulière fonctionnera à merveille :
Patronage : ^((?!lemons).)*$
Il est évident qu'une explication est nécessaire ici. Le lookahead négatif (?!lemons) regarde à droite pour voir s'il n'y a pas de mot "lemons" devant. Si "lemons" n'est pas là, alors le point correspond à n'importe quel caractère sauf un saut de ligne. L'expression ci-dessus effectue une seule vérification, et le quantificateur * la répète zéro fois ou plus, du début de la chaîne ancrée par ^ à la fin de la chaîne ancrée par$.
Pour ignorer la casse du texte, nous mettons le troisième argument à FALSE pour que notre fonction ne tienne pas compte de la casse :
=RegExpMatch(A5, $A$2, FALSE)
Conseils et notes :
Correspondance insensible à la casse
Dans les expressions régulières classiques, il existe un motif spécial pour la correspondance insensible à la casse (?i), qui n'est pas pris en charge dans VBA RegExp. Pour surmonter cette limitation, notre fonction personnalisée accepte le 3e argument facultatif nommé match_case Pour effectuer une correspondance insensible à la casse, il suffit de lui donner la valeur FALSE.
Supposons que vous souhaitiez identifier des dates telles que le 1er mars 22 ou le 1er mars 2022. jj-mmm-aaaa et j-mmm-aa nous utilisons l'expression régulière suivante.
Patronage : \b\d{1,2}-(Jan
Notre expression recherche un groupe de 1 ou 2 chiffres, suivi d'un trait d'union, suivi de l'une des abréviations de mois séparées par
Pourquoi ne pas utiliser un modèle plus simple comme \d{1,2}-[A-Za-z]{3}-\d{2,4}\b ? Pour éviter les faux positifs comme 01-ABC-2020.
Entrez le motif en A2, et vous obtiendrez la formule suivante :
=RegExpMatch(A5, $A$2, FALSE)
Regex pour faire correspondre les adresses électroniques valides
Comme on le sait généralement, une adresse électronique se compose de 4 parties : le nom d'utilisateur, le symbole @, le nom de domaine (serveur de messagerie) et le domaine de premier niveau (tel que .com, .edu, .org, etc.). Pour vérifier la validité d'une adresse électronique, nous devons reproduire la structure ci-dessus à l'aide d'expressions régulières.
Patronage : \b[\w\.\-]+@[A-Za-z0-9]+[A-Za-z0-9\.\-]*[A-Za-z0-9]+\.[A-Za-z]{2,24}\b
Pour mieux comprendre ce qui se passe ici, examinons de plus près chaque partie :
Remarque : le modèle suppose que le nom de domaine contient 2 caractères alphanumériques ou plus.
Avec le texte original en A5 et le motif en A5, la formule prend cette forme :
=RegExpMatch(A5, $A$2)
Vous pouvez aussi utiliser une expression régulière plus simple pour la validation des courriels, avec un jeu de caractères en minuscules ou en majuscules :
Patronage : \b[\w\.\-]+@[a-z0-9]+[a-z0-9\.\-]*[a-z0-9]+\.[a-z]{2,24}\b
Mais faites en sorte que votre formule ne tienne pas compte de la casse :
=RegExpMatch(A5, $A$2, FALSE)
Formule IF d'Excel avec regex de correspondance
Étant donné que les fonctions intégrées et personnalisées s'accordent parfaitement, rien ne vous empêche de les utiliser ensemble dans une même formule.
Pour renvoyer ou calculer quelque chose si une expression régulière correspond et autre chose si elle ne correspond pas, intégrez la fonction RegExpMatch personnalisée dans le texte logique de IF :
IF(RegExpMatch(...), [valeur_if_true], [valeur_if_false])Par exemple, si une chaîne de caractères en A5 contient une adresse électronique valide, vous pouvez renvoyer "Oui", sinon "Non".
=IF(RegExpMatch(A5, $A$2,), "Oui", "Non")
Compter si la regex correspond
Comme les fonctions natives d'Excel ne prennent pas en charge les expressions régulières, il n'est pas possible de placer une expression régulière directement dans la fonction COUNTIS ou COUNTIFS. Heureusement, vous pouvez émuler cette fonctionnalité en utilisant notre fonction personnalisée.
Supposons que vous ayez utilisé une expression rationnelle pour faire correspondre des numéros de téléphone et que les résultats soient affichés dans la colonne B. Pour savoir combien de cellules contiennent des numéros de téléphone, il vous suffit de compter les valeurs VRAIES dans les colonnes B5:B9 :
=COUNTIF(B5:B9, TRUE)
Vous ne voulez pas de colonnes supplémentaires dans votre feuille de calcul ? Pas de problème. En gardant à l'esprit que notre fonction personnalisée peut traiter plusieurs cellules à la fois et que la fonction SUM d'Excel peut additionner les valeurs d'un tableau, voici ce que vous devez faire :
=SUM(--RegExpMatch(A5:A9, $A$2))
Correspondance Regex avec Ultimate Suite
Les utilisateurs de notre Ultimate Suite peuvent tirer parti de quatre puissantes fonctions Regex sans ajouter de code VBA à leurs classeurs, car elles sont intégrées en douceur dans Excel lors de l'installation du module complémentaire. Nos fonctions personnalisées sont traitées par le moteur RegEx standard .NET et prennent en charge les expressions régulières classiques complètes.
Comment utiliser la fonction RegexMatch personnalisée ?
En supposant que vous avez installé la dernière version d'Ultimate Suite (2021.4 ou plus), vous pouvez créer une formule Regex Match en deux étapes simples :
Un moment plus tard, le AblebitsRegexMatch est insérée dans une nouvelle colonne à droite de vos données.
Dans la capture d'écran ci-dessous, la fonction vérifie si les chaînes de la colonne A contiennent ou non des nombres à 7 chiffres.
Conseils :
Pour plus d'informations, veuillez consulter la fonction AblebitsRegexMatch.
Voilà comment faire des correspondances d'expressions régulières dans Excel. Je vous remercie de votre lecture et j'ai hâte de vous retrouver sur notre blog la semaine prochaine !
Téléchargements disponibles
Exemples de correspondance Regex Excel (fichier .xlsm)
Ultimate Suite 14 jours version entièrement fonctionnelle (fichier .exe)