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

Résolu/Fermé
hevy75 - Modifié par hevy75 le 13/09/2010 à 23:43
 grubanas - 16 juil. 2014 à 10:09
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.



A voir également:

4 réponses

pijaku Messages postés 12263 Date d'inscription jeudi 15 mai 2008 Statut Modérateur Dernière intervention 4 janvier 2024 2 743
Modifié par pijaku le 14/09/2010 à 08:39
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
eriiic Messages postés 24569 Date d'inscription mardi 11 septembre 2007 Statut Contributeur Dernière intervention 28 décembre 2023 7 209
14 sept. 2010 à 08:10
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
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
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