Vérifier (et donc également en Excel) si une adresse e-mail est valide en VBA n'est pas une chose bien compliquée. Les règles générales de validité d'une adresse email ne sont pas très difficiles. Et VBA peut facilement automatiser tout cela.
Remarque: pour une utilisation plus pratique, le code qui suit ne s'applique pas aux adresses e-mail contenant des commentaires et d'autres "spécialités" qui ne sont pas utilisées par 99,9% des utilisateurs.
Règles de validité pour une adresse e-mail correcte
Voici donc les règles de base qui sont utilisées dans la fonction VBA proposée:
- le nom d'utilisateur peut contenir les caractères: "a -> z", "A -> Z", "0 -> 9", de "-", "_", "." et les caractères spéciaux "!#$%&'*+-/=?^_`{|}~"
- le nom de domaine peut contenir les caractères: "a -> z", "A -> Z", "0 -> 9", "-" et "."
- utilisation obligatoire d'un "@"
- minimum 1 caractère avant "@"
- le nom de domaine et le suffixe après le "@"
- le nom de domaine ne peut pas commencer ni se terminer par "-"
- le suffixe doit contenir au moins deux caractères
- plusieurs points (".") ne peuvent pas se suivre (ex: "..")
La page Wikipédia avec le détail de toutes les règles de validité d'une adresse e-mail (en anglais).
Normalement, ces règles peuvent être vérifiés en un coup d’œil dans le cas des adresses "classiques" (qui ne contiennent pas les caractères spéciaux). Le problème arrive au cas où vous avez un fichier Excel avec une liste de plusieurs centaines, voire milliers, de clients, de fournisseurs,… À ce moment-là, un coup d’œil ne suffit plus.
Et comme aujourd'hui, les adresses e-mail des clients ou des contacts constituent un bien précieux, notamment dans les entreprises, il vaut mieux d'en prendre soin. Une base de donnée des clients collectée via un formulaire web ne sert pas à grande chose si elle est remplie des adresses e-mail incorrectes.
C'est pourquoi je vous propose une fonction qui fera l'affaire. Cette fonction VBA vérifie la validité d'une adresse e-mail selon les critères cités plus haut. Elle retourne comme résultat le Boolean
("VRAI" ou "FAUX") selon que l'adresse e-mail soit valide ou pas.
Code VBA de la fonction qui vérifie si une adresse e-mail est valide
Cette fonction peut être utilisée dans vos macros VBA ou comme une UDF (User Defined Function) – c'est à dire directement dans les Feuilles Excel tout comme n'importe quelle autre fonction Excel (voir la capture d'écran).
Voici donc le code VBA de la fonction… Il vous suffit de le copier/coller dans un Module de votre Projet.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 |
Public Function AdresseEmailValide(ByVal EmailAVerifier As String) As Boolean 'par Excel-Malin.com ( https://excel-malin.com ) 'définition des variables et des constantes Const CaracteresAdmisUtilisateur = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890.!#$%&'*+-/=?^_`{|}~" Const CaracteresAdmisDomaine = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890.-" Dim NomUtilisateur As String Dim EmplacementArobase As Integer Dim Domaine As String Dim Suffixe As String Dim i As Integer 'vérification de l'adresse EmplacementArobase = InStr(1, EmailAVerifier, "@") If EmplacementArobase = 0 Then GoTo AdresseIncorrecte If InStr(EmplacementArobase + 1, EmailAVerifier, "@") > 0 Then GoTo AdresseIncorrecte NomUtilisateur = Left(EmailAVerifier, EmplacementArobase - 1) Domaine = Right(EmailAVerifier, Len(EmailAVerifier) - EmplacementArobase) Suffixe = Right(EmailAVerifier, Len(EmailAVerifier) - InStrRev(EmailAVerifier, ".")) If Len(NomUtilisateur) = 0 Then GoTo AdresseIncorrecte If Left(NomUtilisateur, 1) = "." Or Right(NomUtilisateur, 1) = "." Then GoTo AdresseIncorrecte If InStr(1, Domaine, ".") = 0 Then GoTo AdresseIncorrecte If Left(Domaine, 1) = "." Or Right(Domaine, 1) = "." Then GoTo AdresseIncorrecte If Left(Domaine, 1) = "-" Or Right(Domaine, 1) = "-" Then GoTo AdresseIncorrecte If Len(Suffixe) < 2 Then GoTo AdresseIncorrecte For i = 1 To Len(NomUtilisateur) If InStr(1, CaracteresAdmisUtilisateur, Mid(NomUtilisateur, i, 1)) = 0 Then GoTo AdresseIncorrecte Next For i = 1 To Len(Domaine) If InStr(1, CaracteresAdmisDomaine, Mid(Domaine, i, 1)) = 0 Then GoTo AdresseIncorrecte Next For i = 1 To Len(EmailAVerifier) If Mid(EmailAVerifier, i, 1) = "." And Mid(EmailAVerifier, i + 1, 1) = "." Then GoTo AdresseIncorrecte Next i AdresseEmailValide = True Exit Function AdresseIncorrecte: AdresseEmailValide = False End Function |
L'exemple de l'utilisation de la fonction AdresseEmailValide
dans une procédure (Sub)
Cet exemple vérifie l'a validité de l'adresse "info@monwebsite.fr" et renvoie un message avec le résultat. N'oubliez pas que pour que le code qui suit fonctionne, vous aurez besoin de copier dans votre projet également le code précédent (le code de la fonction même).
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
Sub ExempleVerificationEmail() 'par Excel-Malin.com ( https://excel-malin.com ) Application.ScreenUpdating = False On Error GoTo ExempleErreur Dim AdresseEmail As String Dim Verification As Boolean AdresseEmail = "info@monwebsite.fr" Verification = AdresseEmailValide(AdresseEmail) If Verification = True Then MsgBox "Ceci est une adresse e-mail valide..." Else MsgBox "Cette adresse e-mail n'est pas valide..." End If Application.ScreenUpdating = True Exit Sub ExempleErreur: MsgBox "Une erreur s'est produite..." Application.ScreenUpdating = True End Sub |
À vous de jouer maintenant…
Bonus – fonction VBA vérifiant les listes d'adresses email dans Excel
Si vous avez une cellule ou une chaîne de caractères qui contiennent plusieurs adresses email séparées par un délimiteur (exemple ;
ou ,
) vous pouvez vérifier la validité de toutes ces adresses en même temps avec le code VBA suivant.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
Public Function TousLesEmailsCorrects(AdressesEmail As String, DelimiteurUtilise As String) As Boolean 'par: https://excel-malin.com TousLesEmailsCorrects = True Dim y Dim i As Single y = Split(AdressesEmail, DelimiteurUtilise) For i = 0 To UBound(y) If AdresseEmailValide(y(i)) = False Then TousLesEmailsCorrects = False Exit Function End If Next i End Function |
Si toutes les adresses sont valides, la fonction renvoie la valeur VRAI
(TRUE
). Si au moins une des adresses est incorrecte, le résultat sera FAUX
(FALSE
). Elle utilise deux arguments – le texte contenant la liste des adresses email et le délimiteur.
Vous pouvez utiliser cette formule aussi directement dans vos feuilles Excel. Par exemple si la liste des adresses email se trouve dans la cellule "A2" et elles sont séparées par un point-virgule, la formule sera la suivante:
=TousLesEmailsCorrects(A2,";")
N'oubliez pas, vous devez avoir dans votre projet VBA les deux codes: 1) la fonction de base (AdresseEmailValide
) et 2) la fonction à utiliser avec la liste (TousLesEmailsCorrects
).
Pour aller plus loin en Excel et en VBA
Et voici quelques liens vers d'autres articles d'Excel-Malin.com qui pourraient vous être utiles…
- Liste de toutes les fonctions Excel (plus de 480 fonctions!)
- Liste de toutes les fonctions disponibles en VBA
- Télécharger un fichier à partir d'internet
- Nettoyer les données sans VBA
- Vérifier la validité d'un compte bancaire IBAN en Excel (avec VBA)
- Envoyer un email avec VBA
- Tout sur l'Excel Online gratuit
- Grand tutoriel sur le Tableau croisé dynamique Excel (TCD)
- Comment débloquer VBA dans les les fichiers en provenance d'Internet
37 commentaires sur “VBA: Vérifier la validité d’une adresse e-mail”
Bonjour,
merci beaucoup pour cet exemple. Pouvez-vous m'expliquer aps à pas comment l'intégrer dans un ficheir Excel?
Merci beaucoup
Bonjour,
je suis arrivé à intégrer la fonction.
Un problème: elle ne teste pas la longueur du l'extension domaine, qui devrait être au moins de 2 caractères. "Info@monsiteweb.f" est valide pour la fonction.
Merci beaucoup
Bonjour,
content d'entendre que vous avez réussi à intégrer la fonction.
Merci pour votre remarque pertinente sur la longueur du suffixe.
J'ai ajouté cette vérification ainsi que trois autres:
– plusieurs points "." ne peuvent pas se suivre
– après l'@, il ne peut y avoir qu'un seul point
– le nom de domaine ne peut pas commencer ni se terminer par un "-"
& le suffixe doit contenir au moins deux caractères
La fonction est donc à présent plus fiable qu'auparavant.
Merci et bien à vous,
Martin
Merci infiniment pour l'ajout.
Je n'ai aps copié en revanche la partie Sub. Pouvez-vous m'expliquer comment ça amrche?
Et si possible, dans la colonne A, j'aurai les adresses email (A2, A3 etc.) Dans la colonne B j'ai placé la fonction =AdresseEmailValide(A2)
Je souhaiuterais appliquer une mise en forme conditionnelle à la colonne A en fonction du résultat affiché par B. Du genre si B"VRAI" ou "TRUE", mettre en forme la cellule en rouge. J'ai essayé la mise en forme conditionnelle avec la syntaxe =B2″VRAI" mais rien ne se passe.
Merci beaucoup
Encore une fois pardon.
J'ai essayé la nouvelle fonction, mais elle me renvoie "faux" pour les emails valides et #VALEUR! pour les cellules vides ou qui ne contiennent pas d'arobase, alors qu'on pourrait avoir des enregistrements sans adresse email. Voir exemple plus abs, où une adresse correcte est signalée fausse parmi les autres erreurs.
(Je n'ai pas copié la partie SUB, je ne sais pas comment cela fonctionne ni où la placer dans le module. Une assistance là serait super, voir mon précédent message)
Quelques exemples:
aladia87.@hotmailfr FAUX
andromede3yahoo.fr #VALEUR!
eva_joly590@msn.com FAUX
xinaaman@hotmail.f FAUX
Merci beaucoup
Re-bonjour,
1) pour la fonction: j'ai été un peu trop rapide et je n'ai pas testé assez. Maintenant c'est corrigé et cela devrait être OK. J'ai testé bien mieux 😉
2) pour le Sub: en fait, c'est une procédure qui exécute du code. Contrairement à une fonction VBA, on ne peut y accéder différemment (via Alt + F8) à partir d'Excel sans modifier le contenu des Feuilles (tandis qu'une fonction peut être utilisée dans les cellules dans un Classeur tout comme les fonctions de base d'Excel). C'est subtil, je sais 😉
L'avantage d'un Sub (dans le cas comme celui qui se trouve sur cette page) est que vous ne devez rien changer dans vos fichiers Excel – il suffit de tout simplement copier le code (le
Sub
et laFunction
) dans un module et leSub
va fonctionner. Le rôle principal d'une fonction est de prendre une information (un "argument"), la traiter et retourner un résultat. Une "procédure" (donc leSub
) est un peu la "sauce qui se trouve autour" – et sert le plus souvent, comme son nom l'indique, gérer toute la procédure – exemple: une procédure peut ouvrir un fichier, effectuer des calculs, vous informer si tout s'est bien passé, sauvegarder et fermer le fichier.Je prépare justement un tutoriel à ce sujet…
3) le format conditionnel:
Comme une image vaut 1000 mots, je vous ai fait quelques captures d'écran et les ai mises dans ce fichier PDF…
J'espère que cela vous aide.
Cordialement, Martin
Merci INFINIMENT !
C'était avec plaisir…
Bonjour,
C'est curieux, j'ai toujours un problème avec la fonction.
J'obtiens systématiquement le résultat suivant:
aladia87.@hotmailfr #NOM?
…
J'appelle la fonction dans ma cellule B2 avec la formule suivante: "=AdresseEmailValide(A2)" et ainsi de suite, mais j'obtiens le message #NOM?
J'ai pourtant recopié l'intégralité de la formule.
Cordialement,
Chawki
C'est en effet curieux. Je viens de réessayer sur deux ordinateurs et cela fonctionne…
Le "#NOM?" signifie que Excel ne trouve pas la fonction en question. Vérifiez deux choses:
– les macros sont bien autorisées dans la classeur
– le code de la fonction se trouve dans un Module
J'ai fait un fichier qui fonctionne chez moi et qui ne contient que la formule sur la vérification des emails. Vous pouvez le télécharger et voir s'il fonctionne chez vous: test_email.xlsm
Bien à vous, Martin
Merci beaucoup c'est top! Ca m'a bien servi!
> la partie après “@” ne peut contenir qu’un seul point (“.”)
Cela va exclure foo@domain.co.uk ou bar@bidule.gouv.fr, non ? (alors que ces tld sont valides).
D'autres caractères spéciaux sont également autorisés, voir ici : https://fr.wikipedia.org/wiki/Adresse_%C3%A9lectronique#Syntaxe_exacte
Certaines formes sont exotiques, en revanche le '+' ou '%' ne sont pas si rares.
Merci pour ces deux remarques. Vous avez raison. J'ai déjà modifié le code de la fonction qui, désormais, en tient compte & j'ai corrigé le texte de la page.
Bien à vous, Martin
Bonjour,
Les noms de domaine avec plusieurs points sont exclus et considérés comme FAUX. Exemple: perso.alliadis.net
Est-ce que vous pourriez svp rajouter le code pour rendre ces noms de domaine avec 2 points valides VRAI ?
Merci beaucoup pour votre aide
Bonjour Bastien,
c'est étrange, dans mon code, les "sous-domaines" ne sont pourtant pas exclues.
Et si je teste l'adresse dans votre exemple, la fonction renvoie comme résultat
VRAI
:Bien à vous, Martin
excellent code, merci
Merci pour votre retour.
Un grand merci
fonctionne parfaitement dans mon programme en VBA
du super boulot
Merci! Je suis content de lire que cela ait été utile…
Bonjour,
Peut on modifier la formule pour contrôler une liste d'adresse mail lors de l'envoi ?
Bonjour Eric,
cette fonction retourne un booléen (VRAI ou FAUX) donc il vous suffit de faire une boucle qui va parcourir votre liste et effectuer l'action souhaité selon le résultat.
Exemple; si VRAI –> envoi de l'email, si FAUX, la valeur est effacée de la liste.
Donc en fait, il ne faut pas modifier la formule, il suffit de créer le code qui fera ce qu'il vous faut en utilisant la fonction telle quelle…
Cordialement, MArtin
Merci beaucoup pour les infos, je vais m'y mettre pour intégrer ça dans mon développement.
Bonjour,
Merci beaucoup pour ces codes, ils sont grandement utile.
cependant, je dois avoir un soucis pour l'intégration de celle-ci dans ma macro…
j'ai copier le code de la fonction dans un module comme marqué en commentaire et la fonction sub dans mon code VBA pour vérifier le contenu saisie dans une TEXTBOX, mais la ca ne fonctionne pas.
Quelqu'un pourrait me dire ce que j'ai mal copier?
Je suis pas douée en VBA, merci beaucoup de votre aide.
Bonjour,
Dans le cas où la cellule contient plus d'une adresse email, elle est tagguée comme incorrecte ce qui n'est pas forcément le cas.
Dans ce cas là, les adresses doivent être séparées par des ;
Savez-vous comment contrôler la validité dans ce cas-là ?
Encore merci pour votre super site.
Cordialement,
Lor
Bonjour Lor,
cette fonction a été écrite pour vérifier la validité d'UNE adresse email. Donc c'est normal que dans votre cas, elle retourne
FAUX
.Mais c'est une question intéressante. Je vous ai donc préparé la fonction qu'il faut ajouter en plus. Et comme cela pourrait intéresser d'autres internautes, je l'ai ajouté directement dans le tutoriel.
Vous la trouverez à la fin, dans la section "BONUS – …"
J'espère que cela vous sera utile. Cordialement, Martin
Bonjour,
Merci beaucoup pour le bonus.
Il fonctionne parfaitement et quand je vois sa structure, je ne pense pas que j'aurais pu trouver toute seule.
Votre site est génial et m'a sortie plusieurs fois d'un mauvais pas. Je garde la référence à votre site dans mes macros, par honnêteté intellectuelle !
Et un petit tour par Paypal aussi 🙂
Je vous souhaite une belle journée,
Lor
Merci pour votre message Lor, cela fait vraiment plaisir – votre retour et le tour par PayPal aussi 😉
Je continue à enrichir le site donc j'espère qu'il continuera à vous apporter des infos utiles.
Bien à vous, Martin
Merci pour les fonctions de contrôle d'IBAN et d'e-mail.
Vraiment très utile.
Et en plus, très bien écrit. BRAVO !!!
J'ai qq fonctions intéressantes en échange.
Bonjour Pierre,
merci pour ce feedback.
Si vous avez des fonctions intéressantes que vous voulez partager, n'hésitez pas à les envoyer par email et je les publierai…
Cordialement, Martin
Bonjour,
Merci pour ce développement.
Bien à vous,
Bonjour,
Je suis à la recherche d'une macro qui vérifierait que les emails partant sont bien conformes à 1 ou 2 domaines spécifiques comme ****@ABC.fr ou ****@ DEF.com. Est it possible d'adapter votre macro pour faire cette vérification directement dans l'email? Mais je suis loin d'être un pro en VBA et encore moins pour Outlook. Si vous pouviez me donner quelques indications comment commencer la macro, pour les tests et messages, je pense me débrouiller. Mille Mercis d'avance.
JPh
Bonjour,
oui, c'est possible.
Après la ligne 35 (= avant
AdresseEmailValide = True
) ajoutez la ligne suivante:If Domaine <> "ABC.fr" And Domaine <> "DEF.com" Then GoTo AdresseIncorrecte
Si vous voulez ajouter d'autres domaines, c'est possible avec l'opérateur
And
:comme
If Domaine <> "ABC.fr" And Domaine <> "DEF.com" And Domaine <> "GHI.eu" Then GoTo AdresseIncorrecte
Voilà, j'espère que cela répond à votre question.
Cordialement, Martin
Il manque le contrôle sur la présence de texte avant le @, exemple @free.fr retourne "Vrai".
Bonjour Claude.
Merci pour la remarque! Je viens de corriger le code – il couvre désormais cette possibilité.
Cordialement, Martin
Bonjour et merci, ça fonctionne très bien si on n'a pas mis le Option Explicit en début de module, dans ce cas il manque 2 Dim :
Suffixe et i
Bonjour,
merci pour cette remarque pertinente…
Je viens de corriger dans le code cette omission!