Ceci est une page optimisée pour les mobiles. Cliquez sur ce texte pour afficher la vraie page.

Autres dimensionner une listbox pour DUDU2

patricktoulon

XLDnaute Barbatruc
BONJOUR @Dudu2
Private Sub UserForm_Activate()
ListBox1.List = [A1:A8].Value
ecx = Me.Width - Me.InsideWidth
With Me.Controls.Add("forms.Label.1", "cobaie")
.Width = 500
.Height = 200
.Font.Name = ListBox1.Font.Name
.BackColor = vbYellow
.BorderStyle = ListBox1.BorderStyle
' .SpecialEffect = ListBox1.SpecialEffect
.Font.Size = ListBox1.Font.Size
.Font.Bold = ListBox1.Font.Bold
.Caption = "toto"
.AutoSize = True
.Top = ListBox1.Top
.Left = ListBox1.Left + ListBox1.Width
ListBox1.Height = ((.Height + 0.25) * ListBox1.ListCount)
MsgBox "théoriquement un item mesure " & .Height & " points de haut"
'Me.Controls.Remove (.Name)
End With
End Sub


 

patricktoulon

XLDnaute Barbatruc
perso j'utilise la hauteur du textbox et la largeur du textbox en lui ayant donné les même paramètres que la listbox
font.size
font.name
font.bold
borderstyle
specialeffect

et ala largeur finale j'ajoute 3
(equivalent de getsystemmetrics(36) converti en point )
le cadre d'un element selectionné car le specialeffect c'est ça

ca marche sur 2007 / 2013 / 2016
pour info c'est le specialeffect qui peut tromper c'est pour ça le 3(qui en passant représente aussi chez moi le width-insidewidth de l'userform )
conclusion
VB:
Sub resizeListBox(usf, listbox As Object)
   'patricktoulon
   'MsgBox GetSystemMetrics(36)
    Dim txt, speffect, BdStyle, X&
    'With listbox: .IntegralHeight = False:  .Height = 0:  .IntegralHeight = True: X = .Height: End With'abandon de la méthode @job75
    speffect = listbox.SpecialEffect
    BdStyle = listbox.BorderStyle
    txt = Join(Application.Transpose(listbox.List), vbCrLf)
    With usf.Controls.Add("forms.Textbox.1", "cobaie")
        DoEvents
        .IntegralHeight = listbox.IntegralHeight
        .MultiLine = True
        .Value = CStr(txt)
        .Width = 500
        .Height = listbox.ListCount * 30
        .BorderStyle = BdStyle
        .Font.Size = listbox.Font.Size
        .Font.Name = listbox.Font.Name
        .Font.Bold = listbox.Font.Bold
        .AutoSize = True
        listbox.Height = .Height
        listbox.ColumnWidths = Replace(.Width & ";0", ".", ",")
        listbox.Width = .Width + 3 '(Getsyemmetrics(36)
        listbox.BorderStyle = BdStyle
        listbox.SpecialEffect = speffect
        'usf.Controls.Remove ("cobaie")
    End With
End Sub
au final j'obtiens ceci



vue grossie 800%


je n'ai que le cadre du specialeffect
c'est donc pile poil
 

Dudu2

XLDnaute Barbatruc
C'est en effet ce que j'ai fait, sauf que je n'ai pas traité le SpecialEffect et le BorderStyle.
Peut-être faudrait-il que je les inclue. Cependant je ne suis pas sûr qu'ils influent sur les dimensions.
 

patricktoulon

XLDnaute Barbatruc
Sur mon environnement, je ne remarque pas de différence sur les tailles finales.
Mais je n'ai pas appliqué le SpecialEffect à la TextBox de référence.

Regarde la pièce jointe 1207734
ce n'est pas avec les différents specialeffect
c'est le borderstyle
si tu met le bordurestyle à1 le specialeffect saute
si tu enlève le bordure style le specialeffect ne revient pas tout seul la liste se retrouve sans bordure
dans tout les cas chez moi c'est height-->height et width+3 sur 3 versions excel dans 2 versions de win différentes
 

patricktoulon

XLDnaute Barbatruc
si tu veux tout savoir la pictouillu se trouve ici



et c'est pour ça que le height=l'autre height donne la listbox plus petite



c'est pour ca qu'il ne faut pas toucher le specialeffect du textbox temporaire
car visiblement le calcul prend en compte cette différence
par contre en borderstyle à 1 oui
 

Dudu2

XLDnaute Barbatruc
Il y a bien le ColumnHeads qui affecte la hauteur de la ListBox, mais je l'ai ignoré car jamais utilisé.
A titre d'exercice je vais essayer, si sa hauteur est égale à celle d'un Item, ça devrait aller. A vérifier.
 

Discussions similaires

Les cookies sont requis pour utiliser ce site. Vous devez les accepter pour continuer à utiliser le site. En savoir plus…