Excel/VBA - Créer un "UserForm" dynamique [Résolu/Fermé]

Signaler
-
 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

Messages postés
12251
Date d'inscription
jeudi 15 mai 2008
Statut
Modérateur
Dernière intervention
17 mars 2021
2 605
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
Merci

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

CCM 65492 internautes nous ont dit merci ce mois-ci

Messages postés
24042
Date d'inscription
mardi 11 septembre 2007
Statut
Contributeur
Dernière intervention
3 mai 2021
6 755
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
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
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.