Supprimer choix sur la liste déroulante choix

xoxo -  
 xoxo -
Bonjour,

j'ai créer ma liste déroulante de choix, ce que je voudrais, c'est qu'à chaque fois que je sélectionne un choix pour une première case par exemple celui-ci disparaisse des cases suivantes sur ma liste déroulante, est-ce possible sur Excel 2003?
merci pour vos réponses

4 réponses

  1. Vaucluse Messages postés 27336 Date d'inscription   Statut Contributeur Dernière intervention   6 453
     
    Bonjour

    Quelques explications, non ce n'est pas très compliqué et ça peut être plus simple selon vos besoins:

    en l'état du modèle:

    Feuille F_1 colonne A:
    la liste originale de vos valeurs à placer dans le menu déroulant (soit en colonne E:E)
    en colonne B:
    une formule de qui permet de détecter si le nom est déjà utilisé ou pas, selon ce principe:

    =SI(NB.SI(E:E;A2)=1;0;MAX($B$1:B1)+1)

    NB.SI(E:E;A2) compte le nombre de fois où la valeur de A2 se trouve dans la colonne E
    si la valeur y est une fois, la formule renvoie 0 sinon:
    MAX($B$1:B1) incrémente de 1 chaque fois que NB.SI trouve une valeur inexistante en colonne E
    remarquez que dans ce code, le premier $B$1 est bloqué, pas le second, de façon à étirer le champ en descendant la formule
    ainsi MAX(..;..)+1 incrémente bien de 1 à chaque fois que la condition est correcte.
    On obtient donc en colonne B une numérotation progressive des noms utilisables en éliminant les "déjà pris"

    en colonne C la formule recrée la liste avec les noms restants selon:

    =SI(LIGNE()-1>MAX($B$2:$B$27);"";INDEX($A$2:$A$27;EQUIV(LIGNE()-1;$B$2:$B$27;0);1))

    Le code LIGNE() renvoie le N° de ligne où se trouve la formule donc en LIGNE()-1 en C2 renvoie 1 , en C3 2 etc...

    la première partie de la formule évite l'affichage #N/A lorsque la valeur de LIGNE()-1 n'existe pas en colonne B
    avec LIGNE()-1>MAX($B$2:$B$27)
    ainsi la formule renvoi "" (rien) si le N° ligne -1 est plus grand que le maxi en colonne de codage

    si la valeur LIGNE()-1 existe en B:
    INDEX($A$2:$A$27;EQUIV(LIGNE()-1;$B$2:$B$27;0);1))
    code INDEX renvoi la valeur trouvée dans le champ au N° de ligne indiqué et N° de colonne (du champ, pas de la feuille)
    principe:=INDEX(Ligne;Colonne)

    le code EQUIV renvoi le N° de ligne du champ correspondant à la valeur cherchée dans le champ (une colonne seulement)
    le 0 qui termine le code est un code excel interdisant de ressortir une valeur proche
    principe:=EQUIV(Valeur;champ colonne;0)
    donc:
    EQUIV recherche LIGNE()-1 en colonne B et ressort le N° de ligne du champ correspondant

    et INDEX($A$2:$A$27(EQUIV(....))
    ressort la valeur trouvé au N° de ligne du champ définit par EQUIV et dans la première colonne (définie par le;1) final

    La liste reconstituée est donc évolutive en fonction du nombre de noms restants.

    pour faciliter la mise en place de la validation, cette liste en colonne C est nommée selon le principe ci dessous:
    Insertion/ Nom / Définir un nom
    ce nom de LST est défini par la formule:
    =INDIRECT("C2:C"&NB.SI(F_1!$C$2:$C$27;"><"))
    soit:INDIRECT(...) qui transforme un texte en adresse de champ
    "C2:C" pour définir en texte le départ du champ, invariable
    & qui est le signe permettant de lier en la suite au texte, et ensuite
    NB.SI(F_1!$C$2:$C$27;"><"))
    qui compte le nombre de valeur dans le champ différentes de "", donc le nombre de cellules de la colonne C avec un nom

    ainsi la liste s'ajuste en permanence au nombre de noms trouvés en C2:C27

    Validation en colonne E:
    =Validation de liste, il suffit alors d'entrer dans la fenêtre dce validation, en bas,:
    =LST soit = nom donné à la liste.

    A noter que cette solution en nommant le champ vous permet de placer la validation sur une autre feuille, ce qui n'est pas le cas si vous spécifiez simplement le champ.Ainsi, vous pouvez masquer la feuille qui sert à l'établissement de la liste


    Cette solution donne quelque chose de complet et propre mais on peut faire plus simple si la liste originale n'est pas trop longue:

    Toujours d'après le modèle:
    de A2 à A27 la liste originale
    nommez le champ B2:B27
    en B2 la formule:
    =SI(NB.SI(E:E;A2)=0;A2;"")
    vous aurez alors dans le champ B une liste où ne se retrouveront que les noms inexistants en E
    La validation sera donc faite par une liste "à trous" dont les noms déjà utilisés auront disparus.

    Ouf,... bon courage..
    ce n'est pas très facile à expliquer en prenant dès le tout début !!!
    j'espère avoir été à eu près clair, mais c'est plus complexe à expliquer qu'à appliquer!

    Revenez si besoin, peut être avec un modèle à adapter que vous pourrez placer sur:
    http://www.cijoint.fr en revenant ici éditer le lien

    crdlmnt

    1
  2. xoxo
     
    Re!

    J'y suis parvenue avec votre exemple de départ mais aussi avec vos explications, néanmoins je trouve tout de même cette manip complexe, mais je n'y serais pas arrivée sans votre aide.
    Alors un GRAND MERCI... et au plaisir
    1
  3. xoxo
     
    Bonjour Vaucluse,

    c'est exactement ce qu'il me faut!
    Serait-il possible d'avoir plus de détails et me dire quelles ont été vos manipulations? Cela m'a l'air compliqué
    Merci d'avance pour vos explications...
    0
  4. Vaucluse Messages postés 27336 Date d'inscription   Statut Contributeur Dernière intervention   6 453
     
    Bonjour
    quelque chose comme ça?

    http://www.cijoint.fr/cjlink.php?file=cj201103/cijOFNv43l.xls

    revenez si besoin pour adaptation
    crdlmnt

    -1