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
1732366521028.png


demo1.gif
 

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

1732610260065.png


vue grossie 800%
1732610150740.png


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

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
1732612489657.png



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

1732612729131.png


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
 

Discussions similaires

Statistiques des forums

Discussions
315 089
Messages
2 116 098
Membres
112 661
dernier inscrit
ceucri