Extraire des adresses email à partir d’un texte donné, Excel VBA
Voici un code VBA détaillé qui extrait les adresses email à partir d’un texte donné dans Excel. Ce code utilise des expressions régulières (RegEx) pour rechercher et extraire les adresses email d’un bloc de texte.
Explication :
En VBA, nous pouvons utiliser les Expressions régulières (RegEx) pour rechercher des motifs dans une chaîne de texte. Une adresse email suit un format standard, comme utilisateur@domaine.com, et les expressions régulières sont parfaites pour identifier ce genre de motif.
Ce code crée une fonction VBA qui :
1. Accepte un bloc de texte en entrée.
2. Recherche les adresses email dans ce texte à l’aide d’une expression régulière.
3. Extrait toutes les adresses email valides trouvées.
4. Retourne une liste de ces adresses email.
Prérequis :
- Vous devez activer la référence Microsoft VBScript Regular Expressions 5.5 dans l’éditeur VBA d’Excel. Pour ce faire :
1. Dans l’éditeur VBA, allez dans Outils → Références.
2. Faites défiler la liste et cochez Microsoft VBScript Regular Expressions 5.5.
3. Cliquez sur OK.
Voici le code complet :
Code VBA : Extraire les adresses email d’un texte
Option Explicit ' Cette fonction extrait toutes les adresses email d'un texte donné. Function ExtraireEmails(texte As String) As String Dim regEx As Object Dim matches As Object Dim match As Variant Dim listeEmails As String Dim patternEmail As String ' Définir le motif pour une adresse email de base patternEmail = "([a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,4})" ' Créer un objet RegExp Set regEx = CreateObject("VBScript.RegExp") ' Définir les propriétés de l'expression régulière regEx.IgnoreCase = True ' Ignorer la casse lors de la recherche (par exemple, 'exemple.com' et 'Exemple.com' sont considérés comme identiques) regEx.Global = True ' Trouver toutes les occurrences dans le texte, pas juste la première regEx.Pattern = patternEmail ' Définir le motif de l'expression régulière ' Exécuter l'expression régulière sur le texte donné Set matches = regEx.Execute(texte) ' Initialiser une chaîne vide pour stocker les résultats listeEmails = "" ' Boucle à travers tous les résultats et les ajouter à la chaîne de résultats For Each match In matches listeEmails = listeEmails & match.Value & vbCrLf Next match ' Retourner la liste des emails sous forme de chaîne If Len(listeEmails) > 0 Then ' Supprimer le dernier retour à la ligne pour la propreté listeEmails = Left(listeEmails, Len(listeEmails) - 2) End If ExtraireEmails = listeEmails ' Retourner la liste des emails ' Nettoyage Set regEx = Nothing Set matches = Nothing End Function ' Tester la fonction Sub TesterExtraireEmails() Dim texteAAnalyser As String Dim emailsExtraire As String ' Exemple de texte contenant des emails texteAAnalyser = "Voici des emails : john.doe@example.com, jane_doe@domaine.co.uk, et test123@xyz.org." ' Appeler la fonction pour extraire les emails emailsExtraire = ExtraireEmails(texteAAnalyser) ' Afficher les emails extraits dans la fenêtre immédiate (Ctrl + G) Debug.Print emailsExtraire End Sub
Explication détaillée du code :
1. Motif de l’Expression Régulière :
Le motif utilisé ici est conçu pour correspondre aux adresses email standards :
2. patternEmail = « ([a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,4}) »
- [a-zA-Z0-9._%+-] : Correspond à tout caractère alphanumérique et à certains caractères spéciaux (point, souligné, pourcentage, plus, et tiret).
- + : Assure que le groupe de caractères précédent apparaisse au moins une fois.
- @ : Correspond au symbole @.
- [a-zA-Z0-9.-] : Correspond au nom de domaine, qui peut inclure des lettres, des chiffres, des points et des tirets.
- \. : Correspond littéralement au point . (dot).
- [a–zA-Z]{2,4} : Correspond au domaine de premier niveau (TLD), comme .com, .org, etc., avec une longueur minimale de 2 caractères et maximale de 4.
3. Création de l’objet RegExp :
Nous créons un objet RegExp et le configurons :
Set regEx = CreateObject("VBScript.RegExp") regEx.IgnoreCase = True ' Ignorer la casse lors de la correspondance regEx.Global = True ' Trouver toutes les correspondances dans le texte, pas juste la première regEx.Pattern = patternEmail ' Définir le motif de l'expression régulière
4. Exécution de l’expression régulière :
La méthode Execute exécute l’expression régulière sur le texte fourni. Elle retourne toutes les correspondances trouvées dans le texte :
Set matches = regEx.Execute(texte)
5. Construction du résultat :
Nous parcourons la collection matches, qui contient toutes les adresses email trouvées, et les ajoutons à la chaîne listeEmails :
For Each match In matches
listeEmails = listeEmails & match.Value & vbCrLf
Next match
Chaque adresse email est séparée par un retour à la ligne (vbCrLf).
6. Retour des emails extraits :
Après avoir parcouru toutes les correspondances, nous retournons la liste des adresses email sous forme de chaîne. Nous supprimons également le dernier retour à la ligne pour que la sortie soit propre :
If Len(listeEmails) > 0 Then listeEmails = Left(listeEmails, Len(listeEmails) - 2) End If
7. Test de la fonction :
Dans la sous-routine TesterExtraireEmails, nous fournissons un texte exemple contenant des adresses email. La fonction ExtraireEmails est appelée, et le résultat est imprimé dans la fenêtre immédiate :
Debug.Print emailsExtraire
Exemple de sortie :
Pour le texte d’exemple suivant :
Voici des emails : john.doe@example.com, jane_doe@domaine.co.uk, et test123@xyz.org.
La sortie dans la fenêtre immédiate (Ctrl + G) sera :
john.doe@example.com
jane_doe@domaine.co.uk
test123@xyz.org
Notes :
- Personnalisation du Motif : Vous pouvez personnaliser l’expression régulière pour correspondre à des formats d’email plus complexes si nécessaire. Par exemple, vous pouvez vouloir permettre des domaines de premier niveau plus longs, comme .photography ou .technology.
- Performances : Cette approche fonctionne bien pour des textes de taille raisonnable. Pour de très grands blocs de texte ou des analyses fréquentes, des optimisations peuvent être envisagées.