Bonjour à tous,
Comment puis-je rendre autosize le redimensionnement des colonnes
d'une ListBox ?
Voila un début.
http://cjoint.com/?kxnQCAG3Lf
Merci. :P
Version imprimable
Bonjour à tous,
Comment puis-je rendre autosize le redimensionnement des colonnes
d'une ListBox ?
Voila un début.
http://cjoint.com/?kxnQCAG3Lf
Merci. :P
Tout dépend du format des caractères utilisé dans tes listbox (font)
La formule "Taille des caractères * Nombre de caractères pour le mot le plus long" devrait pouvoir t'aider à régler le problème.
Une boucle sur tous les mots inclus dans la liste serait nécessaire (!)
Ça devrait donner un truc comme ça
7 étant une valeur empirique que tu devras adapter en tâtonnant :(Code:
1
2
3
4
5
6
7
8
9
10 Private Sub UserForm_Activate() Dim i As Integer, nbcar As Byte For i = 0 To ListBox1.ListCount - 1 If Len(ListBox1.List(i)) > nbcar Then nbcar = Len(ListBox1.List(i)) End If Next ListBox1.Width = 7 * nbcar Me.Repaint End Sub
C'est le bricolage le moins lourd que je connaisse
Toute autre solution plus sioux m'intéresserait également ;)
Bonjour, Ousk,
La solution "de sioux" sous VB6 est ultrasimple.
Sous VBA, maintenant ?
Là, il va falloir mettre une oreille à terre et écouter les vibrations ...
Ah ... Les voilà, justement ... et elles me disent :
-utilier un Label invisible avec la même Font et taille de Font et sa propriété Autosize à True
- envoyer dans son caption le texte le plus long
- mesurer maintenant sa taille (Width)
Et vla tout : on connait maintenant cette largeur ...
:P Bonjour à tous,
ouskel'n'or :fleche: J'ai deja essayé avec l'idée des caracteres, mais je n'arrive toujours pas :arf: :marteau:
ucfoutu :fleche: En PJ un exemple avec des Label.
Mais pas encore réussi :mur:
Bonjour ucfoutu,
D'accord, le voila mon code :
:)Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35 Private Sub UserForm_Initialize() Dim Plg As Range, Cw1 As Long, Cw2 As Long ReDim Tablo(1, 0) Set Plg = Range([B2], [B2].End(xlDown)) Cw1 = 0: Cw2 = 0 S1 = "": S2 = "" For Each Lg In Plg Tablo(0, UBound(Tablo, 2)) = Lg Tablo(1, UBound(Tablo, 2)) = Format(Lg.Offset(0, 1), "# ##0.00") If Len(Lg) > Len(S1) Then S1 = Lg If Len(Lg.Offset(0, 1)) > Len(S2) Then S2 = Lg.Offset(0, 1) ReDim Preserve Tablo(1, UBound(Tablo, 2) + 1) Next Lg ReDim Preserve Tablo(1, UBound(Tablo, 2) - 1) Label1.Caption = S1 Label2.Caption = S2 Cw1 = Label1.Width Cw2 = Label2.Width With ListBox1 .Width = 20 + (Cw1 + Cw2) ' .ColumnCount = 2 'prévoir d'avance pour ci-dessous .ColumnWidths = Cw1 & ";" & Cw2 .List = Application.Transpose(Tablo) .MultiSelect = 2 .BackColor = RGB(204, 204, 255) End With Me.Width = ListBox1.Width + 20 CommandButton1.Left = (Me.Width / 2) - (Me.CommandButton1.Width / 2) End Sub
Bon...
1) quelles valeurs obtiens-tu pour cw1 et pour cw2 ? (un msgbox te le fera savoir)
2) combien de colonnes contient ta lisbox ? (2, apparemment)
Il te faut donc dimensionner chacune de tes 2 colonnes et pas, comme tu le fais, te contenter de dimensionner la largeur totale de ta listbox ...
3) tu n'as nul besoin de 2 labels ! un seul suffit....puisqu'il n'est utilisé que pour prendre la mesure de la largeur graphique d'une chaine
4) regarde donc ce que tu fais ! tu ne "mesures" (en utilisant le label), qu'en fonction du nimbre de caractères le plus grans, ce qui est une grave erreur car (en fonction de la Font) il n'est pas toujours vrai que la largeur graphique de la chaîne la plus longue soit supérieure à celle d'une chaîne plus courte !
Il te faut donc prendre la mesure graphique (avec le label) pour chaque chaine et garder la mesure la plus grance (pour chaque colonne)
5) j'espère que tu as attribué à ton label "de mesure" les mêmes proproétés de police (font, taille, style) que celles dont est dotée ta listbox...
Te voilà sur tes rails...
A toi d'appliquer, maintenant (en me relisant très attentivement et en réfléchissant plutôt qu'en te précipitant dans des directions "instinctives"...)