Ceci est une page optimisée pour les mobiles. Cliquez sur ce texte pour afficher la vraie page.

Problème : arguments fonction SI ERREUR

  • Initiateur de la discussion Initiateur de la discussion Excelpro
  • 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 !

E

Excelpro

Guest
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 !!!
 
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

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

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

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)
 
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 ??
 
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

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:
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
 
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
 
- 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.
Les cookies sont requis pour utiliser ce site. Vous devez les accepter pour continuer à utiliser le site. En savoir plus…