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 :

Listes dépendantes et données de validation par liste [XL-2002]


Sujet :

Macros et VBA Excel

  1. #1
    Membre confirmé
    Femme Profil pro
    Développement de produit
    Inscrit en
    Juin 2006
    Messages
    124
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Canada

    Informations professionnelles :
    Activité : Développement de produit
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Juin 2006
    Messages : 124
    Par défaut Listes dépendantes et données de validation par liste
    Bonjour à tous,

    J'ai recherché sur le forum et la FAQ sans succès.
    J'ai trouvé un autre post qui souhaitait faire à peu près la même chose et la solution serait apparemment une combobox. J'ai regardé le tuto associé (http://excel.developpez.com/faq/inde...omboboxCascade) et j'avoue que je ne comprend pas bien comment faire (je n'ai jamais fait de vba). Et surtout je ne pense pas que cela réponde à ma question.

    Dans un tableau, j'ai plusieurs thèmes qui ont des sujets associés.
    Dans un autre tableau, où je liste différentes tâches, j'ai deux colonnes : une pour les thèmes et une pour les sujets. Sur chaque cellule des 2 colonnes, j'ai mis une plage de validation par liste (en prenant les listes associées de thèmes et sujets).
    Lorsque je sélectionne un thème, j'ai une liste déroulante qui me propose les thèmes. J'aimerai que la liste déroulante des sujets ne propose que les sujets associés au thème précédemment choisi.
    Je ne voudrais pas avoir un bouton comme j'ai pu voir dans le tuto.
    Existe-t-il une solution simple ?

    Autre petit problème que je rencontre : la liste déroulante des thèmes me propose également les cellules vides.
    Comment faire pour que la liste ne propose que les cellules où sont écrits les thèmes ? J'ai essayé en fusionnant les cellules, sans succès.

    Auriez-vous des pistes pour m'aider, svp ?
    J'espère avoir été claire dans mes explications. Sinon, au besoin j'ai un fichier d'exemple.

    Merci beaucoup d'avance !
    @ bientôt !

  2. #2
    Membre Expert Avatar de mayekeul
    Inscrit en
    Août 2005
    Messages
    1 369
    Détails du profil
    Informations forums :
    Inscription : Août 2005
    Messages : 1 369
    Par défaut
    bonjour,

    afin de pouvoir mieux t'aider, je ne dirais pas non à un petit fichier d'exemple

  3. #3
    Membre confirmé
    Femme Profil pro
    Développement de produit
    Inscrit en
    Juin 2006
    Messages
    124
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Canada

    Informations professionnelles :
    Activité : Développement de produit
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Juin 2006
    Messages : 124
    Par défaut
    Bien sûr ! Je ne l'avais pas mis au début suivant les conseils de Pierre Fauconier.

    Merci beaucoup d'essayer en tout cas !

    Pour le problème des trous dans la liste déroulante, je pourrais le résoudre en faisant une autre liste à coté si il n'y a pas de solution simple.

    C'est surtout la dépendance des listes déroulantes que je n'arrive pas à faire ...

  4. #4
    Membre Expert Avatar de mayekeul
    Inscrit en
    Août 2005
    Messages
    1 369
    Détails du profil
    Informations forums :
    Inscription : Août 2005
    Messages : 1 369
    Par défaut
    merci

    comme tu n'avais pas encore fait de vba, c'était plus facile pour moi

    alors ci joint, tu trouvera un fichier qui devrais fonctionner comme tu aimerais

    pour plus de facilité, j'ai travaillé avec les plages nommées, j'ai donc un peu changé le fichier de départ (accent entre autres)

    dans l'événement Change de la feuille, j'ai ajouté ceci:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    Private Sub Worksheet_Change(ByVal Target As Range)
    'si on change la valeur d'une cellule dans thème
    If Not Intersect(Target, Range("H26:H46")) Is Nothing Then
        Dim ListName
        On Error Resume Next
        'on récupere le nom et on l'adapte pour qu'il corresponde au nom
        'de la plage nommée
        'on fait cela car les plages nommées ne supportent pas les accents
        ListName = Left(Target, Len(Target) - 2) & Right(Target, 1)
        'ici, on redéfinit la validation de la cellule sujet
        Target.Offset(0, 1).Validation.Modify xlValidateList, , , "=" & ListName
        On Error GoTo 0
    End If
    End Sub
    cela peut ou doit être changé suivant ce que tu désires.
    (si c'est bobn, ben tant mieux!
    (si c'est pas bon... euh ben tu peux demander )

    edit: je rajoute le fichier quand même
    Fichiers attachés Fichiers attachés

  5. #5
    Membre confirmé
    Femme Profil pro
    Développement de produit
    Inscrit en
    Juin 2006
    Messages
    124
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Canada

    Informations professionnelles :
    Activité : Développement de produit
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Juin 2006
    Messages : 124
    Par défaut
    Merci infiniment de ta réponse !!

    Le fichier que tu as joint marche effectivement exactement comme j'aimerai !

    Je suis en train de regarder plus en détail pour bien comprendre et essayer d'en apprendre pour pouvoir le refaire.
    Et je suis un peu perdue ... je n'y connais vraiment rien en vba ... et du coup j'ai quelques questions un peu bête car je manque des bases à mon avis ...
    J'ai essayé de regarder dans les tutos du FAQ, mais j'ai vraiment du mal ...

    Tu me dis que tu as travaillé avec des plages nommées. Ok. J'ai vu comment tu avais nommé la liste des Thème sur le 2ème onglet. Mais je ne retrouve pas ce nom dans le code ...
    J'aimerai vraiment comprendre le code pas à pas (pour ne pas dire mot à mot) pour savoir le refaire toute seule et l'appliquer à d'autres fichiers.

    Merci encore d'avance pour ta patience et explications.

  6. #6
    Membre Expert Avatar de mayekeul
    Inscrit en
    Août 2005
    Messages
    1 369
    Détails du profil
    Informations forums :
    Inscription : Août 2005
    Messages : 1 369
    Par défaut
    bonjour,
    Tu me dis que tu as travaillé avec des plages nommées. Ok. J'ai vu comment tu avais nommé la liste des Thème sur le 2ème onglet. Mais je ne retrouve pas ce nom dans le code ...
    Non effectivement, je l'ai nommé pour pouvoir y acceder(les validations dans la colonne "Thème") à partir d'une autre feuille. sinon excel ne le permettrais pas! j'ai aussi nommé quatre liste ("Theme1","Theme2","Theme3","Theme4") qui correspondent respectivment au listes "Sujets"
    donc l'idée est d'appliquer une liste de validation à une cellule B suivant la valeur d'une cellule A. On fait donc d'abord en sorte que les noms des listes en cellules B Correspondent à un nom de la liste disponible en cellule A.
    Dans l'exemple ce n'est pas vrai à 100% à cause des espaces(les espaces sont interdit pour les noms de listes. on devra donc ici retravailler le nom pour qu'iil corresponde à 100%. Si les noms de la liste "ListeTheme" avaient été (Theme1","Theme2","Theme3","Theme4") en place de Theme 1","Theme 2","Theme 3","Theme 4"), cela eu été plus facile ).

    explication du code:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    Private Sub Worksheet_Change(ByVal Target As Range)
        If Not Intersect(Target, Range("H26:H46")) Is Nothing Then
    Ici, on lui dis que si la cellule qui est modifiée se trouve dans la plage ("H26:H46") alors on applique la suite

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
        Dim ListName as string
        On Error Resume Next
        ListName = Left(Target, Len(Target) - 2) & Right(Target, 1)
    On commence par définir une variable texte "ListName"
    puis on l'informe de ne pas prendre en compte les lignes suivantes en cas d'erreur (utile si tu efface la données dans la cellule)
    enfin, on attribue à la variable une données. on reprends la valeur de la cellule modifiée ("Target") afin que du stade "Theme 1" elle prenne la valeur "Theme1". A noter que le code suivant eu été plus simple
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ListName=replace(Target," ","")
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Target.Offset(0, 1).Validation.Modify xlValidateList, , , "=" & ListName
    Alors, ici, c'est la ligne qui fait ce que tu attendais. On informe que la validation de la cellule qui est à coté(".offset(0,1)" -> décalage de 0 ligne et une colonne) de celle qui vien d'être modifiée ("Target") doit être modifié pour correspondre à la liste nommée "ListName" (dans notre exemple "Theme1" donc)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
        On Error GoTo 0
    End If
    End Sub
    Pour terminer, on leve la gestion es erreurs, on cloture la condition et la procédure.

    tu as une procédure change pour chaque feuille présente dans ton classeur.
    cette prodédure se lance dès qu'un changement survient dans la feuille et est donc propre à chacune d'entre elles.


    voilà un peu en gros.
    en espèrant avoir été clair et avoir pu t'aider

    Mayekeul

  7. #7
    Membre confirmé
    Femme Profil pro
    Développement de produit
    Inscrit en
    Juin 2006
    Messages
    124
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Canada

    Informations professionnelles :
    Activité : Développement de produit
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Juin 2006
    Messages : 124
    Par défaut
    Bonjour,

    Merci beaucoup Mayekeul pour ta patience et tes explications détaillées ! Je commence à y voir beaucoup plus clair !
    J'aurais quelques petites questions pour bien tout comprendre :

    Citation Envoyé par mayekeul Voir le message
    Dans l'exemple ce n'est pas vrai à 100% à cause des espaces(les espaces sont interdit pour les noms de listes. on devra donc ici retravailler le nom pour qu'iil corresponde à 100%. Si les noms de la liste "ListeTheme" avaient été (Theme1","Theme2","Theme3","Theme4") en place de Theme 1","Theme 2","Theme 3","Theme 4"), cela eu été plus facile ).
    Dans mon fichier de travail, le nom des thèmes ne comporte ni accents ni espaces, il s'agit un simple mot (ie : Divers, Etudes, Accessoires, etc.)

    J'ai donc renommé les plages de sujets avec le nom correspondant au thème. Dans le nom de mes sujets par contre, j'ai des espaces et des accents. Mais si j'ai bien compris ici, cela ne pose pas de problème pour les sujets.

    J'ai créé une liste des thèmes sur la même feuille (plus à droite) pour éviter d'avoir des espaces dans la liste de validation (au lieu d'une feuille à part).

    Je comprends l'ensemble du code (grâce à tes explications , merci beaucoup), mais il y a encore quelque chose qui m'échappe.
    Pourquoi dans le code, on ne voit pas apparaître aucun nom des plages nommées ?

    Citation Envoyé par mayekeul Voir le message
    Alors, ici, c'est la ligne qui fait ce que tu attendais. On informe que la validation de la cellule qui est à coté(".offset(0,1)" -> décalage de 0 ligne et une colonne) de celle qui vien d'être modifiée ("Target") doit être modifié pour correspondre à la liste nommée "ListName" (dans notre exemple "Theme1" donc)
    Je saisi bien que lorsque la cellule en H est modifiée, la cellule en I l'est aussi.
    Mais comment le code sait quelle liste de sujets va avec quel thème ?

    Citation Envoyé par mayekeul Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
           ListName = Left(Target, Len(Target) - 2) & Right(Target, 1)
    enfin, on attribue à la variable une données. on reprends la valeur de la cellule modifiée ("Target") afin que du stade "Theme 1" elle prenne la valeur "Theme1".
    Si j'ai bien compris : on attribue à la variable ListName une donnée venant de la cellule Target qui se trouve dans la colonne H. La variable prend alors la valeur modifiée. C'est ça ?
    J'ai un peu de mal à saisir la ligne. Cela vient sûrement du fait que je suis totalement ignorante de vba et que je ne comprend pas la signification de "Left(Target, Len(Target) - 2) & Right(Target, 1)" ... Désolée pour mon ignorance ...

    J'ai recopié le code, en modifiant la plage de la colonne H (qui est beaucoup plus importante dans le fichier de travail. Mais ça ne marche pas encore. il y a peut être quelque chose que je ne fait pas ?

    Merci encore pour ton aide.

  8. #8
    Membre Expert Avatar de mayekeul
    Inscrit en
    Août 2005
    Messages
    1 369
    Détails du profil
    Informations forums :
    Inscription : Août 2005
    Messages : 1 369
    Par défaut
    Citation Envoyé par Lola21 Voir le message
    J'ai donc renommé les plages de sujets avec le nom correspondant au thème. Dans le nom de mes sujets par contre, j'ai des espaces et des accents. Mais si j'ai bien compris ici, cela ne pose pas de problème pour les sujets.
    tu as bien compris

    J'ai créé une liste des thèmes sur la même feuille (plus à droite) pour éviter d'avoir des espaces dans la liste de validation (au lieu d'une feuille à part).
    il n'y as pas de problèmes, c'est comme tu préfères

    Je comprends l'ensemble du code (grâce à tes explications , merci beaucoup), mais il y a encore quelque chose qui m'échappe.
    Pourquoi dans le code, on ne voit pas apparaître aucun nom des plages nommées ?
    Simplement parce qu’il n’y en a pas besoin.
    Le nom des plages nommées sont défini à l’avance dans excel et le changement de valeur pour un theme défini la liste disponible pour les sujets. Liste qui porte peu ou prou le m^me nom que la valeur attribuée dans theme.

    Je saisi bien que lorsque la cellule en H est modifiée, la cellule en I l'est aussi.
    Mais comment le code sait quelle liste de sujets va avec quel thème ?
    Comme je le dis plus haut dans sujets, tu choisis par exemple « Theme1 » en H26 alors la nom de la liste de validation de la cellule I26 est « Theme1 »

    Si j'ai bien compris : on attribue à la variable ListName une donnée venant de la cellule Target qui se trouve dans la colonne H. La variable prend alors la valeur modifiée. C'est ça ?
    oui, mais elle n'est nécessaire qu'en cas de discordance
    J'ai un peu de mal à saisir la ligne. Cela vient sûrement du fait que je suis totalement ignorante de vba et que je ne comprend pas la signification de "Left(Target, Len(Target) - 2) & Right(Target, 1)"
    Je décompose la ligne
    Left(target,len(target)-2)
    Veux dire : renvoie en commençant de la gauche la valeur de target pour une longueur de la longueur de target moins 2
    Right (target,1) veux dire :
    Renvoie en commençant de la droite le valeur de target pour une longueur de 1
    Le sigle & lui dis de concatener tout cela
    Dans notre exemple ListName n’existe que si il y a discordance entre les valeurs de la liste des themes et les nom de liste de sujets

    ci dessous le même code si il y a concordance
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    Private Sub Worksheet_Change(ByVal Target As Range)
    'on suppose que les noms des listes de validation
    'correspondent à 100% aux valeurs de la liste des thèmes
    'si on change la valeur d'une cellule dans thème
    If Not Intersect(Target, Range("H26:H46")) Is Nothing Then
        Dim ListName
        On Error Resume Next
        'ici, on redéfinit la validation de la cellule sujet
        Target.Offset(0, 1).Validation.Modify xlValidateList, , , "=" & Target.Text
        On Error GoTo 0
    End If
     
    End Sub
    J'ai recopié le code, en modifiant la plage de la colonne H (qui est beaucoup plus importante dans le fichier de travail. Mais ça ne marche pas encore. il y a peut être quelque chose que je ne fait pas ?
    N’oublie pas de faire tout correspondre dasn le code la plage "H26:H46" et si cela deviens plus dynamiques le code devrais alors changer en conséquence

  9. #9
    Membre confirmé
    Femme Profil pro
    Développement de produit
    Inscrit en
    Juin 2006
    Messages
    124
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Canada

    Informations professionnelles :
    Activité : Développement de produit
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Juin 2006
    Messages : 124
    Par défaut
    Merci beaucoup encore pour tes explications Mayekeul !!

    Maintenant je comprend mieux !
    (il faudra quand même que je me penche plus sur vba ...)

    Par contre, je n'arrive toujours pas à le faire marcher sur le fichier de travail ...
    Excuse-moi de t'embêter encore ...

    J'ai modifié mon fichier de travail pour le rendre plus lisible : j'ai séparé la partie des tables et listes et celle de calcul des statistiques qui est indépendante.
    La plage des thèmes est va en réalité "H68:Hxx", sachant que le nombre de lignes peut s'agrandir au fil des jours de l'année.
    J'ai donc modifié en conséquence les chiffres dans le code.

    Mais ça ne marche pas ... Je sélectionne bien des thèmes sur la colonne H, mais sur les listes déroulantes de I j'ai toujours tous les sujets proposés.

    Mon erreur viendrait des données de validations ? Les données de validation sont celles des tables indiquées plus haut dans la feuille.
    N’oublie pas de faire tout correspondre dasn le code la plage "H26:H46" et si cela deviens plus dynamiques le code devrais alors changer en conséquence
    Mon erreur viendrait de là ? Je ne comprend pas bien ...

    Merci encore pour ta patience et expertise.

    Edit : je joins le fichier modifié avec ma tentative de reécrire le code sans succès ...
    Fichiers attachés Fichiers attachés

  10. #10
    Membre Expert Avatar de mayekeul
    Inscrit en
    Août 2005
    Messages
    1 369
    Détails du profil
    Informations forums :
    Inscription : Août 2005
    Messages : 1 369
    Par défaut
    tu y es presque

    tu n'as simplement pas compris deux choses

    d'abord la variable ListName et sa définition dans le code n'est nécessaire qu'en cas de non correspondance

    dans le derniers fichier, les noms correspondent bien donc...
    on l'enleve
    ce qui nous donnera
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Private Sub Worksheet_Change(ByVal Target As Range)
    If Not Intersect(Target, Range("H68:H115")) Is Nothing Then
        On Error Resume Next
        Target.Offset(0, 1).Validation.Modify xlValidateList, , , "=" & Target.Text
        On Error GoTo 0
    End If
    End Sub
    ensuite, le code que je te donne doit se trouver non pas dans une module mais dans l'événement change de la feuille (ici "SR")
    alors pour se faire
    dans vba tu double que sur Feuil2 (SR) ou tu clique à droite et demande "view code" ( si c'est en français chez toi... ben l'équivalent )
    dans la partie gauche tu a deux menut déroulant au dessus
    dans le premier tu choisi "Worksheet" et dans le second "Change"
    tu auras ça
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    Private Sub Worksheet_Change(ByVal Target As Range)
     
    End Sub
    tu copie le code ci dessous

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    If Not Intersect(Target, Range("H68:H115")) Is Nothing Then
        Dim ListName
        On Error Resume Next
        Target.Offset(0, 1).Validation.Modify xlValidateList, , , "=" & Target.Text
        On Error GoTo 0
    End If
    et tu le colle entre les deux lignes pour obtenir
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    Private Sub Worksheet_Change(ByVal Target As Range)
    If Not Intersect(Target, Range("H68:H115")) Is Nothing Then
        Dim ListName
        On Error Resume Next
        Target.Offset(0, 1).Validation.Modify xlValidateList, , , "=" & Target.Text
        On Error GoTo 0
    End If
    End Sub
    et ça devrais fonctionner

  11. #11
    Membre confirmé
    Femme Profil pro
    Développement de produit
    Inscrit en
    Juin 2006
    Messages
    124
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Canada

    Informations professionnelles :
    Activité : Développement de produit
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Juin 2006
    Messages : 124
    Par défaut
    INFINIMENT !!!

    ça y est, ça marche !!!

    Effectivement, je m'étais un peu emmêlée les pinceaux et je n'avais pas du tout compris où écrire le code !

    J'ai vraiment beaucoup à apprendre encore sur vba ... pour ma défense je dirais que c'était la première fois que j'essayais de faire du vba ...

    Merci beaucoup en tout cas Mayekeul pour ta patience et tes explications ! Maintenant ça marche comme je le voulais dans mon fichier ! Je suis super contente !

    Merci encore et à bientôt !

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

Discussions similaires

  1. E-mail avec données excell selectionnées par liste déroulante
    Par jooris dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 21/03/2012, 02h39
  2. Réponses: 3
    Dernier message: 24/11/2008, 14h09
  3. Réponses: 0
    Dernier message: 15/03/2008, 22h11
  4. Validation des données par liste
    Par Niagala dans le forum Excel
    Réponses: 4
    Dernier message: 10/11/2007, 10h11
  5. zone de liste dépendante d'une autre zone de liste
    Par popof60 dans le forum Access
    Réponses: 3
    Dernier message: 30/03/2007, 15h28

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