Formule extraction nom prénom d'une cellule

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 !

scorpio94

XLDnaute Nouveau
Bonjour,

Je bloque sur une formule qui me permettrait d'extraire le nom et prénom d'une cellule sous format d'adresse mail mais avec une condition :

- Si la cellule contient un prénom et un nom composé, il faudrait mettre un tiret entre le nom composé sous ce format là : " prénom.nom-composé@test.fr "

Je mets en pièce jointe un fichier sur lequel j'ai commencé une formule qui me permet pour l'instant uniquement d'extraire le prénom et le nom : " prénom.nom@test.fr "

Merci de votre aide !
 

Pièces jointes

1571230321559.png


Merci de ton retour!


Les noms et prénoms ont systématiquement le même format :

DUPONT CHRISTOPHE -> Nom en 1ère position et le prénom en 2nde position.

Lorsqu'il y a un nom composé, la seconde partie du nom suit la systématiquement la première :

GONCALVES PERREIRA CELINE -> Nom en 1ère position, 2ème partie du nom en 2nde position et enfin le prénom en dernière position.

Il faudrait que dans le cas d'un nom composé la 1ère et la 2eme partie du nom soit séparées d'un "-".

Ne serait-il pas possible qu'Excel puisse identifier les éléments en fonction de leur positions ?

Je ne sais pas si j'ai été clair...

Merci encore une fois...
 
Re,

Valtrase a raison.

Par éclatement des données avec "Données/Convertir" puis remplacement des ( et ) par rien, voir la soluce en feuille 2

Par fonction personnelle en feuille 3,

VB:
Function Email(c As Range, Optional domaine As String = "test.fr")
    Dim Valeurs As Variant
    Dim i As Integer
    Valeurs = Split(c.Cells(1, 1), " ")
    For i = 0 To UBound(Valeurs)
        Valeurs(i) = Replace(Replace(Valeurs(i), "(", ""), ")", "")
    Next i
    Select Case UBound(Valeurs)
    Case 3: Email = LCase(Valeurs(3) & "." & Valeurs(1) & "-" & Valeurs(2))
    Case 2: Email = LCase(Valeurs(2) & "." & Valeurs(1))
    Case Else: Email = CVErr(xlErrNA)
    End Select
    If Not IsError(Email) And domaine <> "" Then Email = Email & "@" & domaine
End Function

Sinon voir la formule en E2 de feuil1 du fichier joint, rien que pour rigoler!
Elle fonctionne sur les deux exemple donnés, mais en cas d'erreur, allez la débugger!!!!

=MINUSCULE(SI(ESTNUM(TROUVE(".";SUBSTITUE(SUBSTITUE(SUBSTITUE(DROITE(A1;NBCAR(A1)-TROUVE("(";A1));")";"");" ";"-";1);" ";".";1)));DROITE(SUBSTITUE(SUBSTITUE(SUBSTITUE(DROITE(A1;NBCAR(A1)-TROUVE("(";A1));")";"");" ";"-";1);" ";".";1);NBCAR(SUBSTITUE(SUBSTITUE(SUBSTITUE(DROITE(A1;NBCAR(A1)-TROUVE("(";A1));")";"");" ";"-";1);" ";".";1))-TROUVE(".";SUBSTITUE(SUBSTITUE(SUBSTITUE(DROITE(A1;NBCAR(A1)-TROUVE("(";A1));")";"");" ";"-";1);" ";".";1)))&"."&GAUCHE(SUBSTITUE(SUBSTITUE(SUBSTITUE(DROITE(A1;NBCAR(A1)-TROUVE("(";A1));")";"");" ";"-";1);" ";".";1);TROUVE(".";SUBSTITUE(SUBSTITUE(SUBSTITUE(DROITE(A1;NBCAR(A1)-TROUVE("(";A1));")";"");" ";"-";1);" ";".";1))-1);DROITE(SUBSTITUE(SUBSTITUE(SUBSTITUE(DROITE(A1;NBCAR(A1)-TROUVE("(";A1));")";"");" ";"-";1);" ";".";1);NBCAR(SUBSTITUE(SUBSTITUE(SUBSTITUE(DROITE(A1;NBCAR(A1)-TROUVE("(";A1));")";"");" ";"-";1);" ";".";1))-TROUVE("-";SUBSTITUE(SUBSTITUE(SUBSTITUE(DROITE(A1;NBCAR(A1)-TROUVE("(";A1));")";"");" ";"-";1);" ";".";1)))&"." &GAUCHE(SUBSTITUE(SUBSTITUE(SUBSTITUE(DROITE(A1;NBCAR(A1)-TROUVE("(";A1));")";"");" ";"-";1);" ";".";1);TROUVE("-";SUBSTITUE(SUBSTITUE(SUBSTITUE(DROITE(A1;NBCAR(A1)-TROUVE("(";A1));")";"");" ";"-";1);" ";".";1))-1)))&"@test.fr"

Cordialement
 

Pièces jointes

Dernière édition:
Bonsoir le fil

scorpio94
Le lien vers Youtube expliquait la blague
Par contre le premier lien était un lien sérieux qui menait vers un fil d'XLD très fourni relatifs aux expressions régulières
Cela ne devait pas être suffisant pour un petit feedback de ta part...🙄
 
Re

Juste pour saluer Roblochon amicalement 😉
Et pour montrer la puissance de RegExp
VB:
Sub test()
sTest = "12345678  (GONCALVES PERREIRA Céline)"
[A1] = sTest: [B1:C1] = Array("=Nom($A$1)", "=Prénom($A$1)")
End Sub

Function Nom(c)
  Application.Volatile
  Set obj = CreateObject("vbscript.regexp")
  obj.Pattern = "([A-Z'ÔË]{2,}\s*-?)+"
  Set a = obj.Execute(c)
  If a.Count > 0 Then Nom = a(0) Else Nom = ""
End Function

Function Prénom(c)
  Application.Volatile
  Set obj = CreateObject("vbscript.regexp")
  c = Replace(Replace(Replace(c, "M.", ""), "Mme", ""), "Mle", "")
  obj.Pattern = "([A-Z][a-zëéèô]+\s*-?)+"
  Set a = obj.Execute(c)
  If a.Count > 0 Then Prénom = a(0) Else Prénom = ""
End Function
PS: crédits à JB pour ces deux fonctions
 
Bonjour le fil

Alors le temps que les pâtes finissent de cuire
(et pour une solution qui n'implique pas RegExp, mais pas sur pour autant que cela fonctionne sur Mac)
A tester sur un classeur vierge
(en lançant d'abord la macro pretest qui ne sert quà créer des données exemple)
Lancer ensuite la macro Remanier
VB:
Sub pretest()
Range("A1:A20") = "=""100""+ROW()&CHOOSE(MOD(ROW(),2)+1,"" ( GONCALVES PERREIRA CELINE) "",""( DUPONT CHRISTOPHE ) "")&""1000""-ROW()"
Range("A1:A20") = Range("A1:A20").value
End Sub
Sub Remanier()
Dim cel As Range, Rng As Range, pr$, no$
Set Rng = Range(Cells(1, 1), Cells(Rows.Count, 1).End(3))
For Each cel In Rng
x = INVERSEMOT(cel.text)
pr = Split(x)(0) & "."
no = Replace(VBA.Trim(Mid(x, Len(pr), 9 ^ 9)), " ", "-")
cel.Offset(, 1) = pr & no & "@test.fr"
Next
End Sub
Function INVERSEMOT(Mot$) As String
Dim x, a$, b$
a = Split(Split(Mot, ")")(0), "(")(1): b = StrReverse(a)
For Each x In Split(b)
INVERSEMOT = LCase(Trim(INVERSEMOT & " " & StrReverse(x)))
Next
End Function
Pendant ce temps, je vais égoutter mes pâtes 😉
 
- 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

Discussions similaires

  • Question Question
Réponses
5
Affichages
165
Réponses
4
Affichages
541
Retour