Bonjour à tous,
Est-il possible de placer la scrollbar d'une frame sur la gauche ?
Merci beaucoup
Version imprimable
Bonjour à tous,
Est-il possible de placer la scrollbar d'une frame sur la gauche ?
Merci beaucoup
Bonjour
Pas à ma connaissance, mais si tu as vraiment besoin de présenter ainsi les "choses", rien ne t'empêche de ne pas utiliser les ascenseurs de ce Cadre et de lui adjoindre tes propres ascenseurs, en les plaçant où tu le souhaites !
Il est alors évident que tu vas ainsi compliquer significativement ton code (calculs, etc ...)
J'ai trouvé un début de piste ... Remplacer le Scrollbar par un bouton et capter les coordonnés pour faire bouger la Listbox. Mais malheuresment je n'arrive pas à l'adapter des que je passe sur le bouton ca me met une erreur (Listbox.index Invalid) Une idée ?
Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19 Private Sub CommandButton1_MouseMove(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single) 'récupère position vertical curseur souris coordY = Y 'longueur listbox = nombre éléments de la liste x 10px par éléments longueurlist = ListBox1.ListCount * 10 'hauteur listbox htlistbox = CommandButton1.Height 'transforme position curseur en position éléments de la liste par simple règle de trois 'arrondir à un chiffre rond yyy = Int(Int(Y * ListBox1.ListCount / htlistbox) * 10) 'sélectionne l'élément de la liste par rapport à la position du curseur ListBox1.ListIndex = yyy / 10 End Sub
J'ai le don d' "adorer" les diables à ressort ...Citation:
Remplacer le Scrollbar par un bouton et capter les coordonnés pour faire bouger la Listbox.
Elle sort d'où, d'un coup, cette listbox ?
Allez ! Si tu veux mon aide, apprends à être précis et clair, sine qua non , hein ...:sleep:
parfois l'estethique l'emporte sur la simplicité
un userfrom, une frame,une listebox dans la frame et un controlsscrollbar a gauche je dis bien un control scrollbar
Pièce jointe 270955Code:
1
2
3
4
5
6
7
8
9 Dim firstop Private Sub ScrollBar1_Scroll() ListBox1.Top = firstop - ScrollBar1 End Sub Private Sub UserForm_Activate() ListBox1.List = Array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10) ScrollBar1.Max = ListBox1.Top + ListBox1.Height - Frame1.Height firstop = ListBox1.Top End Sub
Merci pour ta réponse je pense pas etre très loin de la solution. Cependant ma Listbox Est très grande, elle a donc un scrollbar sur la doite. Ce que tu fais es correct sauf que ca ne va pas jusqu'à la fin de ma liste du coup ... As tu une idée ? Suis je clair ?
fait moi plaisir
quand tu rempli ta listbox, met sa propriété "listrow au nombre d'items de ta liste et mon modelé fonctionnera très bien et tu n'aura pas la scroll a droite
lol;)
ListBox1.ListRow = ListBox1.ListCount ne marche pas j'ai pas de propriété .ListRow
Si ca peut aider :
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
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139 Private Sub UserForm_Initialize() Application.ScreenUpdating = False Call formatage Call Init Set f = Sheets("Sheet1") Set d = CreateObject("Scripting.Dictionary") Set d2 = CreateObject("Scripting.Dictionary") Set d3 = CreateObject("Scripting.Dictionary") ColVisu = ColToSelect Bd = f.Range("A2:BH" & f.[A65000].End(xlUp).Row).Value X = 15 Y = Me.ListBox1.Top - 12 For Each k In Split(ColVisu, ",") Set Lab = Me.Frame1.Controls.Add("Forms.Label.1") Lab.Caption = f.Cells(1, Val(k)) Lab.Top = Y Lab.Left = X X = X + f.Columns(Val(k)).Width temp = temp & f.Columns(Val(k)).Width & ";" Next k temp = Left(temp, Len(temp) - 1) Me.ListBox1.ColumnCount = UBound(Split(ColVisu, ",")) + 1 Me.ListBox1.ColumnWidths = temp Dim Tbl: ReDim Tbl(1 To nbrows, 1 To nbcol) j = 0 For Each k In Split(ColVisu, ",") j = j + 1 For i = 1 To nbrows - 1 Tbl(i, j) = Bd(i, Val(k)) If IsNumeric(Tbl(i, j)) Then Tbl(i, j) = format(Tbl(i, j), "0.00") On Error Resume Next Next i Next k 'Me.ComboBox1.AddItem ("") 'Me.ComboBox1.AddItem ("BRAZIL") 'Me.ComboBox1.AddItem ("CHILE") 'Me.ComboBox1.AddItem ("CHINA") 'Me.ComboBox1.AddItem ("COLOMBIA") 'Me.ComboBox1.AddItem ("CZECH REPUBLIC") 'Me.ComboBox1.AddItem ("EGYPT") 'Me.ComboBox1.AddItem ("GREECE") 'Me.ComboBox1.AddItem ("HUNGARY") 'Me.ComboBox1.AddItem ("INDIA") 'Me.ComboBox1.AddItem ("INDONESIA") 'Me.ComboBox1.AddItem ("KOREA, REPUBLIC OF") 'Me.ComboBox1.AddItem ("MALAYSIA") 'Me.ComboBox1.AddItem ("MEXICO") 'Me.ComboBox1.AddItem ("PERU") 'Me.ComboBox1.AddItem ("PHILIPPINES") 'Me.ComboBox1.AddItem ("POLAND") 'Me.ComboBox1.AddItem ("QATAR") 'Me.ComboBox1.AddItem ("RUSSIAN FEDERATION") 'Me.ComboBox1.AddItem ("SOUTH AFRICA") 'Me.ComboBox1.AddItem ("TAIWAN, PROVINCE OF CHINA") 'Me.ComboBox1.AddItem ("THAILAND") 'Me.ComboBox1.AddItem ("TURKEY") 'Me.ComboBox1.AddItem ("UNITED ARAB EMIRATES") 'Me.ComboBox1 = "" ListBox1.List = Tbl column_country = associatecolumn("Country") For i = LBound(Tbl) To UBound(Tbl) d(Tbl(i, column_country)) = "" Next i temp = d.keys Tri temp, LBound(temp), UBound(temp) Me.ComboBox1.List = temp Me.ComboBox1.AddItem ("ALL") 'Me.ComboBox2.AddItem ("") 'Me.ComboBox2.AddItem ("Consumer Discretionary") 'Me.ComboBox2.AddItem ("Consumer Staples") 'Me.ComboBox2.AddItem ("Energy") 'Me.ComboBox2.AddItem ("Financials") 'Me.ComboBox2.AddItem ("Health Care") 'Me.ComboBox2.AddItem ("Industrials") 'Me.ComboBox2.AddItem ("Materials") 'Me.ComboBox2.AddItem ("Real Estate") 'Me.ComboBox2.AddItem ("Telecommunication Services") 'Me.ComboBox2.AddItem ("Utilities") column_industry = associatecolumn("Sector") For i = LBound(Tbl) To UBound(Tbl) d2(Tbl(i, column_industry)) = "" Next i temp2 = d2.keys Tri temp2, LBound(temp2), UBound(temp2) Me.ComboBox2.List = temp2 Set plage = Tbl Set plage = plage.Offset(1).Resize(plage.Rows.count - 1) Me.ListBox1.List = plage 'Me.Frame1.Width = 300 Me.Frame1.ScrollWidth = Me.ListBox1.Width + 10 Me.Frame1.ScrollBars = 1 TriMult Tbl, LBound(Tbl), UBound(Tbl), 1 ComboBox3.Visible = False Me.ComboBox4.AddItem ("Best in Class: Qlty Bck[1,4] Valuation Group 1") Me.ComboBox4.AddItem ("Qlty Bck[1,4] Valuation Group 1&2") Me.ComboBox4.AddItem ("Quality Bck[1,4]") Me.ComboBox4.AddItem ("Qlty Bck[1,4] Valuation Group 1 Growth Bucket [1,5]") Me.TextBox5 = 0 Label1.Font.Bold = True Label2.Font.Bold = True Label3.Font.Bold = True Label4.Font.Bold = True Label5.Font.Bold = True Label6.Font.Bold = True Label7.Font.Bold = True Label8.Font.Bold = True Label9.Font.Bold = True Label20.Font.Bold = True Label20.Font.Size = 16 Label20.ForeColor = vbgrey Label25.Caption = Me.ListBox1.ListCount & " Stocks" Label25.Font.Bold = True Label25.Font.Size = 16 Label25.ForeColor = vbgrey TextBox6.Visible = False TextBox7.Visible = False TextBox8.Visible = False TextBox9.Visible = False TextBox10.Visible = False TextBox11.Visible = False Label22.Visible = False Label23.Visible = False Label24.Visible = False CommandButton4.Visible = False ListBox1.ListRow = ListBox1.ListCount ScrollBar1.Max = ListBox1.Top + ListBox1.Height - Frame1.Height firstop = ListBox1.Top End Sub
autant pour moi c'est les combo qui ont cette propriété
alors pirouettre cacahuette
Pièce jointe 270964Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15 Dim firstop Private Sub ScrollBar1_Change() ListBox1.Top = firstop - ScrollBar1 End Sub Private Sub ScrollBar1_Scroll() ListBox1.Top = firstop - ScrollBar1 End Sub Private Sub UserForm_Activate() For i = 1 To 1000: ListBox1.AddItem i: Next ListBox1.Height = ListBox1.FontSize * 1.238 * ListBox1.ListCount ScrollBar1.Max = ListBox1.Top + ListBox1.Height - Frame1.Height firstop = ListBox1.Top ScrollBar.SmallChange = 8 End Sub
J'ai 2100 ligne et 23 colonnes ... Ca freeze complètement :(
re
2100 ligne et 23 colonnes
je dirais que le control devrait être une listview
c'est quoi freeze
chez moi
c'est nikelCode:
1
2
3
4
5
6
7
8
9
10
11
12
13
14 Dim firstop Private Sub ScrollBar1_Change() ListBox1.Top = firstop - ScrollBar1 End Sub Private Sub ScrollBar1_Scroll() ListBox1.Top = firstop - ScrollBar1 End Sub Private Sub UserForm_Activate() For i = 1 To 2000: ListBox1.AddItem i: Next ListBox1.Height = ListBox1.FontSize * 1.238 * ListBox1.ListCount ScrollBar1.Max = ListBox1.Top + ListBox1.Height - Frame1.Height firstop = ListBox1.Top ScrollBar1.SmallChange = 8 End Sub
Bonjour
Je ne voulais pas intervenir au-delà dès lors que l'on parlait de mettre à gauche l'ascenseur vertical d'un Frame pour finalement parler du déroulement d'une listbox.
Je voudrais simplement appeler l'attention sur deux points concernant ce calcul :
1) d'où sort ce coefficient correcteur arbitraire ?Code:ListBox1.Height = ListBox1.FontSize * 1.238 * ListBox1.ListCount
2) ce coefficient peut être exact avec une police de caractères et inexact avec une autre police de caractères ...
je viens de m'amuser à quelques essais pour confirmer ce que je dis là. En voici un (entre autres) :
D'autres différences sont probables entre un écran et un autre écranCode:
1
2
3
4
5
6
7
8
9
10 Private Sub UserForm_Activate() With ListBox1 For i = 1 To 10 .AddItem i .FontName = "Arial" .FontSize = 8 Next End With ListBox1.Height = ListBox1.FontSize * 1.238 * ListBox1.ListCount End Sub
3) j'appelle par ailleurs l'attention sur ce qu'expose l'aide VBA en ce qui concerne la propriété height d'un contrôle :
Or, dans le cas qui nous intéresse (2000 articles), que se passerait-il avec une taille de police de 14 ? --->>Citation:
La valeur affectée à Height ou Width doit être supérieure ou égale à zéro. Pour la plupart des systèmes, la plage de valeurs recommandée est de 0 à +32.767. Des valeurs supérieures peuvent également fonctionner selon la configuration de votre système
Il n'est jamais très bon de "jouer" ainsi, même si les aléas sont très peu nombreux.Code:MsgBox 14 * 1.238 * 2000
EDIT : je reviendrai lorsque le demandeur aura exprimé différemment et plus précisément son problème.
J'exposerai alors qu'il n'est nullement besoin :
- ni (bien au contraire et surtout pas) de fixer à son maximum la hauteur de la listbox
- ni donc de calculs "approximatifs" de l'espèce
Bonjour,
Unparia : +1
Bonjour Jacques,
Je suis étonné, à la lecture de ce sujet, qu'ait été abandonné l'idée initiale du Frame.
Frame = conteneur, peut donc aisément englober un Scrollbar (que l'on met ou l'on veut) et une listbox (à laquelle on ne touche pas).
Après, il suffit de régler le width et le height de ce frame pour que tout soit "transparent"...
Merci à tous pour vos réponses elle sont très constructives.
@unparia : C'est vrai que ce coefficient arbitraire est très dangereux si je pouvais stocker dynamiquement une variable ca serait idéal.
Pour résumer un peu le problème J'ai une listbox dynamique. Elle peut aller jusqu'à 6000 lignes et 30 colonnes. Mais les utilisateurs ne sont pas satisfaits car le scroll de la Listbox(Inclu dans une frame) se trouve sur la droite. Ils doivent donc scrollé horizontallement jusqu'à la dernière colonne afin de pouvoir descendre dans la liste.
L'idéal aurait été de gérer un event molette de souris qui permettrait à l'utilisateur de descendre dans la listbox mais cela semble impossible ou très difficile.
La solution Listview est une alternative mais je suis passé en Excel 64 bits donc ce n'est pas possible.
J'ai donc installer un bouton a droite de ma listbox et en fonction des coordonnés de la souris sur ce bouton la Listbox s'adapte. Voici le code en question :
Les éléments en rouge sont statiques. Si vous avez des idées pour les rendre dynamique ca m'aiderait grandement.Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20 Private Sub CommandButton5_MouseMove(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single) 'récupère position vertical curseur souris coordY = Y 'longueur listbox = nombre éléments de la liste x 10px par éléments longueurlist = ListBox1.FontSize * 1.238 * ListBox1.ListCount 'hauteur listbox htlistbox = 401.25 'transforme position curseur en position éléments de la liste par simple règle de trois 'arrondir à un chiffre rond yyy = Int(Int(coordY * ListBox1.ListCount / htlistbox)) 'sélectionne l'élément de la liste par rapport à la position du curseur ListBox1.ListIndex = yyy - 1 Label25.Caption = Me.ListBox1.ListIndex + 2 & "/" & Me.ListBox1.ListCount + 1 & " Stocks" End Sub
De plus si je pouvais gerer le deplacement de la listbox uniquement si l'utilisateur maintient le clique gauche de sa souris.
Un grand Merci
Allons bon !
Et si tu faisais comme au judo (où on met à son propre profit les avantages de l'adversaire) ?
Regarde :
- Un Frame sans bordure ni caption
- Dans ce Frame : ta listbox (sans chercher à lui donner sa taille maximum)
- tu réduis maintenant la largeur du Frame seul, en déplaçant sa bordure droite vers la gauche, jusqu'à cacher l'ascenseur
- tu mets une scrollbar à gauche (et à l'extérieur) du Frame
Et ce code tout bête :
Aucun calcul, aucune approximation, etc ...Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15 Private Sub UserForm_Activate() With ScrollBar1 .Max = ListBox1.ListCount .Min = 0 .SmallChange = 1 .LargeChange = 10 ' ou la valeur que tu juges plus "confortable". Je choisirais personnellement listbox1.listcount/10 End With End Sub Private Sub ScrollBar1_Change() ListBox1.TopIndex = ScrollBar1 End Sub Private Sub ScrollBar1_Scroll() ListBox1.TopIndex = ScrollBar1 End Sub
Voilà tout ...:lol:
EDIT : j'espère qu'il n'échappera à personne que le Frame n'est là que pour cacher l'ascenseur de la listbox *****(et rien d'autre).
***** Il est à ce propos dommage que les msforms.listboxes n'aient pas été construites comme celles de VB6.
Avec une listbox de VB6, on pourrait :
- supprimer carrément l'ascenseur de la listbox (en envoyant un message à sa fenêtre)
- et donc ne même plus avoir besoin du Frame pour cacher l'ascenseur.
re Bonjour a tous
oui c'est plus simple
je dois reconnaitre que j'ai complètement zappé la propriété topindex il faut dire que je ne m'en sert rarement des listbox préférant pour ma part les listview qui ont la gestion des trois boutons de la souris (roulette)en natif
unparia a raison ;)
Un grand merci ca marche totalement. Par contre je suis obligé de fixer une valeur de taille a ma listbox car le nombre de colonne est variable mais c'est futile. Un grand merci à vous.
Cependant j'aimerai savoir comment mettre dynamiquement les chiffres en rouge dans mon précédent poste par curiosité car je trouve la solution bonne aussi (en terme de design).
Merci unparia et patrick
Ps patrick : Tu as raison pour les listviews je bossais dessus avant c'est beaucoup mieux mais je n'ai plus la possibilité dans un environnement 64 bits
grosse erreur de l'avoir installé en 64 c'est bien connu que même Microsoft le déconseilleCitation:
Ps patrick : Tu as raison pour les listviews je bossais dessus avant c'est beaucoup mieux mais je n'ai plus la possibilité dans un environnement 64 bits
en tout cas chapo a unparia c'est propre et Nikel