Rapport de message :*
 

Re: Afficher/Masquer Lignes et colonnes

Titre du sujet : Re: Afficher/Masquer Lignes et colonnes
par myDearFriend! le 03/12/2009 19:49:50

Bonsoir lours, le Forum,

Citation :
lours a écrit :
... je n’arrive pas à comprendre la propriété BoundColumn. En effet, je pensai que si j’avais dans la ListBoxA 3 colonnes, je devais indiquer également 3 pour BoundColumn.

Avec l’aide sur Visual Basic, j’essaie de déchiffrer les codes, et ce n’est pas évident (mes neurones n’ont plus vingt ans).

Peux-tu me préciser, si je ne  prends pas trop de ton temps, pourquoi indiquer -1 dans

« .List(ListCount -1,1) ». Je suppose que 1 correspond à la 2ème colonne (0=1ère colonne, 1=2ème colonne, 2=3ème colonne).

Encore Merci pour ton dévouement, et ta gentillesse à partager ton immense savoir.

"immense savoir" arf... faut pas exagérer lol !

Bon, je tente une mini explication sur les propriétés clés du contrôle ListBox (valable aussi pour le contrôle ComboBox) :

Propriété Value
: comme tu le sais, la propriété Value d'un contrôle retourne le contenu de ce contrôle. Pour un TextBox par exemple, la propriété Value te retourne la chaîne de caractères qui est affichée dans ce TextBox. Par défaut, une ListBox contient une seule colonne. Dans ce cas  là, c'est fort simple : lorsque l'utilisateur sélectionne un élément, la propriété Value retourne la donnée contenu dans cet élément sélectionné.

Propriété ColumnCount:si je souhaite afficher plusieurs colonnes de données dans ce contrôle, je vais jouer sur la propriété ColumnCount. On l'a vu, par défaut, cette propriété est définie à 1. Si je compte afficher 5 colonnes par exemple, je vais donc lui attribuer la valeur... 5 ! Dans le cas d'une ListBox multicolonnes, rien ne change pour la propriété Value. Si je demande cette propriété Value, j'obtiens toujours la donnée issue de la première colonne (et selon la ligne sélectionnée dans le contrôle bien sûr).

Par défaut donc, la propriété Value retourne toujours la valeur issue dans la première colonne d'une ListBox, quelque soit le nombre de colonnes du contrôle.

Mais comment faire si, après sélection d'une ligne par l'utilisateur, je souhaite obtenir la donnée contenue dans la 2ème ou 3ème colonne du contrôle au lieu de la première ?

Une solution "académique" consiste à recourir à la propriété List() qui représente en fait le tableau des données contenues (à 2 dimensions : pour ligne et colonne)...

Mais VBA nous offre une solution beaucoup plus simple et souvent plus pratique : on peut redéfinir la colonne cible de la propriété Value. Ainsi, en testant la propriété Value, on peut décider d'obtenir directement la donnée contenue dans une colonne autre que la première : pour ce faire, on va utiliser la propriété BoundColumn. Définie à 1 par défaut (pour colonne 1), on lui attribue alors le numéro de la colonne souhaitée !

Dans ton fichier, la ListBoxA comprend 3 colonnes et j'ai redéfini volontairement la propriété BoundColumn sur 2 car c'est la donnée contenue dans la 2ème colonne qui m'intéresse en retour lorsque je demande : ListBoxA.Value.

Citation :
lours a écrit :

Peux-tu me préciser, si je ne  prends pas trop de ton temps, pourquoi indiquer -1 dans

« .List(ListCount -1,1) ». Je suppose que 1 correspond à la 2ème colonne (0=1ère colonne, 1=2ème colonne, 2=3ème colonne

Là, tu as presque tout compris... Sauf qu'on ne parle pas de colonne ici, mais de ligne !

Pour rappel, la propriété List() est comme un tableau à 2 dimensions qui se présente ainsi :
ListBox1.List(NumLigne, NumColonne)
Le premier élément, c'est le numéro de ligne et le deuxième, c'est pour la colonne.

Comme tu l'as déduit, la particularité ici, c'est que cette numérotation des Lignes / Colonnes commence à 0 (zéro). Ca ne simplifie pas vraiment les choses, mais c'est un coup à prendre...

- Si je veux obtenir la donnée contenue dans la première ligne et première colonne du contrôle, je demande donc : List(0,0)
- Si je veux obtenir la donnée contenue dans la 3ème ligne et 4ème colonne, je fais : List(2, 3)
- Et enfin, si je veux obtenir la donnée contenue dans la dernière ligne et dernière colonne du contrôle ListBoxA, alors j'ai recours à :
   With ListBoxA
        MsgBox .List(.ListCount - 1, .ColumnCount - 1)
    End With
J'espère t'avoir aidé à comprendre un peu le principe de fonctionnement de ce contrôle...

Cordialement,