Ajouter formule dans liste de données

Bonjour,

Je galère à ajouter une formule dans une liste déroulante d'une cellule. Si je choisis le mode "Personnalisé" pour ajouter ma formule EXCEL je perds la liste déroulante. Existe t-il une alternative ?

Merci beaucoup !

JB

Bonjour JeanBaptisteP,

Il faut passer par une formule nommée via le menu "Formules" / "Gestionnaire de noms". La formule n'est pas mentionner mais si, exemple, elle utilise la fonction DECALER, il faut définir un nom et dans la zone "Fait référence à" indiquer la formule "=DECALER(x;x;x;x;x)"

Cdlt,

Cylfo

Bonjour Cyflo,

Merci pour votre retour. La formule que je veux appliquer est: =SI(A1="Table";"Table";"") que je souhaite appliquer en C12. Comment l'écrire dans le gestionnaire de nom ?

Merci beaucoup !

JB

Re,

Dans ce cas , il n'est pas nécessaire de passer par une formule nommée. Dans "Validation des données", "Liste" et dans "Source" indiquer simplement =SI(A1="Table";INDIRECT(A1);"")

Cdlt,

Cylfo

Merci beaucoup mais je voudrais ajouter en plus dans ma liste: "Bureau";"Canapé";"Chaise".

Comment procéder svp ?

Merci !

JB

Je ne comprends pas ce que vous voulez exactement :

  • afficher une liste qui varie en fonction de la cellule A1, si j'ai "Table" en "A1", j'affiche la plage ou le les données du tableau nommé "Table" et si j'ai "Bureau", j'affiche la plage ou le tableau nommé "Bureau", etc. ? Si c'est ça, il suffit en "A1" de mettre une liste avec les valeurs "Table;Bureau;"Canapé;Chaise" et dans la 2ème liste de mettre dans "Source" =INDIRECT(A1) ou si vos plages / tableaux sont par exemple nommées "T_Table", "T_Bureau" de mettre dans "Source" =INDIRECT("T_"&A1)
  • si ce n'est pas cela, pouvez-vous joindre un fichier, ce sera plus facile pour vous répondre avec justesse.

A nouveau,

Excusez-moi de ne pas avoir été assez précis dans mes explications :)

Je poste un fichier avec 2 exemples

Dans la feuille 1, si la cellule A1= "Table" alors je voudrais forcer l’affichage du mot "Table".

Dans la feuille2, si la cellule A1 est vide alors en cellule B1 on retrouve la liste présente dans la liste de données

Merci beaucoup en tout cas pour votre aide

JB

6jb.xlsx (10.76 Ko)

Re,

Je sais, restreindre les valeurs mais, sans VB, pas la forcer dans la cellule mais je ne dis pas qu'il n'y a pas une astuce possible. Dans le fichier, sur la feuille "Feuil1", la liste affichée dépend de la valeur saisie en A1 (si = "Table", il n'y a que Table qui est proposé dans la liste, sinon la liste complète est proposée).

7jb2.xlsx (10.39 Ko)

Si vous voulez du complément de solution VB, pas de souci.

Cdlt,

Cylfo

Re,

Je comprends, par conséquent j'ai fait un traitement par VBA. Par contre "Table" s'affiche uniquement en cellule B1 lorsque je clique dans une autre case après avoir sélectionné "Table" en cellule A1. Comment faire pour que "Table" s'affiche en "B1" directement lorsque je sélectionne "Table" en "A1" ?

J'ai essayé en plaçant mon code dans "Private Sub Worksheet_Change(ByVal Target As Range)" mais excel plante et se ferme tout seul. Auriez-vous une proposition s'il vous plait?

Merci encore !

6jb2.xlsm (14.02 Ko)

JB

Re,

Voir fichier joint.

Dans votre fichier, l'événement "Worksheet_Change" n'effectue pas déjà d'autres actions ? Si oui, le plantage est peut-être lié au fait que la modif en "B1" déclenche à son tour l'événement. Pour éviter de redéclencher des événements, il faut suspendre la gestion événementielle via la propriété "Application.Enabled = False" par contre il est primordial de la réactiver après la modification sinon les événements de classeur et de feuilles ne se déclenchent plus.

Vous pouvez aussi copier le code de cette procédure dans la V2, vous aurez les listes et le forçage.

Cdlt,

Culfo

8jb3.xlsm (15.41 Ko)

Bonjour Cylfo,

Exact l'autre code perturbait la bonne exécution de la macro. J'ai corrigé et c'est ok ! Merci à vous !

JB

Bonjour;

j'ai pas continué la discusion concernant la solution vba; mais j'ai continué sur la piste de Cylfo sans vba :

pour afficher que "Table" si "Table" est dans A1 : validation de données en C2 :

=SI(Feuil1!$A$1="Table";DECALER(T_EQUIPEMENT;EQUIV("Table";T_EQUIPEMENT;0)-1;0;1;1);DECALER(T_EQUIPEMENT;0;0;NBVAL(T_EQUIPEMENT);1))

(et ça c mieux car tient compte de la position de "Table" dans la liste)

pour quel que soit l'élement de la liste saisi dans A1 et non seulement "Table" alors j formule nommée "LST_EQUIPEMENT" en B2 reference à:

=SI(NB.SI(T_EQUIPEMENT;Feuil1!$A$1)=1;DECALER(T_EQUIPEMENT;EQUIV(Feuil1!$A$1;T_EQUIPEMENT;0)-1;0;1;1);DECALER(T_EQUIPEMENT;0;0;NBVAL(T_EQUIPEMENT);1))

on peut utiliser

ESTNUM(EQUIV(Feuil1!$A$1;T_EQUIPEMENT;0))

à la place de

SI(NB.SI(T_EQUIPEMENT;Feuil1!$A$1)=1;

Je ne sais pas si c'est ça qui est demandé ou si ça peut être utile ...

7jb2-2.xlsx (11.14 Ko)

cordialement

Bonjour ;

6jb3-1.xlsm (18.47 Ko)

Même si ce sujet est marqué résolu ; et pour ne pas créer un sujet similaire permettez moi de continuer dans le même ordre d’idées :

Précédemment les formules ne répondent pas exactement à ce que veut JeanBaptisteP (la liste en B1 doit rester complète prête pour resélectionner n’importe quel élément)

Dans ce fichier j’e me suis proposé avec vba, de généraliser, en partant du fichier de Cylfo, de la façon suivante :

si l’élément tapé dans A1 appartient à la liste équipement, alors l’afficher dans B1, tout en gardant la liste de choix en B1 intacte complète comme voulu, et si il n’appartient pas afficher « vide ».

ça marche sauf pour le vide : lorsque je tape ‘(ou sélectionne ) en A1 un élément n’appartenant pas à liste Equipement, il ne me met pas le vide : où est le problème dans le code ?!!

même si ça apparaît sans grande importance ou utilité , ça aide à comprendre le fonctionnement d’Excel et vba.

Private Sub Worksheet_Change(ByVal Target As Range)
   Dim NumElementList
   On Error GoTo Err_WSC
   If Target.Rows.Count > 1 Or Target.Areas.Count > 1 Then Exit Sub
      If Target = Range("A1") Then
          Application.EnableEvents = False
          NumElementList = WorksheetFunction.Match(Target.Value, Range("Equipement"), 0)

            If IsNumeric(NumElementList) Then
                Target.Offset(0, 1).Value = Target.Value
                Target.Offset(0, 2).Value = NumElementList
            Else
                Target.Offset(0, 1).Value = ""
                Target.Offset(0, 2).Value = "non trouvé"
            End If

       End If

    Application.EnableEvents = True

   Exit Sub

Err_WSC:
   Err.Clear
   Application.EnableEvents = True
   Exit Sub
End Sub

Cordialement

Bonjour @ tous

Résolu :

l'erreur été dans l'évaluation de WorksheetFunction.Match

la solution est : soit on utilise Application.Match, ou on ajoute l'instruction de Else dans goto erreur

Private Sub Worksheet_Change(ByVal Target As Range)
   Dim NumElementList
   On Error GoTo Err_WSC

   If Target.Rows.Count > 1 Or Target.Areas.Count > 1 Then Exit Sub

      If Target = Range("A1") Then

          Application.EnableEvents = False
'          NumElementList = WorksheetFunction.Match(Target.Value, Range("Equipement"), 0)
          NumElementList = Application.Match(Target.Value, Range("Equipement"), 0)
            If IsNumeric(NumElementList) Then
                Target.Offset(0, 1).Value = Target.Value
                Target.Offset(0, 2).Value = NumElementList
            Else
                Target.Offset(0, 1).Value = ""
                Target.Offset(0, 2).Value = "non trouvé"
            End If
    End If

    Application.EnableEvents = True

   Exit Sub

Err_WSC:
   Err.Clear
   Application.EnableEvents = True
'   Target.Offset(0, 1).Value = ""
'   Target.Offset(0, 2).Value = "non trouvé"
   Exit Sub
End Sub

Cordialement

Bonjour Kamel_G0411,

Juste une précision sur la différence entre utiliser "VarResult = application.worksheetfunction.fonctionxxxx" et "VarResult = application.fonctionxxxx".

Dans le 1er cas, si la fonction n'aboutie pas, elle génère une erreur d'exécution => donc une méthode est de placer "On Error Resume NExt" avant et de tester "If Err.Number = 0 Then" => c'est ok, sinon il faut gérer l'erreur.

Dans le 2ème cas, la variable VarResult (de type variant obligatoirement) de réception du résultat contient soit la valeur du résultat s'il n'y a pas d'erreur soit une valeur d'erreur. Il faut donc tester le résultat "If IsError(VarResult) = False then" => c'est ok, sinon il faut gérer le cas de l'erreur (un match qui n'abouti pas par exemple).

Cdlt,

Cylfo

@ Cylfo,
Merci pour ces explications ;
Je vois utiliser souvent ces instructions que je ne comprenais pas bien, je vais tester tout ça
Bonne journée.

Rechercher des sujets similaires à "ajouter formule liste donnees"