Isoler des emails contenu entre <>

  • Initiateur de la discussion Initiateur de la discussion Tanous
  • Date de début Date de début

Boostez vos compétences Excel avec notre communauté !

Rejoignez Excel Downloads, le rendez-vous des passionnés où l'entraide fait la force. Apprenez, échangez, progressez – et tout ça gratuitement ! 👉 Inscrivez-vous maintenant !

T

Tanous

Guest
Bonjour,

J'ai comme habitude d'agrandir ma base de donnée mail, en copiant/collant , une par une, chaque adresse mail qui se trouve en copie d'un mail. J'ai cru comprembre qu'il existait des manipulations, des formules, pour les isoler automatiquement.

Mon problème est le suivant : Lorsque j'ouvre un mail qui m'a été transferé par mon supérieur, je dois "aspirer" toutes les adresses et créer un fichier excel avec UNE seule adresse par cellule.

Que dois-je faire ? Un copier/coller de la liste des mail, où le travaille se fait en amont, directement à travers le mail ?
Le scenario est le suivant : "3i.saillard@gmail.com" <3i.saillard@gmail.com>, "aavcannes@orange.fr" <aavcannes@orange.fr>, ...... etc

Je ne veux QUE ce qu'il y a en rouge, isolé chaqu'un dans une cellule... Est possible ?

Très cordialement.

Antoine
 
Dernière modification par un modérateur:
Re : Isoler des emails contenu entre <>

Bonsoir à tous

Un essai avec regexp à peaufiner
(si on veut par exemple les adresses dans une cellules séparées par un ; )
(mon regexp est un peu rouillé 😉, david84 si tu passes par là 😉)
Code vba:
Sub Macro1()
Dim r As Range, i As Long
With CreateObject("vbscript.regexp")
.Global = True
.Pattern = "<([^<]+)(?=>)"
For Each r In Range("A1", Range("A" & Rows.Count).End(xlUp))
If .test(r.Value) Then
For i = 0 To .Execute(r.Value).Count - 1
r(, i + 2).Value = .Execute(r.Value)(i).submatches(0)
Next

End If
Next
End With
End Sub 'inspire by jindon
 
Dernière édition:
Re : Isoler des emails contenu entre <>

Bonsoir,
(mon regexp est un peu rouillé , david84 si tu passes par là )

Ben comme je passais par là...
Au vu du tout petit exemple proposé par le demandeur, je pense que l'on peut grandement simplifier le pattern.
Concernant la restitution des items dans la feuille, j'ai plutôt opté pour un stockage dans un array (mais on peut faire également comme dans ta macro) :
Code:
Sub Mail()
Dim oRegExp As Object, Matches As Object, chaine$, Tablo$(), i&
chaine = Range("A1").Value
Set oRegExp = CreateObject("vbscript.regexp")
With oRegExp
    .Global = True
    .Pattern = "<.+?>"
    If .test(chaine) Then
        Set Matches = .Execute(chaine)
        ReDim Tablo(0 To Matches.Count - 1)
        For i = LBound(Tablo) To UBound(Tablo)
            Tablo(i) = Matches.Item(i)
        Next i
    End If
End With
Range("B1").Resize(UBound(Tablo) + 1) = Application.Transpose(Tablo)
End Sub
Donc : la chaîne contenant toutes les doit être placée en A1 et la recopie se fait en B1.
A+
 
Re : Isoler des emails contenu entre <>

RE

Salut david84 (merci d'être passé 😉
J'ai relu la demande
Je ne veux QUE ce qu'il y a en rouge, isolé chaqu'un dans une cellule... Est possible ?
Ce que fait le code qeu j'ai soumis
Code vb:
Sub MacroRegEXP2()
Dim r As Range, i As Long
teststr = """abc@gmail.com"" <abc@gmail.com>, ""def@orange.fr"" <def@orange.fr>, ""NOM PRENOM""<nom.prenom@email.fr>"
[A1:A5] = teststr
MsgBox "extraction test"
With CreateObject("vbscript.regexp")
.Global = True
.Pattern = "<([^<]+)(?=>)"
'.Pattern = " <.+?>" 'plante avec ce code mais pas avec celui de david84
For Each r In Range("A1", Range("A" & Rows.Count).End(xlUp))
If .test(r.Value) Then
For i = 0 To .Execute(r.Value).Count - 1
r(, i + 2).Value = .Execute(r.Value)(i).submatches(0)
Next


End If
Next
End With
End Sub 'inspire by jindon





Quand je teste avec ton pattern, le code plante.

Alors que ton pattern ne plante pas dans ton code ???
 
Dernière édition:
Re : Isoler des emails contenu entre <>

Re

Petit à petit, cela se "dérouille" 😉
VB:
Sub MacroRegEXP3()
Dim r As Range, i As Long, Tablo$()
teststr = """abc@gmail.com"" <abc@gmail.com>, ""def@orange.fr"" <def@orange.fr>, ""NOM PRENOM""<nom.prenom@email.fr>"
[A1:A5] = teststr
MsgBox "Extraction Email - Test", vbInformation, "TEST" 'ici juste pout test
With CreateObject("vbscript.regexp")
    .Global = True
    .Pattern = "<([^<]+)(?=>)"
    For Each r In Range("A1", Range("A" & Rows.Count).End(xlUp))
        If .test(r.Value) Then
        ReDim Tablo(0 To .Execute(r.Value).Count - 1)
            For i = 0 To .Execute(r.Value).Count - 1
                Tablo(i) = .Execute(r.Value)(i).submatches(0)
            Next i
        r.Offset(, 1) = Join(Tablo, ";")
        End If
    Next
End With
End Sub 'inspire by jindon puis par david84 ;o)
 
Re : Isoler des emails contenu entre <>

Re
Quand je teste avec ton pattern, le code plante.

Alors que ton pattern ne plante pas dans ton code ???
c'est normal : le tien passe par l'utilisation d'un SubMatches dont il va chercher le 1er élément
Code:
submatches(0)
alors que le mien va chercher directement la correspondance (objet Matches).
Ceci-dit, si tu veux absolument récupérer l'adresse placée entre <> avec ma macro, 2 solutions :
- soit garder le code tel quel et utiliser un double Replace pour remplacer < et > par rien
- soit aller effectivement chercher la sous-correspondance (submatches(0)) comme ceci par exemple :
Code:
Sub Mail()
Dim oRegExp As Object, Matches As Object, SubMatches As String, chaine$, Tablo$(), i&
chaine = Range("A1").Value
Set oRegExp = CreateObject("vbscript.regexp")
With oRegExp
    .Global = True
    .Pattern = "<(.+?)>"
    '.Pattern = "<([^<]+)(?=>)"
    
    If .test(chaine) Then
        Set Matches = .Execute(chaine)
        ReDim Tablo(0 To Matches.Count - 1)
        For i = LBound(Tablo) To UBound(Tablo)
            Tablo(i) = Matches.Item(i).SubMatches(0)
        Next i
    End If
End With
Range("B1").Resize(UBound(Tablo) + 1) = Application.Transpose(Tablo)
End Sub

Tu remarqueras au passage que dans mon code les 2 patterns fonctionnent.
A+
 
Re : Isoler des emails contenu entre <>

Re


Tel que j'ai compris la question :
concaténer dans une même cellule les emails entre <> pour ensuite pour utiliser cette chaîne dans un client de messagerie (outlook ou autre)
le code de mon précédent message (amendé à 22h11 grâce au tien (celui de 21h05) fait cela.
(le tien extrait mais ne concatène pas mais il est plus beau syntaxiquement parlant 😉 )

Avec tous ces regexp, espérons que nous aurons intéressé Antoine aux charmes des expressions régulières. 😉

Mais comme ce n'était pas ma question et qu'antoine n'est pas revenu voir de quoi il en retourne, j'en resterai là dans ce fil. 😉
 
Dernière édition:
Re : Isoler des emails contenu entre <>

😕 Je ne comprends pas... C'est quoi regexp, ou bien une pattern?? Que dois-je faire, copier / coller ??

Je suis sur EXCEL 2007
 
Dernière modification par un modérateur:
Re : Isoler des emails contenu entre <>

Je vous remercie de votre réactivité, Or je suis perdu dans toutes ces données.. Que dois-je faire ?

1 | Copier/Coller la totalité des mails a isoler dans une cellule ... (A1)
2 | Copier/Coller quoi ? ?
 
Re : Isoler des emails contenu entre <>

Bonsoir à tous

Tanous
Nos propositions à david84 et moi sont du code VBA (macros).
Donc il faut que tu insères un module standard puis que tu y colles le code vba de ton choix.
(voir ici pour t’entraîner)

PS: tu avais joint un fichier exemple avec quelques lignes ( mais avec des adresses mail fictives, car il est ici recommandé de ne joindre que des fichiers sans données confidentielles.
(voir Lien supprimé à ce sujet)

A te relire avec un petit fichier exemple joint dans ton premier message*

*: Va sur ce message et cliques sur Modifier le message puis aller à Gérer les pièces jointes.
 
- Navigue sans publicité
- Accède à Cléa, notre assistante IA experte Excel... et pas que...
- Profite de fonctionnalités exclusives
Ton soutien permet à Excel Downloads de rester 100% gratuit et de continuer à rassembler les passionnés d'Excel.
Je deviens Supporter XLD
Assurez vous de marquer un message comme solution pour une meilleure transparence.
Retour