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 :

[VBA-E]Listes Imbriquées : comment optimiser?


Sujet :

Macros et VBA Excel

  1. #1
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 3
    Points : 1
    Points
    1
    Par défaut [VBA-E]Listes Imbriquées : comment optimiser?
    Bonjour à tous,


    Je travaille en ce moment sur une Macro en VBA et j'aimerais utiliser des listes de choix dépendantes les unes des autres.

    Au départ, il faut savoir que les données source de mes listes se trouvent dans un tableau à 3 dimensions.

    Pour l'instant, j'utilise un système un peu batard comme cela :

    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
    22
    23
    24
    25
    26
    27
    28
    29
    30
    Sub Plage()
     
    For NbFamille = 1 To 30
       If Tableau_OC(0, NbFamille, 1) <> "" Then
       Worksheets("BDD").Cells(NbFamille, 1).Value = Tableau_OC(0, NbFamille, 1)
       NbFMax = NbFamille
       End If
    Next NbFamille
     
    ActiveWorkbook.Names.Add Name:="Famille", RefersToR1C1:="=BDD!R1C1:R" & CStr(NbFMax) & "C1"
     
    Sheets("AffectationOC").Select
     
    Cells(1, 1).Select
     
         With Selection.Validation
            .Delete
            .Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, Operator:= _
            xlBetween, Formula1:="=Famille"
            .IgnoreBlank = True
            .InCellDropdown = True
            .InputTitle = ""
            .ErrorTitle = ""
            .InputMessage = ""
            .ErrorMessage = ""
            .ShowInput = True
            .ShowError = True
        End With
     
    End Sub
    L'idée, c'est que je recopie les données de la ligne (0,x,1) de mon tableau dans une feuille (nommée BDD) et qu'ensuite, je créé la liste à partir des valeurs créées dans cette feuille.

    Ma première question est donc de savoir si il est possible de remplir ma liste de choix directement à partir de mon tableau, et si oui, comment procéder.

    J'ai vu dans l'aide de VBA et sur certains sites que l'on pouvait utiliser des instructions type :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ListBox1.AddItem Machin
    Mais après, je sais pas comment lier les données de ListBox1 à ma cellule...

    Ensuite, la seconde difficulté que je rencontre est la liaison des listes entre elles. Je sais que je peux lier mes données par l'adressage de mon tableau, mais je ne sais pas comment détecter le changement d'état de la cellule "mère".
    Je sais où aller chercher les données de la liste de la cellule "fille" en fonction de celles choisies dans la cellule "mère", mon problème est de savoir quand?

    Y-a-t il donc un moyen simple de détecter un clic sur la cellule mère, ou alors un changement d'état???

    Merci de vos réponses!

  2. #2
    Expert confirmé
    Avatar de zazaraignée
    Profil pro
    Étudiant
    Inscrit en
    Février 2004
    Messages
    3 174
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2004
    Messages : 3 174
    Points : 4 085
    Points
    4 085
    Par défaut
    Salut

    J'ai fait un test avec deux listes déroulantes sur un UserForm.

    Sur la Feuil2 du classeur, j'ai défini quatre listes
    Les cellules A1 à A3 contiennent les valeurs : jours, mois et années. J'ai nommé cette plage "choix".
    Les cellules B1 à B7 contiennent les jours de la semaines. J'ai nommé cette plage "jours".
    Les cellules C1 à C12 contiennent les mois de l'année. J'ai nommé cette plage "mois".
    Les cellules D1 à D11 contiennent les années de 1990 à 2000. J'ai nommé cette plage, devine... oui! "année".

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    Private Sub UserForm_Initialize()
        cboChoix.RowSource = "choix"
    End Sub
     
    Private Sub cboChoix_Change()
        cboChoisi.Clear
        cboChoisi.RowSource = cboChoix.List(cboChoix.ListIndex)
    End Sub

  3. #3
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 3
    Points : 1
    Points
    1
    Par défaut
    Si je me trompe pas, un userform, c'est un bouton que l'on a ajouté à sa feuille de calcul et sur lequel on peut lier une macro?

  4. #4
    Expert confirmé
    Avatar de zazaraignée
    Profil pro
    Étudiant
    Inscrit en
    Février 2004
    Messages
    3 174
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2004
    Messages : 3 174
    Points : 4 085
    Points
    4 085
    Par défaut
    Heu! Non!

    Un UserForm est une boîte de dialogue que tu crées directement dans l'éditeur VBA (le VBE) en cliquant sur Insertion, UserForm (après avoir affiché l'éditeur - Alt + F11).

    Je comprends que tes listes sont directement sur tes feuilles de calcul... ? me tromperais-je? Car ça change un peu les choses.

    On va avoir besoin de plus de détails sur ton projet.

    en attendant, une correction sur le code de tout à l'heure:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    Private Sub cboChoix_Change()
        ' pour prévenir les erreurs
        cboChoisi.ListIndex = -1
        cboChoisi.RowSource = ""
        cboChoisi.Clear
        ' affecte la source à la liste
        cboChoisi.RowSource = cboChoix.List(cboChoix.ListIndex)
    End Sub

  5. #5
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 3
    Points : 1
    Points
    1
    Par défaut
    Pour l'instant, mes listes sont dans un tableau (Tableau_OC dans ma routine plus haut) , mais il est très facile de les mettre sur une feuille excel.

    Clairement, mon tableau contient les données suivantes :
    Donnée source : Famille d'outillage (ex : Tournevis ,Clé Dynamomètrique, Pige, etc...)
    Puis deux paramètres spécifiques à chaque famille.

    Ce que je souhaiterais, c'est que lorsque je choisis la famille des outillages dans une cellule à liste de choix, les listes de choix des deux cellules suivantes soient modifiées en fonction.

    J'avoue que j'ai un peu de mal à me faire à la programmation objet, je suis resté très algorithme à l'ancienne, uniquement à base de boucles, tableaux et pointeurs...

Discussions similaires

  1. Comment créer deux listes imbriquées
    Par selva15 dans le forum ASP.NET
    Réponses: 1
    Dernier message: 26/05/2014, 09h58
  2. Réponses: 2
    Dernier message: 20/08/2009, 20h58
  3. [XL-2003] comment ecrire en vba des boucles imbriquées?
    Par doudou8mc dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 10/07/2009, 15h15
  4. Comment optimiser plusieurs boucles FOR-END imbriquées
    Par totoc1001 dans le forum MATLAB
    Réponses: 26
    Dernier message: 13/05/2007, 17h59
  5. Listing / Comment optimiser cette base de donnée
    Par ds-network dans le forum Requêtes
    Réponses: 3
    Dernier message: 05/02/2007, 09h08

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