Fichier Combolistbox de mDF

Marco60

XLDnaute Occasionnel
Bonsoir le forum,
Je viens vers vous ce soir avec un fichier joint de mDF.

En fait, et malgré ses explications, je ne comprends pas tout le code.

Une autre chose que je ne comprends pas :

Comment est approvisionnée la ComboBox de l'USF???

Donc, si quelqu'un peut prendre quelques minutes pour m'expliquer tout cela en détail, ce serait sympa.

Merci de votre aide

Marc [file name=Combolistbox.zip size=16806]http://www.excel-downloads.com/components/com_simpleboard/uploaded/files/Combolistbox.zip[/file]
 

Pièces jointes

  • Combolistbox.zip
    16.4 KB · Affichages: 28

myDearFriend!

XLDnaute Barbatruc
Bonsoir Marco60, le Forum,

Tout d'abord, je vais commencer par le plus facile :) , la ComboBox est chargée grâce à sa propriété Rowsource, dans la procédure suivante (dans le module de code de la Feuil1 :
Private Sub CommandButton1_Click()
      U1.ComboBox1.RowSource = 'feuil2!a2:a' & Feuil2.Range('a65536').End(xlUp).Row
      U1.Show
End Sub
Pour la suite, tu l'auras compris, tout se déroule dans la procédure évènementielle ComboBox1_Change() du module de code de l'USF :
Private Sub ComboBox1_Change()
Dim TabTemp As Variant
Dim
L As Long
      'Charge les données dans un tableau variant temporaire
1   With Sheets(1)
            L = .Range('A65536').End(xlUp).Row
            TabTemp = .Range(.Cells(2, 1), .Cells(L, 5)).Value
      End With
      'Mise à jour de la liste
      With ListBox1
2           'RAZ
            .Clear
3           'Pour chaque ligne de la base
            For L = 1 To UBound(TabTemp)
                  'Si la catégorie correspond au choix
                  If TabTemp(L, 5) = ComboBox1.Value Then
4                       'Ajout d'une ligne supplémentaire dans la liste
                        .AddItem TabTemp(L, 1)
                        'Mise à jour des élémnents en colonnes
                        For c = 1 To 3
                              .List(.ListCount - 1, c) = TabTemp(L, c + 1)
                        Next c
                  End If
            Next L
      End With
End Sub
Cet évènement Change() se déclenche lorsque l'utilisateur fait un choix dans la ComboBox. Le code de cette procédure a pour unique objectif de mettre à jour le contrôle ListBox1 qui devra représenter l'ensemble des lignes de données correspondant à la catégorie sélectionnée.
[ol][li]L'ensemble des données de la Feuil1 (sauf les titres) sont chargées dans un tableau variant à 2 dimensions nommé TabTemp de 5 colonnes et autant de lignes L qu'il y a de lignes de données dans le tableau.[/li]

[li]Le contenu de la ListBox est effacé (méthode Clear).[/li]

[li]Ensuite, on parcourt chaque ligne du tableau variant (For L = 1 to Ubound(TabTemp)) :
Si l'élément en colonne 5 (TabTemp(L,5)) correspond à la catégorie sélectionnée (ComboBox1.value),
alors, on ajoute la ligne dans la ListBox.[/li]

[li]Pour alimenter la ListBox multicolonnes (4 colonnes) :
- On ajoute d'abord un élément par la méthode AddItem (élément qui correspondra à la première colonne de la ListBox)
- Ensuite on affectera les valeurs souhaitées aux 3 colonnes suivantes (For c = 1 To 3) grâce à la propriété List(ligne, colonne) propre à ce contrôle. Attention toutefois, l'index de ligne et colonne commence ici à 0 et non à 1.[/li][/ol]
Voilà, j'espère avoir pu t'aider un peu à comprendre le code utilisé ici...

Cordialement,

Message édité par: myDearFriend!, à: 03/04/2006 22:32
 

Marco60

XLDnaute Occasionnel
Bonsoir mDF, re le forum,

Je te remercie grandement pour tes explications et cela me paraît plus clair maintenant.

Seulement, lorsque que j'adapte ton code à mon appli, rien ne s'affiche dans la listbox.

Et là, je me dis que je n'ai pas dû tout comprendre!!!

Je joins la partie de mon fichier qui correspond à ton code.

Merci encore pour ton aide et désolé d'abuser.

Marc [file name=Infos_20060403231631.zip size=28223]http://www.excel-downloads.com/components/com_simpleboard/uploaded/files/Infos_20060403231631.zip[/file]
 

Pièces jointes

  • Infos_20060403231631.zip
    27.6 KB · Affichages: 17

myDearFriend!

XLDnaute Barbatruc
Re Marco,

Tu peux essayer de modifier les procédures ci-dessous comme indiqué (en gras) :
Private Sub N°_Proforma_Change()
Dim TabTemp As Variant
Dim
L As Long
      'Charge les données dans un tableau variant temporaire
      With Sheets('Détails PROFORMA')
            L = .Range('A65536').End(xlUp).Row
            TabTemp = .Range(.Cells(2, 1), .Cells(L, 9)).Value
      End With
      'Mise à jour de la liste
      With Résultats
            'RAZ
            .Clear
            'Pour chaque ligne de la base
            For L = 1 To UBound(TabTemp)
                  'Si la catégorie correspond au choix
                  If CStr(TabTemp(L, 2)) = N°_Proforma.Value Then
                        'Ajout d'une ligne supplémentaire dans la liste
                        .AddItem TabTemp(L, 1)
                        'Mise à jour des élémnents en colonnes
                        For c = 1 To 8
                              .List(.ListCount - 1, c) = TabTemp(L, c + 1)
                        Next c
                  End If
            Next L
      End With
End Sub
Private Sub
UserForm_Initialize()
      With Résultats
            .ColumnCount = 9
            .ColumnWidths = '2cm;4cm;3cm;5cm;3cm;4cm;3cm;7cm;4cm'
      End With

      ' A placer ici plutôt que dans la procédure DropButtonClick()...!
      Worksheets('Détails PROFORMA').Select
      N°_Proforma.RowSource = 'B2:' & Range('B2').End(xlDown).Address

End Sub
Pour la ligne :
If CStr(TabTemp(L, 2)) = N°_Proforma.Value Then
il faut comprendre que tes références Proforma sont, dans la feuille au format Numérique et dans ta ComboBox au format Texte (dans une ComboBox ou une ListBox, les données sont toujours au format Texte). Tu ne peux donc comparer les 2 valeurs avec des formats différents. En ajoutant CStr() devant le TabTemp, tu vas donc le convertir en chaîne de caractères afin de permettre cette comparaison.
Il aurait également été possible de faire l'inverse, c'est à dire :
If TabTemp(L, 2) = Val(N°_Proforma.Value) Then
afin de comparer des valeurs strictement numériques.

Cordialement,
 

Marco60

XLDnaute Occasionnel
Re mDF,
J'ai changé dans mon fichier global ce que tu m'as suggéré, et ça marche impeccable.

Je n'ai pas bien compris le ' For c 1 to 8' alors que j'ai 9 colonnes.
J'ai aussi mis le code rowsource de la combobox à l'endroit que tu m'as indiqué mais sans succès.

Je l'ai donc laissé à DropButtonClick().

Je te remercie encore pour le temps que tu as passé sur mon problème et pour ta pédagogie.

A+

Marc
 

myDearFriend!

XLDnaute Barbatruc
Re M60 ;) ,

On va pas arrêter là, si près du but... :)

Ta ListBox comprend 9 colonnes, et comme je le précise plus haut, ces 9 colonnes sont indexées à partir de 0 (et non de 1).

[ol][ul][li]La ligne .AddItem TabTemp(L, 1) se charge de remplir la colonne 0[/li]
[li]For c = 1 To 8 ... se charge de remplir les 8 autres.[/li][/ul][/ol]
Ci-joint ton classeur modifié comme je le propose plus haut (sauf erreur de ma part, ça semble fonctionner correctement).

Cordialement,
[file name=PourMarco60.zip size=11087]http://www.excel-downloads.com/components/com_simpleboard/uploaded/files/PourMarco60.zip[/file]
 

Pièces jointes

  • PourMarco60.zip
    10.8 KB · Affichages: 23

Marco60

XLDnaute Occasionnel
Re,
Oui, j'ai oublié ce détail d'indexation.

Quant au code rowsource du combobox, je le plaçais à la fin de la procédure de Proforma change()au lieu de Userform initialize, ce qui forcément, ne fonctionnait pas.

Je crois qu'il est grand temps que j'aille me coucher.

mDF, je te remercie encore une fois et à bientôt j'espère.

Marc
 

Discussions similaires

Réponses
10
Affichages
1 K

Statistiques des forums

Discussions
312 370
Messages
2 087 685
Membres
103 637
dernier inscrit
Hojee