Incrémenter et reconnaitre un doublon

Résolu
tipau35 Messages postés 320 Statut Membre -  
Vaucluse Messages postés 27336 Date d'inscription   Statut Contributeur Dernière intervention   -
Bonjour,
Dans la colonne D j'ai une valeur NomPrénom (calcul par concatener).
Il y a des doublons NomPrénom (mais il n'y a pas d'homonyme)
Dans la colonne E, j'ai l'identifiant ID.

J'ai plusieurs soucis.

1/
je souhaite donner un identifiant unique à chaque couple NomPrénom.
si je n'avais pas de doublon, je n'aurai qu'à tirer sur la cellule pour avoir une valeur de type ID1, ID2, ID3...

mais
2/
j'ai besoin que la colonne E se réfère au doublon pour donner le même identifiant lorsque la valeur se répète. Or ma valeur en D est une formule avec des cellules différentes mêmes si la valeur trouvée est déjà apparue.

3/
Comment ajouter une incrémentation +1 pour ID1 devienne ID2 en prenant en compte ce que j'ai indiqué ci-dessus ?

j'avais trouvé cette formule pour ne pas afficher le doublon, mais je ne sais pas comment incrémenter ID...
=SI(NB.SI($B$1:B$;"="&B2)>1;"doublon";"ID")

et à la place de "doublon" j'aimerai que l'ID correspondant apparaisse...

un lien vers l'exemple qui illustre tout ça
https://mon-partage.fr/f/a4kzpHpJ/

merci d'avance :)

2 réponses

  1. Vaucluse Messages postés 27336 Date d'inscription   Statut Contributeur Dernière intervention   6 453
     
    Bonjour
    voyez ici un système qui se passe de la colonne de concaténation

    https://mon-partage.fr/f/uA9m2Oii/

    crdlmnt
    0
    1. tipau35 Messages postés 320 Statut Membre 15
       
      Bonjour merci pour cette réponse.
      Serait-il possible de décomposer la formule pour que je la comprenne ?
      Dans le cas ou je souhaite m'en reservir ailleurs.

      Sinon, est-il possible de donner comme nom "ID" dans D1 à la place de "0_ " qui sert de référent de l'incrémentation ? Et pour changer cette appellation faut-il simplement remplacer son nom dans la formule par un autre que l'on souhaite ?
      Lorsque j'essaye, la formule donne parfois #valeur !

      merci
      0
    2. tipau35 Messages postés 320 Statut Membre 15
       
      Concernant le changement de nom, c'est bon. Sous Mac il faut faire Shift + Command + enter à la place de Shift + Ctrl + enter pour valider la cellule.
      0
  2. Vaucluse Messages postés 27336 Date d'inscription   Statut Contributeur Dernière intervention   6 453
     
    Bonjour

    la formule:

    =SIERREUR(INDEX($D$1:D1;EQUIV(B2&C2;$B$1:B1&$C$1:C1;0));"ID_"&MAX((STXT($D$1:D1;TROUVE("_";$D$1:D1)+1;4)*1)+1))
    se décompose en deux éléments

    1°) la partie qui cherche au dessus de la ligne où elle se trouve si les colonnes B et C contiennent déjà les références B et C de la ligne

    = SIERREUR(INDEX($D$1:D2;EQUIV(B3&C3;$B$1:B2&$C$1:C2;0))
    EQUIV(B3&C3;$B$1:B2&$C$1:C2;0)

    cette formule va chercher avec EQUIV si la concaténation de B et C sur la ligne, existe déjà dans la plage au dessus et si elle trouve un assemblage, ressort la valeur de D correspondante
    2°) si elle ne trouve pas, c'est la seconde partie qui s'effectue, soit:
    inscription des caractères ID_ lié avec le maximum trouvé dans les numérotations précédentes, pour la valeur numérique qui suit ID_
    "ID_"&MAX((STXT($D$1:D1;TROUVE("_";$D$1:D1)+1;4)*1)+1))

    pour ne pas tartiner des explications inutiles, essayez ceci sur les quelques lignes pour comprendre:
    la formule seule:
    =EQUIV(B3&C3;$B$1:B2&$C$1:C2;0) (matricielle)
    la formule complète:
    =INDEX($D$1:D2;EQUIV(B3&C3;$B$1:B2&$C$1:C2;0)) (matricielle
    avec le code erreur
    =SIERREUR(INDEX($D$1:D2;EQUIV(B3&C3;$B$1:B2&$C$1:C2;0));"") matricielle
    ensuite sur ligne 2
    =STXT(D2;TROUVE("_";D2)+1;4)*1)+1)) (normale)
    et ça devrait être plus clair

    en ce qui concerne le _01 en D1, vous ne pouvez pas l'enlever en l'état car il est utilisé pour définir le code en D2
    par contre, vous pouvez:
    • supprimer la formule en D2 et entrer un code du même style au clavier
    • par exemple: ID_01 au clavier
    • les autres s'ajusteront en conséquences


    espérant que tout ça est assez clair

    principes:
    INDEX(N° ligne; N°colonne) ressort la valeur de cellule dans les coordonnées indiquéees (dans la plage)
    EQUIV(valeur;champ;0) ressort le range dans le champ où se trouve la valeur cherchée
    SIERREUR(formule);"") évite un affichage d'erreur si les valeurs ne sont pas trouvées
    MAX(champ) renvoie la valeur maximum d'un champ
    STXT(texte;départ;nombre) renvoie la partie du texte qui commence au caractère "départ" avec le nombre de caractères souhaités
    TROUVE(texte cherché;texte) donne le rang du caractère cherché dans le texte

    et le *1 sert à numériser le résultat pour autoriserkl'incrémentation à +1
    c'est à peu près tout ce que je peux dire
    crdlmnt

    0