Menu déroulant VS Si

vemcnico -  
via55 Messages postés 14391 Date d'inscription   Statut Membre Dernière intervention   -
Bonjour,

Je veux pouvoir afficher un menu déroulant seulement si une valeur précise; sinon je veux que le champ reste vide et sans menu déroulant vide.

Si cellule G8 = Interne

Je veux aucun menu déroulant dans la cellule D21; je veux même pas la petite flèche avec un menu vide là.

Et Si cellule G8 = Externe

Je veux dans la cellule D21 ma liste déroulante nommé Firme disponible....

Comment faire ?

J'ai essayé dans ma validation de données de mettre:

=SI($G$8="Externe";Firme;"")

Mais il me donne un menu vide avec Interne.

Merci de m'aider :)

5 réponses

  1. via55 Messages postés 14391 Date d'inscription   Statut Membre Dernière intervention   2 759
     
    Bonsoir,

    tu peux ne le faire que par une macro

    ALT + F11 pour ouvrir l'éditeur VBA
    Double clic sur la feuille concernée par cette manip dans l'arborescence de gauche
    Copier-coller la macro suivante dans la page et fermer l'éditeur

    Private Sub Worksheet_Change(ByVal Target As Range)
    If Not Intersect(Target, Range("G8")) Is Nothing Then
    Range("D21").Select
      With Selection.Validation
    
      .Delete
    If Target.Value = "Externe" Then
    .Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, Operator:= _
            xlBetween, Formula1:="=Firme"
     Else
    .Add Type:=xlValidateInputOnly, AlertStyle:=xlValidAlertStop, Operator _
            :=xlBetween     
    End If
    
    End With
     End If
    End Sub


    Cdlmnt
    Via
    0
  2. vemcnico
     
    Bonjour, Merci énormément, ça fonctionne. Par contre, j'ai essayé de faire la même chose pour un autre champ (D22) qui celui-ci affiche le menu déroulant indirect à D21. Voici ce que j'ai essayé de faire, et ca marche pas. En fait quand c'était EXTERNE en G8, il faut le menu déroulant "Firme" en D21 et le menu déroulant INDIRECT(D21) en D22.

    Private Sub Worksheet_Change(ByVal Target As Range)

    If Not Intersect(Target, Range("G8")) Is Nothing Then
    Range("D21").Select
    With Selection.Validation

    .Delete
    If Target.Value = "Externe" Then
    .Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, Operator:= _
    xlBetween, Formula1:="=Firme"
    Else
    .Add Type:=xlValidateInputOnly, AlertStyle:=xlValidAlertStop, Operator _
    :=xlBetween
    End If

    End With
    End If

    If Not Intersect(Target, Range("G8")) Is Nothing Then
    Range("D22").Select
    With Selection.Validation

    .Delete
    If Target.Value = "Externe" Then
    .Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, Operator:= _
    xlBetween, Formula1:="=INDIRECT(D21)"
    Else
    .Add Type:=xlValidateInputOnly, AlertStyle:=xlValidAlertStop, Operator _
    :=xlBetween
    End If

    End With
    End If

    End Sub
    0
  3. via55 Messages postés 14391 Date d'inscription   Statut Membre Dernière intervention   2 759
     
    Bonjour

    Il faut que le placement de la formule INDIRECT se fasse quand D21 contient une valeur valide, donc au choix dans la liste déroulante en D21

    Essaie plutôt quelque chose comme :
    Private Sub Worksheet_Change(ByVal Target As Range)
    If Not Intersect(Target, Range("G8")) Is Nothing Then
    Range("D21").Select
      With Selection.Validation
    
      .Delete
    If Target.Value = "Externe" Then
    .Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, Operator:= _
            xlBetween, Formula1:="=Firme"
     Else
    .Add Type:=xlValidateInputOnly, AlertStyle:=xlValidAlertStop, Operator _
            :=xlBetween
    End If
    
    End With
    Exit Sub
    End If
    
    If Not Intersect(Target, Range("D21")) Is Nothing And Range("G8") = "Externe" Then
    Range("D22").Select
    With Selection.Validation
    .Delete
    .Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, Operator:= _
    xlBetween, Formula1:="=INDIRECT(D21)"
    End With
    End If
    
    If Not Intersect(Target, Range("D21")) Is Nothing And Range("G8") = "Interne" Then
    Range("D22").Select
    With Selection.Validation
    .Delete
    .Add Type:=xlValidateInputOnly, AlertStyle:=xlValidAlertStop, Operator _
    :=xlBetween
    End With
    End If


    Cdlmnt
    Via
    0
  4. vemcnico
     
    Merci ça fonctionne. Par contre si j'efface la valeur de D21 (ma firme) en premier, il me met un bug tout de suite.

    Je pourrais peut-être rajouter une fonction au changement de valeur G8, cleaner tous les champs de valeurs (D21 et D22) ?!
    0
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. via55 Messages postés 14391 Date d'inscription   Statut Membre Dernière intervention   2 759
     
    Re,

    Oui mais de toutes façons il faut shunter la Private Sub Worksheet_Change lorsque D21 ou D22 devient vide en mettant en début de Sub :
    If Range("D21") = "" or Range("D22") = "" Then Exit Sub
    0