Valider la saisie d’une adresse e-mail

Sur un formulaire, j’ai une une zone de texte dans laquelle l’utilisateur doit saisir une adresse e-mail. Comment garantir que celle-ci est correcte ?

Une adresse e-mail doit respecter un certain nombre de règles pour être valide. Dans les grandes lignes : elle doit démarrer par un caractère ou un chiffre ; elle doit contenir un @ ; la partie avant l’arrobas peut contenir un point ; la partie après doit contenir au moins un point (celui avant com, org, net, fr, be…). Pas facile de vérifier tout ça avec les fonctions de base de Visual Basic (vous imaginez déjà les boucles, les conditions, le traitement de chaînes…). Heureusement, les expressions rationnelles (ou expressions régulières) sont là pour nous aider !

La bibliothèque VBScript Regular Expressions

VBA ne gère pas nativement les expressions rationnelles, vous devez donc ajouter à votre projet une bibliothèque qui le fait :

  1. Démarrez VBE (Visual Basic Editor).
  2. Cliquez sur le menu Outils / Références.
  3. Dans la liste des références, cochez Microsoft VBScript Regular Expressions (5.5, à ce jour).

Quelques nouveaux objets programmables s’ajoutent à votre projet. Notamment : RegExp (un objet « Expression rationnelle »), qui permet de tester, d’extraire ou de remplacer des chaînes à l’intérieur d’une chaîne de départ ; MatchCollection, qui représente une série de chaînes (de correspondances) dans une chaîne de départ, et Match qui représente une correspondance unique. L’objectif ici n’est pas de faire le tour de ces objets, nous aurons juste besoin de RegExp et de sa méthode Test, qui vérifie si une chaîne répond à une condition donnée.

Vérifier un e-mail

Maintenant que la bibliothèque est en place, apuka l’utiliser ! Voici la fonction (à recopier dans un module standard) qui va vérifier si un e-mail est correctement écrit :

Qu’est-ce que c’est que ce charabia ?

Si vous découvrez les expressions rationnelles, le Pattern (modèle ou condition à vérifier) doit vous paraitre indigeste ! Voici un peu d’explications sur cet exemple (pour plus de détails sur la syntaxe, Google est votre ami). Si la codification des expressions rationnelles vous donne de l’urticaire et que vous souhaitez tout de suite tester le résultat, passez au paragraphe suivant !

  • Le pattern définit, sous une forme codifiée, la condition de validation de l’e-mail. Il faut lire ce pattern bloc par bloc, pour en comprendre le fonctionnement.
  • Dans cette codification, le signe +, placé après une séquence, indique que la séquence doit figurer 1 fois ou plus dans la chaîne analysée (dans l’e-mail). Par exemple : a+ indique qu’on cherche au moins 1 a, éventuellement plusieurs à se suivre.
  • Le signe * indique que la séquence qui le précède doit figurer 0 fois ou plus dans la chaîne.
  • Les parenthèses délimitent un bloc de recherche : (ab)+ indiquerait qu’on cherche la séquence ab, 1 fois ou plus.
  • Les crochets précisent un critère alternatif. Par exemple, "soci[eé]t[eé]" est un critère pour lequel les chaînes "société", "societe" ou "sociéte" sont valides. Pas "sociétée", par contre : les crochets définissent l’emplacement d’un seul caractère.
  • La suite w désigne un symbole alphanumérique, ce qui équivaut en général aux lettres de a à z, aux lettres de A à Z, aux chiffres de 0 à 9, et au caractère souligné. w pourrait s’écrire aussi [A-Za-z0-9_] mais c’est plus long !

On décrypte le critère ?

  • Le premier bloc de notre pattern est donc : w+. Il dit que l’e-mail doit commencer par un caractère alphanumérique au moins, sachant qu’il peut y en avoir plusieurs.
  • Le second bloc est ([-+.']w+)*. Plus complexe, il décrit les caractères autorisés à partir du 2ème caractère de l’e-mail. Ces caractères peuvent démarrer soit par un tiret, soit par un +, etc.. Ce symbole est suivi d’un caractère alphanumérique ou plus.
    Notez que le +, ici, est entre crochets (il s’agit donc d’un choix entre -, + et les autres), et non pas du fait que le tiret doit figurer 1 fois au moins. En d’autres termes, s’il est entre crochets, le + ne joue pas de rôle particulier. Vous suivez ?
  • Le troisième bloc est le caractère simple @. Il dit que la séquence de départ de l’e-mail doit impérativement suivie d’un @.
  • Vient la suite w+ que vous connaissez déjà, et qui indique que le caractère @ doit être suivi d’au moins 1 caractère alphanumérique (ce qui donne par exemple @a, @K, @7abcd).
  • Autre bloc : ([-.]w+)* : après l’arrobas et le caractère qui le suit, on peut avoir une série démarrant par un tiret ou un point, suivie d’un caractère alphanumérique. La série est donc de la forme -blabla ou .bla, ou encore simplement .z. Le bloc ()* qui entoure la série dit qu’elle peut elle-même être répétée plusieurs fois (donc : -blabla-blabla, ou .bla.bla, ou .z.z.z.z).
  • Le bloc . indique que la suite logique de l’e-mail contient impérativement un point. Le point est un caractère spécial dans les expressions rationnelles (comme le +, le *, les crochets, etc.). Il doit donc être précédé de pour ne pas être traité comme caractère spécial, mais comme simple point…
  • La dernière séquence dit que le point doit être suivi d’une séquence du style com, org, fr… Cette séquence démarre par un caractère alphanumérique au moins (d’où le w+), et est suivie par ([-.]w+)* : un autre tiret ou point facultatifs, suivis de 1 ou plusieurs caractères alphanumériques.

Ouf ! Notez que le pattern correspond à une majorité d’adresses e-mail, mais qu’il devra adapté selon les besoins. Par exemple, si votre adresse est du type moi@localhost, elle est considérée comme invalide (puisqu’il n’y a pas de point dans la seconde partie de l’e-mail).

On teste rapidement

  1. Ouvrez la fenêtre Exécution (CTRL + G).
  2. Tapez-y quelque chose comme ce qui suit, et tapez [Entrée].

La fonction renvoie une valeur booléenne. Si vous obtenez True (Vrai), l’e-mail est valide, sinon…

Application concrète

L’intérêt est maintenant d’utiliser cela dans un formulaire. J’imagine que vous disposez d’un formulaire lié à une table ou une requête, et que ce formulaire a un champ Email (servant à alimenter un champ de table, donc).

  1. Faites apparaître les propriétés du formulaire, onglet Evénement.
  2. Cliquez dans l’événement Avant MAJ, déroulez la liste associée, et choisissez Procédure événementielle.
  3. Cliquez ensuite sur les points de suspension à droite de la propriété, vous accédez au code VBA.
  4. Aménagez le code pour qu’il ressemble à :

Dès qu’une saisie devra être transférée dans la table, l’événement BeforeUpdate se déclenchera. Si l’e-mail est incorrecte, l’événement est annulé (Cancel = True), le transfert vers la table aussi.

Remarques
Dans ce qui précède, on se contente de vérifier que la saisie de l’adresse e-mail est valide. Ca ne veut pas dire que l’adresse existe réellement, ça veut juste dire qu’elle est bien tapée !

Vous aimerez aussi...

13 réponses

  1. zoccolo dit :

    Eureka, j’ai trouvé : j’ai re tapé les guillemets qui me semblaient inclinés et maintenant cela fonctionne.
    Avez-vous déjà eu des retours d’info sur un problème de copier coller?

    • Hervé Inisan dit :

      Non, pas particulièrement. Mais effectivement, il vaut mieux, sur le Web, copier/coller le code brut plutôt que le code formaté qui peut contenir des parasites.
      Sur ce blog, les portions de code ont des icônes « Basculer vers code brut » et « Copy (copier) » qui devraient aider.

  2. zoccolo dit :

    Bonjour, Alors pour moi rien ne fonctionne! Jai bien copié la fonction, activé le RegExp 5.5 maisdans la fenêtre d’exécution la seule valeur retournée est ‘Faux ».
    Pour essayer de comprendre le RegExp, j’ai essayé de travailler avec un pattern plus simple : juste des chiffres (max 8) avec ceci « \d{1,8}@gmail.com » pour agir sur la seule partie avant l’@ mais la fonction me retourne Vrai pour 879@gmail.com, Faux pour toto@gmail.com, jusque là c’est bon, mai vrai pour 879toto@gmail.com.
    Mon objectif est de vérifier le nommage de fichiers du type « 8888 Nom du fichier « avant de les importer dans une table (C’est l’espace entre les chiffres et le nom du fichier qui est important car je récupère ce nombre pour lier une table, et sans espace… ça plante)
    Bref j’ai surtout besoin de comprendre pourquoi « \d{1,8}@gmail.com » autorise les caractères et pourqoui votre fonction EmailValide fonctionne chez les autres et pas chez moi!
    Aurai-je raté quelque chose?
    Merci pour vos sites, Monsieur Inisan, Ils m’ont déjà permis d’arriver jusqu’au RegExp…

  3. Focus3D dit :

    Salut,

    Que pensez-vous de:
    re.Pattern = « ^([0-9a-zA-Z]([-.\w]*[0-9a-zA-Z])*@([0-9a-zA-Z][-\w]*[0-9a-zA-Z]\.)+[a-zA-Z]{2,9})$ »

    • Hervé Inisan dit :

      Je n’ai pas eu le temps de tester, mais de loin, ça a l’air correct. 🙂
      En fait, il y a pas mal de variantes possibles, selon qu’on souhaiter coller au plus près de la RFC2822, ou qu’on est plus restrictif.

  4. Hervé Inisan dit :

    Christophe > A froid comme ça, il faudrait voir si on peut adapter l’expression (le pattern) pour éviter 2 « @ ». Ou, en test supplémentaire (hors de la fonction EmailValide), compter le nombre de « @ » dans la chaîne.

    Mais il faut peut-être aussi voir du côté du stockage, pour éviter le souci : un champ qui contient plusieurs valeurs n’est pas atomique (ce qui n’est pas conseillé dans une base de données). Si c’est un comportement fréquent, il faudrait une table pour gérer les emails.

  5. Christophe dit :

    Bonjour,

    J’ai un champ emails qui peut contenir plusieurs destinataires séparés par un ;
    Une fonction me permet de séparer ces emails et donc avec la fonction ci-dessus de vérifier la conformité.

    Cependant j’ai eu des cas ou deux emails n’étaient pas séparés par un ; du type : email1@domaine1email2@domaine2
    La fonction ci dessus indique que c’est un email valide. Je ne sais comment faire pour corriger.

    Merci par avance.

  6. Hervé Inisan dit :

    Laurent W. > A vue de nez, là où est placé le S, il gère les espaces pour la partie avant le @ seulement. Il en faudrait sans doute dans les autres parties du pattern.

  7. Laurent W. dit :

    Excuse-moi, j’ai posé la question trop vite, en fait, j’ai trouvé la réponse.

    j’ai rajouté S qui interdit tout espace.

    re.Pattern = « w+([-+.’]w+)S*@w+([-.]w+)*.w+([-.]w+)* »

    Si tu peux valider ou non, mais merci, ça va bien aider pour éviter les erreurs…

  8. Laurent W. dit :

    Bonjour,

    Le code que vous proposez fonctionne très bien.

    Comme j’ai fais des tests sur une base de données existantes, il y a eu énormément d’erreur dans l’écriture des adresses mail, c’est pourquoi, je vais mettre en place votre code de programmation.

    Mais j’ai vu des erreurs que votre programme ne gère pas, ce sont les espaces. J’ai trouvé dans la liste une multitude de courriel qui avait un espace, soit en plein milieu du nom, soit après le @, soit avant ou après le . pour l’extension…

    Comment intégrer ce souci dans votre code ? Merci beaucoup !

  9. Hervé Inisan dit :

    Raff > Est-ce que tu peux poster le bout de code qui pose problème ?

  10. Raff dit :

    Bonjour, merci pour toutes ces astuces qui me permettent d’avancer sur mon projet, néanmoins celui-ci me pose problème:

    Tout est activé, la fonction en test fonctionne mais lorsque je l’applique à mon form_BeforeUpdate celui ci me souligne la ligne de condition if not… comme non reconnue !

    Si quelqu’un peut m’aider, merci

  11. arsene59 dit :

    Salut, j’ai lu et testé ton code ça fonctionne à merveilles. je l’ai utilisé dans mon application et j’ai des bons résultats. je te tire un coup de chapeau

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *