Problème : arguments fonction SI ERREUR

Excelpro

XLDnaute Nouveau
Bonjour à tous !

J'ai besoin de vos lumières : j'ai une formule SI ERREUR qui comporte plus de 8 arguments, aucun souci. Je ne parviens pas à créer la fonction exactement similaire avec des arguments différents à coté. Soit j'ai trop soit pas assez d'arguments : je souhaite en mettre 4...
Voila la première : =+SIERREUR(SI(I3="prenom.nom";E3&"."&D3;SI(I3="nom.prenom";D3&"."&E3;SI(I3="prenom";E3;SI(I3="pnom";GAUCHE(E3;1)&D3;SI(I3="p.nom";GAUCHE(E3;1)&"."&D3;SI(I3="prenom_nom";E3&"_"&D3;SI(I3="nom";D3;SI(I3="prenomnom";E3&D3;SI(I3="pn";GAUCHE(E3;1)&GAUCHE(D3;1);SI(I3="nom.p";D3&"."&GAUCHE(E3;1);SI(I3="nom_p";D3&"_"&GAUCHE(E3;1);"")))))))))))&"@"&J3;"")

Ma 2e est donc quais la meme avec des formes différents sur les arguments.
Quelqu'un aurait-il une solution svp ?
merci !!!
 

Excelpro

XLDnaute Nouveau
Slt,

Comme tout l'temps, un petit fichier excel light, sans donnees confidentielles, pour expliquer ton besoin...

++

Merci de votre réactivité !

Ci-joint lexcel épuré. Vous verrez en "Colonne email final 1" le résultat de la formation des emails avec les structures en colonne J. Et la formule fonctionne très bien.
En revanche lorsque jecris la meme pour la formation des autres structures de mail (pour email final 2) dont les structures sont dessous, la formule m'avertit qu'il y a soit pas assez soit trop d'arguments.

Merci encore de votre aide :)
 

Pièces jointes

  • Excel 1.xlsx
    21.1 KB · Affichages: 42

Hieu

XLDnaute Impliqué
Re,
(solution alternative)
Je te propose une fonction vba qui te permet de réaliser ce que tu souhaites (non terminée), en évitant cet embriquement de "SI" :
VB:
Function excelpro(structure As String, nom As String, prenom As String)
Select Case structure
    Case "prenomnom"
        excelpro = prenom & nom
    Case "pnom"
        excelpro = Left(prenom, 1) & nom
    Case "prenom"
        excelpro = prenom
    Case "nom"
        excelpro = nom
    Case "prenom_nom"
        excelpro = prenom & "_" & nom
    Case "p.nom"
        excelpro = Left(prenom, 1) & "." & nom
    Case "pn"
        excelpro = Left(prenom, 1) & Left(nom, 1)
    Case "nom.p"
        excelpro = nom & "." & Left(prenom, 1)
End Select
End Function

Qu'en penses-tu ?
 

Pièces jointes

  • Excel 1_v0.xlsm
    15.1 KB · Affichages: 29

Excelpro

XLDnaute Nouveau
Je te remets le fichier à jour en pj.
=> En Email final 1 (colonne G) j'ai une formule qui prend des arguments présents en colonne I & J. Je souhaite avoir en "Email final 2" (colonne H) la même formule avec les arguments précisés colonne D.
Donc simplement faire apparaitre les mails en automatique avec des arguments différents.
Tout bon pour lexplication ?
 

Pièces jointes

  • Excel 1.xlsx
    21.5 KB · Affichages: 35

Hieu

XLDnaute Impliqué
Il y a une limitation, sur le nb de "si" imbriqué voilà pourquoi, tu dois très certainement être bloqué.
Je regarde pour contourner, sans création de vba (que je trouve quand même simple à mettre en oeuvre ==> voir cellule H3 du fichier Excel 1_v0.xlsm)
 

Excelpro

XLDnaute Nouveau
merci mais comme tu peux le voir, bizarrement la formule en email final 1 (colonne G) fonctionne parfaitement alors qu'il y 11 arguments ! Comment expliquer que je ne puisse pas faire une formule similaire avec moins d'arguments en colonne H ??
 

Hieu

XLDnaute Impliqué
Pour info,
Ca pourrait interesser d'autres personnes :
VB:
Function excelpro(structure As String, nom As String, prenom As String)
Select Case structure
    Case "prenomnom"
        excelpro = prenom & nom
    Case "pnom"
        excelpro = Left(prenom, 1) & nom
    Case "prenom"
        excelpro = prenom
    Case "nom"
        excelpro = nom
    Case "prenom_nom"
        excelpro = prenom & "_" & nom
    Case "p.nom"
        excelpro = Left(prenom, 1) & "." & nom
    Case "pn"
        excelpro = Left(prenom, 1) & Left(nom, 1)
    Case "nom.p"
        excelpro = nom & "." & Left(prenom, 1)
    Case "nom.prenom"
        excelpro = nom & "." & prenom
    Case "nom-pr"
        excelpro = nom & "-" & Left(prenom, 2)
    Case "nomp"
        excelpro = nom & Left(prenom, 1)
    Case "p-nom"
        excelpro = Left(prenom, 1) & "-" & nom
    Case "prenom-nom"
        excelpro = prenom & "-" & nom
    Case "prenomn"
        excelpro = prenom & nom
End Select
End Function
 

Pièces jointes

  • Excel 1_v0.1.xlsm
    15.1 KB · Affichages: 28

Dranreb

XLDnaute Barbatruc
Bonjour
Explorer peut être aussi cette voie :
Code:
=SUBSTITUE(SUBSTITUE(SUBSTITUE(SUBSTITUE(SUBSTITUE(SUBSTITUE($I3;"nom";CAR(1));"prenom";CAR(2));"p";CAR(3));CAR(1);$D3);CAR(2);$E3);CAR(3);GAUCHE($E3;1))
Ou bien :
Code:
=SUBSTITUE(SUBSTITUE(SUBSTITUE(SUBSTITUE(SUBSTITUE(SUBSTITUE($I3;"nom";"#1");"prenom";"#2");"p";"#3");"#1";$D3);"#2";$E3);"#3";GAUCHE($E3;1))
En utilisant dans le masque les codes "#Nm","#Pn","#IP" la formule serait plus simple :
Code:
=SUBSTITUE(SUBSTITUE(SUBSTITUE($I4;"#Nm";$D4);"#Pn";$E4);"#IP";GAUCHE($E4;1))
C'est surtout votre code "p" qui pose problème car il peut être contenu à plusieurs endroits dans le texte à traiter.
 
Dernière édition:

Dranreb

XLDnaute Barbatruc
En VBA, une fonction perso avec les mêmes codes mais qui tiendrait compte des prénoms composés :
VB:
Function AdrEMail(ByVal Masque As String, ByVal Nom As String, ByVal Prénom As String)
Dim P As Long, C As String * 1, Lettre As Boolean, Déjà As Boolean, InitPrén As String
If InStr(Masque, "#IP") Then
  For P = 1 To Len(Prénom)
     C = Mid$(Prénom, P, 1)
     Lettre = UCase(C) <> LCase(C)
     If Lettre Then
        If Not Déjà Then InitPrén = InitPrén & C
        Déjà = True
     Else
        Déjà = False: End If: Next P: End If
AdrEMail = Replace(Replace(Replace(Masque, "#IP", InitPrén), "#Nm", Nom), "#Pn", Prénom)
End Function
 

Dranreb

XLDnaute Barbatruc
La version qui marcherait avec vos codes de masque, pourvu que vous n'ayez jamais à y ajouter des parties fixes contenant "p". Le mieux serait que la partie après "@" soit donnée dans un paramètre supplémentaire :
VB:
Function AdrEMail(ByVal Masque As String, ByVal Nom As String, ByVal Prénom As String, _
  ByVal Domain As String)
Dim P As Long, C As String * 1, Lettre As Boolean, Déjà As Boolean, InitPrén As String
If InStr(Masque, "prenom") = 0 Then Masque = Replace(Masque, "p", "¶")
If InStr(Masque, "¶") Then
  For P = 1 To Len(Prénom)
     C = Mid$(Prénom, P, 1)
     Lettre = UCase(C) <> LCase(C)
     If Lettre Then
        If Not Déjà Then InitPrén = InitPrén & C
        Déjà = True
     Else
        Déjà = False: End If: Next P: End If
AdrEMail = Replace(Replace(Replace(Masque, "nom", Nom), "prenom", Prénom), _
  "¶", InitPrén) & "@" & Domain
End Function
 

Statistiques des forums

Discussions
312 099
Messages
2 085 273
Membres
102 846
dernier inscrit
gilles45