IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Voir le flux RSS

Pierre Fauconnier

Expressions régulières avec Excel

Noter ce billet
par , 18/10/2021 à 16h36 (470 Affichages)
Les expressions rationnelles sont délaissées par Excel, hélas. Voici une fonction perso qui pallie ce manque.


Salut.


- Pierre, je voudrais tester que ma saisie est correcte.
- Mmmh? Mais encore?
- J'ai des codes d'articles: Deux lettres, 4 chiffres, un tiret et deux chiffres. T'as une idée? Je ne m'en sors pas avec les formules, les SI, les STXT, etc...
- Ok, Attends...


- Tiens, voilà une fonction qui utilise les expressions régulières. A mon avis, plus simple que ton bazar, là.

Nom : 2021-10-17_203119.png
Affichages : 62
Taille : 11,8 Ko

- Pfff... Tu m'expliques le machin, là, le "^[A-Z]{2}\d{4}-\d{2}$"


A quoi sert une expression rationnelle?

Normalement, si vous tombez sur ce billet, vous savez probablement ce qu'est une expression régulière, et le but ici n'est pas de vous expliquer en détail comment l'on construit le motif. Je définirai donc très rapidement une expression rationnelle comme étant un modèle auquel doit correspondre une chaine de caractères. C'est grâce à des expressions rationnelles que l'on peut vérifier qu'une saisie peut correspondre à:
  • une adresse internet;
  • un nom de domaine Internet;
  • un numéro de Siret;
  • un numéro de tva;
  • un code d'article, comme dans l'introduction ci-dessus.



Il faut bien comprendre ici que l'expression rationnelle, appelée aussi expression régulière, ne vérifie pas la validité de la saisie, mais uniquement le fait qu'elle correspond à un motif précis. Ainsi, vous pouvez saisir toto@toto.com qui sera syntaxiquement une adresse électronique, mais il se peut que toto@toto.com n'existe pas. De même, la saisie BE12 3456 7890 1234 correspond syntaxiquement à un code bancaire belge, mais il n'est pas correct, car il ne valide pas la règle mathématique qui permet de le tester.


La fonction perso en VBA

Personnellement, j'espère que prochainement, Excel proposera une fonction de vérification d'expression rationnelle, mais actuellement, il faut se débrouiller. J'ai donc écrit une fonction perso que l'on peut utiliser en VBA comme en Excel, et qui vérifie qu'une chaine de caractères valide un motif déterminé.

Code vba : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
Function RegExOk(Value As String, Pattern As String, _
  Optional GlobalSearch As Boolean, Optional IgnoreCase As Boolean, _
  Optional MultiLine As Boolean) As Boolean
  Dim re As Object
 
  Set re = CreateObject("VBScript.RegExp")
  With re
    .Pattern = Pattern
    .Global = GlobalSearch
    .IgnoreCase = IgnoreCase
    .MultiLine = MultiLine
    RegExOk = .Test(Value)
  End With
  Set re = Nothing
End Function


Les explications

Si on reprend le cas du numéro d'article cité plus haut: 2 lettres, 4 chiffres, un tiret puis 2 chiffres, on pourrait tenter une formule, mais ça deviendrait vite complexe. L'expression régulière "^[A-Z]{2}\d{4}-\d{2}$" répond à ce problème:
  • ^ signifie que l'on teste le motif au début de la chaine;
  • [A-Z]{2} signifie que l'on attend deux fois une lettre majuscule;
  • \d{4} exprime que l'on attend 4 chiffres. C'est l'équivalent de [0-9]{4};
  • - veut dire qu'un tiret est attendu;
  • \d{2} va tester que l'on a 2 chiffres;
  • $ termine la chaine. Il ne peut donc rien y avoir après.



Si l'on veut tester la saisie d'un compte bancaire belge (BExx xxxx xxxx xxxx), on peut donc l'exprimer ainsi: BE\d{2} \d{4} \d{4} \d{4}...

Nom : 2021-10-18_152557.png
Affichages : 53
Taille : 14,7 Ko

On remarque alors que que le motif " \d{4}" se répète 3fois. De manière plus concise, on pourrait donc l'exprimer ainsi, en disant que l'on commence par BE suivi de 2 chiffres, puis 3 groupes constitués d'un espace et de 4 chiffres:

Nom : 2021-10-18_152708.png
Affichages : 49
Taille : 14,6 Ko


Comme on le voit, on exclut certaines saisies qui pourraient pourtant être valides, et l'on peut donc améliorer le motif comme suit:

Nom : 2021-10-18_152915.png
Affichages : 50
Taille : 14,3 Ko

Exprimer ces différentes saisie en une formule Excel aurait été laborieux, voire impossible car oui, on peut, peut-être, exprimer cela par formule à coups de GAUCHE(..), de SI(STXT(...) = ...; ...), etc, etc, etc, etc, etc,... Mais je doute qu'on y arrive sans formule kilométrique.... Les expressions rationnelles, ou expressions régulières, nous simplifient donc nos formules et nos codes VBA, et gagneraient à être mises en avant, tant en Excel qu'en VBA. Les expressions rationnelles offrent vraiment une alternative, voire L'ALTERNATIVE incontournable, lorsque l'on doit tester qu'une chaine correspond à un motif ou à des motifs précis.


VIVEMENT que les fonctions permettant de les manipuler fassent leur apparition dans les bibliothèques de fonctions natives d'Excel. En attendant, cette fonction perso en VBA pourra vous tirer d'affaire...


NB: L'outil utilisé ici pour évaluer les expressions rationnelles en VBA ne suit pas les standards relatifs à l'expression des motifs. Il faudra donc tenir compte de certaines restrictions lors de l'emploi de la fonction proposée ici.


Le tuto de Caféine pour approfondir le sujet: https://cafeine.developpez.com/access/tutoriel/regexp/
Et vous, vous connaissiez les expressions rationnelles? Vous y avez déjà fait appel pour simplifier vos codes, vos formules?
Vous souhaitez des exemples d'expressions rationnelles pour vérifier des saisies?



.

Envoyer le billet « Expressions régulières avec Excel » dans le blog Viadeo Envoyer le billet « Expressions régulières avec Excel » dans le blog Twitter Envoyer le billet « Expressions régulières avec Excel » dans le blog Google Envoyer le billet « Expressions régulières avec Excel » dans le blog Facebook Envoyer le billet « Expressions régulières avec Excel » dans le blog Digg Envoyer le billet « Expressions régulières avec Excel » dans le blog Delicious Envoyer le billet « Expressions régulières avec Excel » dans le blog MySpace Envoyer le billet « Expressions régulières avec Excel » dans le blog Yahoo

Commentaires