formateur informatique

Extraire les mails des chaînes de textes en VBA Access

Accueil  >  Bureautique  >  Access  >  Access VBA  >  Extraire les mails des chaînes de textes en VBA Access
Livres à télécharger


Pour partager cette vidéo sur les réseaux sociaux ou sur un site, voici son url :


Inscription Newsletter    Abonner à Youtube    Vidéos astuces Instagram
Sujets que vous pourriez aussi aimer :


Isoler les mails des textes

Pour automatiser des traitements, il est intéressant de savoir extraire les adresses électroniques noyées dans des chaînes de textes, afin de les isoler dans un champ précis pour chaque enregistrement parcouru. De cette façon, un programme peut ensuite facilement robotiser l'envoi de courriers à destination de ces potentiels clients démasqués. C'est la solution que propose d'aboutir cette nouvelle astuce VBA Access.

Base de données Access à télécharger
Nous allons le voir, ce sont les expressions régulières qui vont nous permettre de résoudre le cas. Pour cela, nous suggérons d'appuyer l'étude sur une base de données offrant quelques enregistrements abritant des textes dans lesquels se trouvent noyées pêle-mêle, des adresses électroniques à débusquer. En consultant le volet de navigation sur la gauche de l'écran, vous remarquez que cette base est constituée d'une table nommée Infos et d'un formulaire, intitulé fExtraire.
  • Double cliquer sur la table Info pour l'afficher en mode feuille de données,
Table Access contenant des adresses mail mélangées à des textes

Elle est faite de trois champs. Le premier est celui de la clé primaire. Il est auto-incrémenté. Le deuxième accueille des annotations sur des clients potentiels dans lesquelles fourmillent des adresses mails. Nous l'avons dit, il s'agit de les débusquer pour les regrouper et les isoler dans le troisième et dernier champ (info_mail), fort logiquement vide à ce stade.
  • Double cliquer maintenant sur le formulaire fExtraire pour l'exécuter,
Formulaire VBA Access pour extraire les adresses mails des champs de textes

Ce formulaire est fait de deux zones de texte et de trois boutons. La première zone de texte embarque une annotation abritant des mails à débusquer. A titre d'essai dans un premier temps et pour bien comprendre le mécanisme, au clic sur le premier bouton (Essayer), toutes les adresses qu'elle renferme doivent être isolées et assemblées dans la seconde zone de texte, vide pour l'instant. Pour cela, nous créerons une fonction à appeler.

Sur ce principe, au clic sur le deuxième bouton (Traiter), nous exploiterons cette fonction pour analyser tous les enregistrements de la table et déloger les adresses mails que chacun recèle, afin de les isoler et de les assembler dans le dernier champ. Le dernier bouton permet simplement de fermer le formulaire en cours, par le biais d'une macro.

La fonction
Pour débuter, il est fort logique de créer la fonction dans un module indépendant.
  • A droite du ruban Accueil, cliquer sur la flèche du bouton Affichage,
  • Dans les propositions, choisir le mode Création,
Nous basculons ainsi sur la vue en conception du formulaire.
  • Réaliser le raccourci clavier ALT + F11 pour afficher l'éditeur VBA Access,
  • En haut de l'éditeur, cliquer sur le menu Insertion,
  • Dans les propositions, choisir la commande Module,
  • Dans la feuille de code du nouveau module, créer la fonction suivante :
Function trouver_adresses(texte As String) As String

End Function


Nous la typons comme un texte (As String) puisqu'elle doit retourner une chaîne de potentiels mails trouvés et assemblés. Nous la signons de même avec un paramètre textuel en attente (texte As String) pour recevoir la chaîne à analyser.

Les variables
Ensuite, nous avons besoin d'objets pour instancier la classe des expressions régulières, afin de récolter tous les résultats trouvés et de les parcourir tous dans une boucle. Mais, nous avons aussi besoin d'une variable classique pour représenter chaque adresse mail extirpée.
  • Dans les bornes de la fonction, ajouter les déclarations et l'affectation suivantes :
...
Dim regExp As Object
Dim resultats As Object: Dim trouve As Object
Dim mail As String

Set regExp = CreateObject("vbscript.regexp")
...


Nous déclarons trois objets au sens large (As Object). Le premier (regExp) doit instancier la classe des expressions régulières. Et c'est d'ailleurs ce que nous faisons dans l'enchaînement des déclarations grâce à la fonction VBA CreateObject. Le suivant (resultats) doit générer une collection des résultats trouvés, soit des adresses électroniques débusquées. Le dernier (trouve) est là, à l'aide d'une boucle que nous engagerons, pour parcourir chaque résultat extrait et consolider chaque mail extirpé, les uns à la suite des autres. Enfin, la variable mail, typée comme un texte, doit recevoir tour à tour les adresses débusquées pour les consolider dans la zone de texte prévue à cet effet sur le formulaire.

Optimiser le code VBA
L'objet regExp a désormais hérité de propriétés et méthodes que nous proposons d'exploiter dans un bloc With pour simplifier et optimiser le code VBA. Il est question de définir le motif représentant la forme remarquable d'une adresse mail à déterrer au milieu de nul part, pour lancer la recherche et stocker les résultats dans la collection prévue à cet effet. Elle est nommée résultats.
  • A la suite du code VBA, créer le bloc With suivant :
...
With regExp

End With
...


Chercher la forme remarquable
Nous devons maintenant construire la forme remarquable d'une adresse mail nécessairement composée du symbole de l'arobase (@), d'un point (.) et de deux ou trois lettres pour le domaine (.fr, Com etc...). Puis, nous devons engager une recherche de cette forme remarquable dans la chaîne passée en paramètre pour isoler toutes les potentielles adresses électroniques répondant favorablement à cette structure.
  • Dans le bloc With, ajouter les instructions VBA suivantes :
...
.Pattern = "([a-z0-9._-]+@[a-z0-9._-]+\.[a-z]{2,3})"
.Global = True
.IgnoreCase = True
.MultiLine = True
Set resultats = .Execute(texte)
...


Nous définissons le motif de la forme remarquable : lettres, chiffres, points, \ et tiret plusieurs fois possibles (+) ( "([a-zA-Z0-9._-]+@ . Nous intercalons le symbole de l'arobase (@). De nouveau, nous autorisons des lettres, chiffres, points, \ et tirets plusieurs fois possibles (+). Nous ajoutons un point (.) avant l'extension que bous échappons (\.), car il s'agit d'un caractère spécial des expressions régulières. Enfin des lettres de l'alphabet exclusivement [a-z] sur 2 ou 3 caractères (fr, com, be etc...) sont imposées pour définir le suffixe de l'adresse.

Ensuite, nous définissons la propriété héritée Global à True pour chercher toutes les occurrences dans la chaîne et pas seulement la première. Nous réglons la propriété IgnoreCase à True pour ne pas considérer les différences de casse dans la recherche. Nous ajustons la propriété Multiline à True pour que la correspondance du motif se fasse à travers les sauts de ligne. Enfin, nous initialisons l'objet resultats avec la méthode héritée Execute par l'objet regExp pour répertorier la collection des adresses mail décelées dans la chaîne passée en paramètre de la fonction.

Parcourir les résultats
C'est maintenant que nous devons engager notre variable trouve dans une boucle For Each pour parcourir la collection des adresses mails isolées par l'exécution de notre expression régulière sur la chaîne passée en paramètre de la fonction.
  • Après le bloc With, créer la boucle For Each suivante :
...
For Each trouve In resultats
mail = trouve.Value & "," & mail
Next trouve
If Right(mail, 1) = "," Then mail = Left(mail, Len(mail) - 1)
...


A chaque passage, nous assemblons les mails trouvés en les séparant d'une virgule (trouve.Value & "," & mail). Une fois la consolidation de tous les mails débusqués terminée, donc après la boucle For Each, nous éliminons la dernière virgule résiduelle, celle qui est placée à la toute fin (Right(mail, 1) = ",") et qui attendait un nouveau mail à assembler mais qui n'est jamais venu.

Retourner les adresses
A l'issue du traitement, la fonction doit répondre par son propre nom pour retourner tous les mails trouvés et assemblés, stockés dans la variable mail. Pour cela et comme vous le savez, nous devons affecter le nom même de la fonction sur cette variable résultante.
  • A la toute fin de la fonction, créer l'affectation suivante :
...
Next trouve
If Right(mail, 1) = "," Then mail = Left(mail, Len(mail) - 1)

trouver_adresses = mail

End Function
...


Tester la fonction
Le code de la fonction est terminé. Avant de l'exploiter pour extraire tous les mails de la table pour les isoler dans le dernier champ prévu à cet effet, nous souhaitons l'essayer sur la chaîne qui est prédéfinie dans la première zone de texte du formulaire. Un clic sur le bouton Essayer doit l'appeler en lui passant le contenu de cette zone à analyser.
  • Enregistrer les modifications (CTRL + S) et revenir sur le formulaire (ALT + Tab),
  • Cliquer sur le bouton Essayer pour le sélectionner,
  • Activer l'onglet Evénement de sa feuille de propriétés,
  • Cliquer sur le petit bouton associé à son événement Au clic,
  • Dans la boîte de dialogue, choisir le Générateur de code et valider par le bouton Ok,
De fait, nous sommes de retour dans l'éditeur VBA Access, mais cette fois entre les bornes de la procédure événementielle essai_Click. De plus, elle est écrite dans la feuille de code associée au formulaire et non dans un module indépendant, comme c'est le cas pour notre fonction, nommée trouver_adresses.
  • Dans les bornes de la procédure, réaliser l'appel suivant :
adresse.Value = trouver_adresses(chaine.Value)

La première zone de texte se nomme chaine. La seconde se nomme adresse. En passant le contenu de la première à la foncion trouver_adresses que nous venons de de construire, nous réceptionnons son résultat dans la seconde.
  • Enregistrer les modifications (CTRL + S) et basculer sur le formulaire (ALT + Tab),
  • Exécuter ce dernier, par exemple en enfonçant la touche F5 du clavier,
  • Puis, cliquer sur le bouton Essayer,
Extraire les adresses mail d-une zone de texte en VBA Access

Comme vous pouvez l'apprécier, tous les mails contenus dans cette première zone sont aussitôt isolés et regroupés dans la seconde. Et si vous modifiez le contenu, au clic sur le bouton Essayer, la fonction extraira sans souci, toutes les nouvelles potentielles adresses électroniques ajoutées.

Traiter les enregistrements
Forts de ces acquis, c'est maintenant que nous devons passer aux choses sérieuses. L'idée est la suivante : Au clic sur le bouton intitulé Traiter, nous devons déclencher l'exécution d'un code VBA analysant tous les enregistrements de la table Infos. Nous l'avons dit, pour chaque ligne, les adresses électroniques doivent être dénichées et regroupées dans le champ nommé info_mail. Cela signifie que la fonction trouver_adresses doit être appelée récursivement, tant que le dernier enregistrement n'est pas atteint.
  • A gauche du ruban Accueil, cliquer sur la flèche du bouton Affichage,
  • Dans les propositions, choisir le mode Création,
  • Sur le formulaire en conception, cliquer sur le bouton Traiter,
  • Activer alors l'onglet Evénement de sa feuille de propriétés,
  • Cliquer sur le petit bouton associé à son événement Au clic,
  • Dans la boîte de dialogue, choisir le Générateur de code et valider par Ok,
C'est ainsi que nous sommes de retour dans l'éditeur VBA Access mais cette fois, entre les bornes de la procédure événementielle traiter_Click.

Les variables
Nous devons piloter les enregistrements dans la base de données en cours. Donc, nous avons besoin d'objets mais aussi de variables plus classiques.
  • Dans les bornes de la procédure, ajouter les déclarations suivantes :
...
Dim base As Database: Dim enr As Recordset
Dim lesMails As String: Dim requete As String: Dim lId As Integer
...


Nous typons l'objet base comme un objet de base de données (Database). Son rôle sera de représenter la base active. Nous typons l'objet enr de manière à ce qu'il représente un jeu d'enregistrements (Recordset). Dans la variable lesMails, pour chaque enregistrement, nous regrouperons les adresses trouvées. C'est pourquoi, nous la typons comme un texte (As String). Nous stockerons la syntaxe de la requête de mise à jour dans la variable requete. En effet, il est question d'isoler les mails trouvés pour chaque enregistrement, dans le dernier champ (info_mail). Pour que cette update se fasse sur le bon numéro d'enregistrement, nous aurons besoin de le stocker préalablement dans la variable lId. C'est la raison pour laquelle nous la typons comme un entier (As Integer).

Piloter la base active
Maintenant que les objets existent, nous pouvons les initialiser pour prendre possession de la base de données et pour piloter les enregistrements de sa table.
  • Après les variables, ajouter les deux affectations suivantes :
...
Set base = CurrentDb()
Set enr = base.OpenRecordset("Infos")
...


Grâce à la fonction VBA Access CurrentDb, nous initialisons (Set) l'objet base sur la base de données en cours. C'est ainsi qu'il hérite de propriétés et méthodes pour la piloter. Et précisément dans l'enchaînement, nous exploitons sa méthode héritée OpenRecordset pour initialiser (Set) l'objet enr sur les enregistrements de la table Infos.

Pointer sur le premier enregistrement
Grâce à cette seconde affectation, l'objet enr a lui aussi hérité de propriétés et méthodes spécifiques. Nous allons en exploiter certaines, notamment pour naviguer au travers des enregistrements de la table Infos.
  • A la suite du code, ajouter les instructions VBA suivantes :
...
enr.MoveFirst
Do

enr.MoveNext
Loop While Not enr.EOF
...


Avec la méthode MoveFirst héritée par l'objet enr, nous plaçons tout d'abord le pointeur de lecture sur le premier enregistrement de la table. Puis, nous engageons une boucle (Do) destinée à les parcourir tous jusqu'au dernier (Loop While Not enr.EOF). A chaque passage et après les traitements qu'il nous reste encore à entreprendre, nous n'oublions pas de déplacer le pointeur sur l'enregistrement suivant (MoveNext).

Trouver et ajouter les mails
A chaque passage dans cette boucle, nous devons engager la fonction trouver_adresses sur le contenu du champ info_notes. Tous les mails ainsi isolés doivent ensuite être ajoutés dans le champ info_mail. Donc il est question d'exécuter une requête de mise à jour, autant de fois qu'il y a d'enregistrements à analyser.
  • Dans la boucle, avant le MoveNext, ajouter les instructions VBA suivantes :
...
Do
lesMails = trouver_adresses(enr.Fields("info_note").Value)
lId = enr.Fields("info_num").Value
requete = "UPDATE Infos SET info_mail = '" & lesMails &"' WHERE info_num=" & lId
base.Execute requete

enr.MoveNext
Loop While Not .EOF
...


Grâce à notre fonction, nous regroupons donc les mails trouvés dans la variable lesMails. Nous prélevons l'identifiant de l'enregistrement en cours d'analyse, dans la variable LId. Ensuite nous construisons la syntaxe de la requête de mise à jour (Update) dans la variable requete. Nous insérons les adresses isolées (lesMails), dans le champ info_mail, pour l'enregistrement en cours (WHERE info_num=" & lId). Attention de bien respecter l'alternance des simples et doubles côtes (= '" & lesMails & "'), pour l'insertion des mails.

Décharger et tester
Pour finir, nous devons décharger les objets de programmation afin de libérer proprement la mémoire de l'ordinateur.
  • Après la boucle, ajouter les instructions VBA suivantes :
...
Loop While Not enr.EOF

MsgBox "Les adresses mails ont correctement été isolées.", vbInformation

base.Close
Set enr = Nothing
Set base = Nothing


End Sub
...


Tout d'abord nous adressons un message de confirmation à l'utilisateur avec la fonction MsgBox. Nous exploitons la méthode Close de l'objet base pour fermer l'instance d'Access. Enfin, nous réinitialisons (Set), les deux objets à Nothing pour les détruire et donc, pour les sortir de la mémoire.
  • Enregistrer les modifications (CTRL + S) et revenir sur le formulaire (ALT + Tab),
  • Exécuter ce dernier, par exemple avec la touche F5 du clavier,
  • Puis, cliquer sur le bouton Traiter,
Extraire les adresses mails en VBA pour les ranger dans un champ de la table Access

Et si vous ouvrez la table Infos, vous avez le plaisir de constater que tous les mails ont parfaitement été extraits de chaque enregistrement et qu'ils ont été regroupés dans le champ info_mail.

Ranger les adresses mail dans un champ de la table Access en VBA

 
Sur Facebook
Sur Youtube
Les livres
Contact
Mentions légales



Abonnement à la chaîne Youtube
Partager la formation
Partager sur Facebook
Partager sur Twitter
Partager sur LinkedIn