IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Macros et VBA Excel Discussion :

liste en fonction du résultat d'une autre liste [XL-2007]


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Juin 2010
    Messages
    34
    Détails du profil
    Informations forums :
    Inscription : Juin 2010
    Messages : 34
    Par défaut liste en fonction du résultat d'une autre liste
    Bonjour ,

    Je cherche une solution pour afficher une liste déroulante en fonction du résultat d'une première liste déroulante.

    Pour la première liste, dans "validation de données" je choisis "liste" et dans le champ "=Liste_Catégories".

    Liste_Catégories est le nom de la liste en question.

    Maintenant dans la deuxième liste, j'ai le choix entre 7 listes différentes (catégorie_1, catégorie_2, catégorie_3 etc, qui sont des noms de listes également.)

    SAUF que cette fois dans "validation des données", si je fait :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    =SI($C$12="Tertiaire";catégorie_1;SI($C$12="Industrie";catégorie_2;SI($C$12="Administration publique/semi-publique";catégorie_3;$A$21... etc etc
    ça ne marche pas car je suis limitée sur le nombre de "SI" ....

    J'ai farfouillé un peu sur les forums, je me creuse les méninges depuis un ptit bout de temps mais... sans succès malheureusement !

    Comment contourner ce problème ???? Avez-vous des idées ?
    Au secours !!!

  2. #2
    Expert éminent Avatar de mercatog
    Homme Profil pro
    Inscrit en
    Juillet 2008
    Messages
    9 435
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations forums :
    Inscription : Juillet 2008
    Messages : 9 435
    Par défaut
    Question dans section vba, réponse en conséquence
    J'ai fais un classeur test avec les plages nommées dans la même feuille suivantes:
    listecategories: plage de 7 cellules en colonne comprenant les nominations des types de catégories
    CAT1, CAT2...CAT7: plages chacune contenant les données de chaque type

    en C12 Liste de validation classique: avec dans source =LISTECATEGORIES
    en D12 on va créer, par vba, une liste de validation en tenant compte du choix de fait dans C12 (première liste de validation).
    Dans l'évènement Change de la feuille
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    Option Explicit
    Private Sub Worksheet_Change(ByVal Target As Range)
    Dim c As Range
    Dim m As Byte
    If Target.Address = "$C$12" Then
        Application.EnableEvents = False
        On Error Resume Next
        With Range("D12")
            .Validation.Delete
            .ClearContents
        End With
        If Target.Value <> "" Then
            Set c = [listecategories].Find(Target.Value, lookat:=xlWhole)
            m = c.Row - [listecategories].Row + 1
            Set c = Nothing
            Range("D12").Validation.Add Type:=xlValidateList, Formula1:="=CAT" & m
        End If
        On Error GoTo 0
        Application.EnableEvents = True
    End If
    End Sub
    PS: je préfère ne pas travailler avec les accents dans les noms de plage

  3. #3
    Membre averti
    Inscrit en
    Juin 2010
    Messages
    34
    Détails du profil
    Informations forums :
    Inscription : Juin 2010
    Messages : 34
    Par défaut
    Ouille !!!! J'aurais peut-être du réfléchir deux fois avant de poster un sujet dans le premier forum ou apparait le nom "Excel", en effet ! Mea Culpa !!

    Bon j'ai tout de même essayé ta solution en appelant ma liste comme toi, puis mes listes de catégories "categorie1" "categorie2" etc etc

    Comme ça pas d'accent (et CAT il voulait pas à cause d'un pb de conflit)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    Option Explicit
    Private Sub Worksheet_Change(ByVal Target As Range)
    Dim c As Range
    Dim m As Byte
    If Target.Address = "$C$12" Then
        Application.EnableEvents = False
        On Error Resume Next
        With Range("C13")
            .Validation.Delete
            .ClearContents
        End With
        If Target.Value <> "" Then
            Set c = [listecategories].Find(Target.Value, lookat:=xlWhole)
            m = c.Row - [listecategories].Row + 1
            Set c = Nothing
            Range("C13").Validation.Add Type:=xlValidateList, Formula1:="=categorie" & m
        End If
        On Error GoTo 0
        Application.EnableEvents = True
    End If
    End Sub
    Sauf que ça ne change rien dans la cellule C13, pas de liste déroulante... Comme si rien ne se passait...

    Le problème vient-il de Sub "Worksheet_Change" --> ça veut bien dire qu'il faut que je change de feuille pour démarrer la macro ?

    N'y a-t-il pas moyen que la liste en C13 se crée dès qu'on à fait un choix dans C12 (ou qu'elle soit présente tout le temps?)

    Et "Option Explicit" ça veut dire quoi ?






    ... et sinon, n'y a-t-il pas une solution simplissime sans VBA

    Merci beaucoup pour ton aide !

  4. #4
    Expert éminent Avatar de mercatog
    Homme Profil pro
    Inscrit en
    Juillet 2008
    Messages
    9 435
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations forums :
    Inscription : Juillet 2008
    Messages : 9 435
    Par défaut
    Bonjour
    Dans le module de Ta feuille, les code est mis (évènement change), ce qui veut dire à chaque changement d'une cellule (ou plage de cellules) de la feuille, le code est exécuté automatiquement.
    dans ton cas, changement de la valeur de la cellule C12.
    La solution que j'avais proposé, je l'avais testé et elle fonctionne.
    Reste à savoir! si tu as nommé les plages convenablement (y compris listecategories)...
    Quitte à joindre un extrait de ton fichier pour essayer de dépanner.

    Vous force à déclarer toutes les variables utilisées dans le code.

  5. #5
    Membre averti
    Inscrit en
    Juin 2010
    Messages
    34
    Détails du profil
    Informations forums :
    Inscription : Juin 2010
    Messages : 34
    Par défaut
    Voici un exemple !
    Dans mon vrai fichier la feuille "Listes" est masquée, est-ce que cela change qqch ?
    Fichiers attachés Fichiers attachés

  6. #6
    Expert éminent Avatar de mercatog
    Homme Profil pro
    Inscrit en
    Juillet 2008
    Messages
    9 435
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations forums :
    Inscription : Juillet 2008
    Messages : 9 435
    Par défaut
    Bien sûr on ne se comprend pas
    Dans ton éditeur vba
    tu double clique (à gauche) sur Feuil1 (Feuil2)
    tu y mets le code

    Tu as mis le code dans Module1 alors que c'est code événementiel de la feuille.

    J'ai testé dans ton fichier, pas de panique, il faut seulement mettre le code à sa place.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 9
    Dernier message: 21/10/2014, 18h08
  2. liste en fonction du résultat d'une autre liste
    Par redbull681 dans le forum Macros et VBA Excel
    Réponses: 5
    Dernier message: 10/10/2010, 16h45
  3. Réponses: 5
    Dernier message: 19/05/2009, 09h20
  4. Réponses: 3
    Dernier message: 24/05/2007, 11h23
  5. Réponses: 1
    Dernier message: 20/03/2007, 08h58

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo