IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Macros et VBA Excel Discussion :

Extraire plusieurs adresses mails dans une même cellule [XL-2019]


Sujet :

Macros et VBA Excel

  1. #1
    Membre averti
    Homme Profil pro
    Responsable de compte
    Inscrit en
    Mai 2018
    Messages
    55
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Mayenne (Pays de la Loire)

    Informations professionnelles :
    Activité : Responsable de compte

    Informations forums :
    Inscription : Mai 2018
    Messages : 55
    Par défaut Extraire plusieurs adresses mails dans une même cellule
    Bonjour,

    j'utilise la Fonction ExtractEMAIL, qui me récupère uniquement la première adresse mail de la cellule mais pas les suivantes.

    Est ce que qqn peut m'aider je n'ai pas trouvé de solution.
    Merci

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    Function ExtractEMAIL(cel As Range) As String
     
    MyRegExPattern = "[_a-z0-9-]+(.[a-z0-9-]+)@[a-z0-9-]+(.[a-z0-9-]+)*(.[a-z]{2,4})"
    Dim RegEx As Object
    Set RegEx = CreateObject("vbscript.regexp")
    With RegEx
        .Global = True
        .IgnoreCase = True
        .Pattern = MyRegExPattern
    End With
     
    ExtractEMAIL = ""
    Set allMatches = RegEx.Execute(cel.Value)
    If allMatches.Count <> 0 Then
        ExtractEMAIL = allMatches(0)
    End If
     
    End Function

  2. #2
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par Fdc_53 Voir le message
    Bonjour,

    Je ne vais pas pouvoir vous aider, mais seulement vous indiquer le tuto concernant les expressions régulières :https://cafeine.developpez.com/access/tutoriel/regexp/

    Il aurait été intéressant de connaître le contenu d'une cellule type car je me demande si vous ne pourriez pas obtenir un résultat plus facilement avec Split.

  3. #3
    Membre Expert
    Avatar de pijaku
    Homme Profil pro
    Inscrit en
    Août 2010
    Messages
    1 817
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Nord (Nord Pas de Calais)

    Informations forums :
    Inscription : Août 2010
    Messages : 1 817
    Billets dans le blog
    10
    Par défaut
    Bonjour,

    En fait, si, il te les trouve toutes.
    Cependant tu ne renvoies, dans ta fonction, que la première...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ExtractEMAIL = allMatches(0)
    Essaye ceci, ça te renverra la seconde :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ExtractEMAIL = allMatches(1)
    Etc...

    Il te faut donc une fonction qui te renvoie toutes les valeurs, sous la forme d'un tableau.

    Je te propose donc une modification de ta fonction typée "tableau de String" ET avec toutes les variables correctement déclarées (cela oblige à cocher la référence à Microsoft VBScript Regular Expressions) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    Option Explicit
     
    Function ExtractEMAIL(cel As Range) As String()
    'Nécessite de cocher la référence : Microsoft VBScript Regular Expressions X.X
        'sous l'éditeur VBA : Outils/Références...
    Dim RegEx As VBScript_RegExp_55.regexp
    Dim allMatches  As VBScript_RegExp_55.MatchCollection
    Dim Item  As VBScript_RegExp_55.Match
    Dim MyRegExPattern As String
    Dim temp() As String, i As Integer
     
        MyRegExPattern = "[_a-z0-9-]+(.[a-z0-9-]+)@[a-z0-9-]+(.[a-z0-9-]+)*(.[a-z]{2,4})"
        Set RegEx = New VBScript_RegExp_55.regexp
        With RegEx
            .Global = True
            .IgnoreCase = True
            .Pattern = MyRegExPattern
        End With
        Set allMatches = RegEx.Execute(cel.Value)
        ReDim temp(allMatches.Count)
        For Each Item In allMatches
            temp(i) = Item
            i = i + 1
        Next
        ExtractEMAIL = temp
    End Function
    Un exemple d'appel :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Sub test()
    Dim Adresses() As String
        Adresses = ExtractEMAIL(Range("A1"))
        MsgBox Join(Adresses, vbCrLf)
    End Sub
    EDIT :Je rejoins Eric sur le fait que si, dans ta cellule, tu n'as QUE des adresses mails, séparées par un séparateur quelconque (espace, point-virgule, etc...), le plus simple est d'utiliser Split.
    S'il y a autre chose dans cette cellule, par contre, cette méthode fonctionne. Pas forcément la plus rapide, mais ça fonctionne...

  4. #4
    Membre averti
    Homme Profil pro
    Responsable de compte
    Inscrit en
    Mai 2018
    Messages
    55
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Mayenne (Pays de la Loire)

    Informations professionnelles :
    Activité : Responsable de compte

    Informations forums :
    Inscription : Mai 2018
    Messages : 55
    Par défaut
    Bonjour,

    merci pour vos retours et votre temps,

    Effectivement il y a d'autres données dans mes cellules que les adresses mails.

    J'ai essayé
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ExtractEMAIL = allMatches(1)
    qui fonctionne mais annule la bonne extraction
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ExtractEMAIL = allMatches(0)
    J'ai aussi essayé ta proposition mais cela me donne le même problème la première adresse mail n'est pas extraite seule.

    fichier test en PJ, merci de vos lumières.
    Fichiers attachés Fichiers attachés

  5. #5
    Membre Expert
    Avatar de pijaku
    Homme Profil pro
    Inscrit en
    Août 2010
    Messages
    1 817
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Nord (Nord Pas de Calais)

    Informations forums :
    Inscription : Août 2010
    Messages : 1 817
    Billets dans le blog
    10
    Par défaut
    Le pattern que tu as mis n'est pas bon.
    Change pour celui-ci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    "[A-Za-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*@(?:[a-z0-9](?:[a-zA-Z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?"
    (il en existe certainement d'autres, mais je t'ai mis le premier trouvé qui semble fonctionner)...
    trouvé ici :
    https://stackoverflow.com/questions/...-extract-email

    Code de la fonction :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    Function ExtractEMAIL3(cel As Range) As String()
    'Nécessite de cocher la référence : Microsoft VBScript Regular Expressions X.X
        'sous l'éditeur VBA : Outils/Références...
    Dim RegEx As VBScript_RegExp_55.regexp
    Dim allMatches  As VBScript_RegExp_55.MatchCollection
    Dim Item  As VBScript_RegExp_55.Match
    Dim MyRegExPattern As String
    Dim temp() As String, i As Integer
     
        MyRegExPattern = "[A-Za-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*@(?:[a-z0-9](?:[a-zA-Z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?"
        Set RegEx = New VBScript_RegExp_55.regexp
        With RegEx
            .Global = True
            .IgnoreCase = True
            .Pattern = MyRegExPattern
        End With
        Set allMatches = RegEx.Execute(cel.Value)
        ReDim temp(allMatches.Count)
        For Each Item In allMatches
            temp(i) = Item
            i = i + 1
        Next
        ExtractEMAIL3 = temp
    End Function

  6. #6
    Membre averti
    Homme Profil pro
    Responsable de compte
    Inscrit en
    Mai 2018
    Messages
    55
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Mayenne (Pays de la Loire)

    Informations professionnelles :
    Activité : Responsable de compte

    Informations forums :
    Inscription : Mai 2018
    Messages : 55
    Par défaut
    Super, merci cela fonctionne a Merveille!!

  7. #7
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par Fdc_53 Voir le message
    Sinon, en splitant :

    Nb : Quelle est la probabilité d'avoir deux @ dans la même adresse ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
     
     
    Function SplitAdresse(ByVal Chaine As String) As String
     
    Dim I As Integer
    Dim MonTableau As Variant
     
        SplitAdresse = ""
        MonTableau = Split(Chaine, " ")
        For I = LBound(MonTableau) To UBound(MonTableau)
            If InStr(1, MonTableau(I), "@", vbTextCompare) > 0 Then
               If Mid(MonTableau(I), 1, 1) = "@" Then
                  SplitAdresse = SplitAdresse & Mid(MonTableau(I), 2) & ";"
               Else
                  SplitAdresse = SplitAdresse & MonTableau(I) & ";"
               End If
            End If
        Next I
        SplitAdresse = Mid(SplitAdresse, 1, Len(SplitAdresse) - 1)
     
    End Function

  8. #8
    Membre Expert
    Avatar de pijaku
    Homme Profil pro
    Inscrit en
    Août 2010
    Messages
    1 817
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Nord (Nord Pas de Calais)

    Informations forums :
    Inscription : Août 2010
    Messages : 1 817
    Billets dans le blog
    10
    Par défaut
    Citation Envoyé par Eric KERGRESSE Voir le message
    Sinon, en splitant :

    Nb : Quelle est la probabilité d'avoir deux @ dans la même adresse ?
    Aucune.
    Par contre, il existe une possibilité que le @ soit dans un des mots qui encombrent la cellule.

    Du genre :
    @Mot f.canard@gmail.com présent
    Mais si ce ne peux pas être le cas, ta solution est bien meilleure...

  9. #9
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par pijaku Voir le message
    Mais si ce ne peux pas être le cas, ta solution est bien meilleure...
    Bonjour Franck,

    Je ne maîtrise pas du tout cette façon de coder. D'après toi, quels seraient le ou les cas où il faudrait absolument passer par ta solution ?

    Cordialement.

  10. #10
    Membre Expert
    Avatar de pijaku
    Homme Profil pro
    Inscrit en
    Août 2010
    Messages
    1 817
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Nord (Nord Pas de Calais)

    Informations forums :
    Inscription : Août 2010
    Messages : 1 817
    Billets dans le blog
    10
    Par défaut
    Citation Envoyé par Eric KERGRESSE Voir le message
    Bonjour Franck,

    Je ne maîtrise pas du tout cette façon de coder. D'après toi, quels seraient le ou les cas où il faudrait absolument passer par ta solution ?

    Cordialement.
    Bonjour Eric,

    Pour être honnête, je n'en vois aucun.
    Je pensais, par exemple, à la présence d'un inopportun @ qui se baladerait en dehors d'une adresse mail. Par exemple :
    &AA LR 25/06 BDC SUR @OM ; FACTURE GLOBALE TABLEAU N:\OCCITANIE A ENVOYER A tutu@orange.com POUR VALIDATION; DICTE OK DU 13 AU 23/07 zozo@yahho.com
    Mais il suffirait, dans ce cas, d'un simple test (dans la chaîne de caractères ou on trouve cet "@" malveillant, y a t'il un "." après et une chaîne de caractères avant) pour déterminer s'il s'agit d'un email...

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. VBA : Génération de plusieurs liens hypertextes dans une même cellule
    Par Adrien_Vdv dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 23/06/2017, 13h19
  2. Réponses: 24
    Dernier message: 24/06/2010, 11h48
  3. Réponses: 5
    Dernier message: 04/06/2008, 10h03
  4. Réponses: 1
    Dernier message: 07/08/2007, 09h06
  5. Plusieurs résultats dans une même cellule
    Par luboyoyo dans le forum Excel
    Réponses: 2
    Dernier message: 04/06/2007, 08h39

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo