Excel/VBA - Créer un "UserForm" dynamique

Résolu
hevy75 -  
 grubanas -
Bonjour,

J'ai fait le tour de quelques forum, chercher dans cette inépuisable source de renseignement qu'est la rubrique d'aide de Microsoft Excel... et je n'ai pas

trouvé de réponse a mes questions.
Donc voila mon interrogation :

J'utilise Excel 2003 et ai quelques bonnes connaissances en VBA

=> Je souhaiterais creer un userform me servant d'interface à la consultation d'un catalogue (imaginons des habits).
Mon souhait serait de pouvoir depuis une liste de données rendre la consultation d'un article possible sur le userform.

- Les données sont ordonnées en colonnes comme suit :
Type d'article | modèle | Description | Prix

- Les données se présentent de la facon suivante (en ligne) :
Gant | Gant en Cuir | cuir de vache | 40€
Gant | Gant de ski | Pour les grand froid | 50€
Bonnet | Bonnet en laine | Vert à pois touge | 20€
Bonnet | Bonnet en polaire | Avec Cache oreille | 15€

- Le userform aurait plusieurs champs sous la forme suivante :
2 listes à choix unique :
1/ liste de choix avec le type d'article (Ex : Gant | Bonnet | Echarpe)
2/ liste de choix avec le modéle de l'article ( ex : Gant en Cuir | Gant de Ski | Gant noir)
RQ : Cette liste serait construite en fonction de la valeur selectionnées dans la première liste - "Type d'article"
3/ Label avec l'affichage de la description (non modifiable)
4/ Lable avec l'affichage du prix (non modifiable)

J'arrive a créer le formulaire dans l'editeur VBA, les différents controleurs (ListBox & Label), attribuer les valeurs à mes listBox, mais a partir de la commence l'étendue de mon ignorance...

1/ Comme modifier les valeurs dans ma 2eme listbox en fonction de la selection dans la 1ère (ex : Gant => Choix parmis les differents type de gant uniquement) ?

2/ Comment Afficher la description et le prix dans les lable en fonction des choix dans la 1ère et 2ème listbox :
1ère lsitbox : "Gant"
2éme listbox : "Gant en cuir"
Label1 : Affichage de "cuir de vache"
Label2 : Affichage de "40€"

Si vous savez comment faire, et je sais que vous devez le savoir ;-), merci de me donner quelques pistes.
Je pense que d'autres questions viendront au fur et a mesure que j'avancerais dans mon usine a gaz...

Si mon explication n'est pas assez clair, n'hésitez pas à me le dire j'essayerais d'etayer un peu l'explication.

Merci d'avance de votre aide.

4 réponses

  1. pijaku Messages postés 13513 Date d'inscription   Statut Modérateur Dernière intervention   2 773
     
    Salut,
    Voici les codes VBA te permettant de réaliser cela. Je les ai commenté pour plus de compréhension.
    'Cette procédure s'exécute lorsque s'initialise l'UserForm 
    Private Sub UserForm_Initialize() 
    'Remplir la ComboBox1 sans doublons 
    'sources : 
    'http://www.excel-downloads.com/forum/83545-vba-remplir-une-combobox-sans-doublon.html 
    Dim i As Integer 
    For i = 1 To Sheets("Feuil1").Range("A65536").End(xlUp).Row 
        ComboBox1 = Sheets("Feuil1").Range("A" & i) 
        If ComboBox1.ListIndex = -1 Then ComboBox1.AddItem Sheets("Feuil1").Range("A" & i) 
    Next i 
    'mise à zéro des contrôles 
    ComboBox1 = "" 
    ComboBox2.Clear 
    Label1.Caption = "" 
    Label2.Caption = "" 
    End Sub 
    
    'Cette procédure s'exécute lorsque la valeur de Combobox1 change 
    Private Sub ComboBox1_Change() 
    'remplir la ComboBox2 
    'Ici le test dit que si la donnée en colonne A = valeur combobox1 
    'Alors on insère la valeur contenue colonne B dans combobox2 
    'Et comme la Combobox1, on enlève les doublons... 
    ComboBox2.Clear 
    For i = 1 To Sheets("Feuil1").Range("B65536").End(xlUp).Row 
        If Sheets("Feuil1").Range("A" & i) = ComboBox1.Value Then 
            ComboBox2 = Sheets("Feuil1").Range("B" & i) 
            If ComboBox2.ListIndex = -1 Then ComboBox2.AddItem Sheets("Feuil1").Range("B" & i) 
        End If 
    Next i 
    ComboBox2 = "" 
    Label1.Caption = "" 
    Label2.Caption = "" 
    End Sub 
    
    'Cette procédure s'exécute lorsque la valeur de Combobox2 change 
    Private Sub ComboBox2_Change() 
    Dim i As Integer 
    For i = 1 To Sheets("Feuil1").Range("A65536").End(xlUp).Row 
        'Si le contenu de la col A est égal à Combobox1 
        If Sheets("Feuil1").Range("A" & i) = ComboBox1.Value Then 
            'Et si le contenu de la colonne B est égal à combobox2 
             If Sheets("Feuil1").Range("B" & i) = ComboBox2.Value Then 
                Label1.Caption = Sheets("Feuil1").Range("C" & i).Value 
                Label2.Caption = Sheets("Feuil1").Range("D" & i).Value 
             End If 
        End If 
    Next i 
    End Sub

    Ce code est à adapter, bien sur le nom de la feuille, des colonnes etc...

    Et en prime un fichier exemple

    Cordialement,
    -- Il n'y a rien de tel qu'une question idiote, seulement une réponse idiote. A.Einstein --
    4
  2. eriiic Messages postés 24581 Date d'inscription   Statut Contributeur Dernière intervention   7 281
     
    Bonjour,

    rapidement car je pars ou boulot.
    Nomme une feuille 'Listes' et celle des données 'Datas'
    Avec Listes!A1 qui contient l'article tu peux te fabriquer une liste des modèles avec :
    Sub fabListe()
        Dim shDatas As Worksheet, shListes As Worksheet, i As Long
        Set shDatas = Worksheets("Datas")
        Set shListes = Worksheets("listes")
        shListes.Range("2:65536").EntireRow.Delete
        For i = 2 To shDatas.[A65536].End(xlUp).Row
            If shDatas.Cells(i, 1) = shListes.[A1] Then
                'soit inscription du n° de ligne dans datas
                'shListes.[A65536].End(xlUp).Offset(1, 0) = i
                'soit copie du modèle
                'shDatas.Cells(i, 2).Copy Destination:=shListes.[A65536].End(xlUp).Offset(1, 0)
                'soit copie de la ligne
                shDatas.Rows(i).EntireRow.Copy Destination:=shListes.[A65536].End(xlUp).Offset(1, 0)
            End If
        Next i
    End Sub

    Ensuite en te servant de l'index de sélection tu récupères (ou calcule, selon le choix fait) ton n° de ligne tu peux récupérer une donnée avec :
    nom_de_la_feuille.cells(n°ligne,4) pour le prix par exemple

    eric
    1
  3. hevy75
     
    Merci bcp, Je pense que cela va bcp m'aider... j'ai essayer rapidement et ca repond a ce que je veux faire.
    Merci ... merci... & merci
    0
  4. grubanas
     
    Bonjour,

    Je recherche depuis plusieurs jours la solution VBA (novice) pour mon TCD.

    Base externe de donnée qui se met à jour en cliquant sur Actualiser.

    J'ai tout d'abord fait 2 TCD d'échéances sur le meme onglet : un Client l'autre Fournisseur. J'ai filtré à la semaine afin que l'on puisse suivre les règlements à réaliser ou à encaisser.

    Je souhaiterai que les lignes de chacun des TCD dont les montants :
    Somme de MontantDev=Somme de MontantRglDev (donc soldée) soient masquées.

    J'ai trouvé beaucoup de forum pour masquer une cellule à 0 mais moi au contraire se sont celles que je veux conserver.

    Exemple de mes TCD (qui ont tous les deux les mêmes champs

    A B C
    DateEchéance - Somme de MontantDev - Somme de MontantRglDev

    15/07/2014
    4118012000 122.74 € 122.74 € [LIGNE A MASQUER]
    (Compte client ou Fournisseur) suivi des montants dû et réglé
    16/07/2014 523 € - €
    17/07/2014 1 300 € 500 €

    Merci pour votre aide.
    0