ComboBox.ListWidth

ILOVEUBB

XLDnaute Occasionnel
SALUT

J'ai un userform avec des combobox ma question est comment faire pour que la liste déroulante du combobox s'ajuste avec la taille du texte .
j'ai utiliser la propriété ComboBox.ListWidth mais ......................
merci
 

xhudi69

XLDnaute Accro
Re : ComboBox.ListWidth

Bonjour ILOVEUBB, le Forum

Le code est assez compliqué, voir vba - vb macro string width in pixel - Stack Overflow

En PJ un petit fichier pour pas te casser la tête si toutefois tu ne changes pas de police tout les jours et la taille non plus.
A l'ouverture de l'UserForm, le ComboBox se dimensionne en fonction du nombre de caractères le plus grand dans la colonne concernée.
Ce code est à ajuster, ce n'est pas finalisé.........

@+ :cool:
 

Pièces jointes

  • Combo_Test.xlsm
    22.5 KB · Affichages: 38

ILOVEUBB

XLDnaute Occasionnel
Re : ComboBox.ListWidth

bonsoir xhudi69 , eric
désoler pour le retard , xhudi69 c'est bien ce que je voulais mais , les donné son ajoutez par la méthode ComboBox.AddItem est ne sont pas disponible sur la feuil1 est ce que sa fonctionnent avec ta méthode ?
 

xhudi69

XLDnaute Accro
Re : ComboBox.ListWidth

Bonjour ILOVEUBB, le Forum

Non car je me base sur les chaines de caractères dans les cellules de la colonne concernée.
Tu devrais joindre un bout de fichier anonymisé pour avoir exactement la réponse attendue.

@+ :cool:
 

job75

XLDnaute Barbatruc
Re : ComboBox.ListWidth

Bonjour ILOVEUBB, xhudi69, eriiiic, le forum,

Une solution avec AutoSize comme le propose eriiiic :

Code:
Sub Dimensionner(o As Object)
Dim mem$, i&, L#
Application.ScreenUpdating = False
Application.EnableEvents = False
o.AutoSize = True
mem = o
For i = 0 To UBound(o.List)
  o.ListIndex = i
  If o.Width > L Then L = o.Width
Next
o.AutoSize = False
o.Width = L
o = mem
Application.EnableEvents = True
Application.ScreenUpdating = True
End Sub
Cette macro s'exécute quand on veut par cette instruction dans le code de l'USF :

Code:
Dimensionner ComboBox1
Il faudrait voir le temps de calcul avec plusieurs milliers d'éléments dans la ComboBox...

A+
 

job75

XLDnaute Barbatruc
Re : ComboBox.ListWidth

Re,

On peut aussi utiliser une colonne de la feuille active :

Code:
Sub Dimensionner(o As Object)
Application.ScreenUpdating = False
With Columns(Columns.Count)
  .Resize(o.ListCount) = o.List
  .Font.Name = o.Font.Name
  .Font.Size = o.Font.Size
  .Font.Bold = o.Font.Bold
  .Font.Italic = o.Font.Italic
  .AutoFit
  o.Width = .Width + 16
  .Delete
End With
Application.ScreenUpdating = True
End Sub
C'est 2 fois plus rapide, sur 9000 items => 0,25 seconde.

Mais pour les petites largeurs c'est moins précis.

A+
 
Dernière édition:

job75

XLDnaute Barbatruc
Re : ComboBox.ListWidth

Bonjour ILOVEUBB, xhudi69, le forum,

Si l'on veut seulement ajuster la largeur de la liste, les 2 macros précédentes deviennent :

Code:
Sub Dimensionner1(o As Object)
Dim mem1$, mem2#, i&, L#
Application.ScreenUpdating = False
Application.EnableEvents = False
mem1 = o: mem2 = o.Width
o.AutoSize = True
For i = 0 To UBound(o.List)
  o.ListIndex = i
  If o.Width > L Then L = o.Width
Next
o.AutoSize = False
o = mem1: o.Width = mem2
o.ListWidth = Application.Max(72, L + 16 * (o.ListCount <= o.ListRows))
Application.EnableEvents = True
Application.ScreenUpdating = True
End Sub

Sub Dimensionner2(o As Object)
Application.ScreenUpdating = False
With Columns(Columns.Count)
  .Resize(o.ListCount) = o.List
  .Font.Name = o.Font.Name
  .Font.Size = o.Font.Size
  .Font.Bold = o.Font.Bold
  .Font.Italic = o.Font.Italic
  .AutoFit
  o.ListWidth = Application.Max(72, .Width - 16 * (o.ListCount > o.ListRows))
  .Delete
End With
Application.ScreenUpdating = True
End Sub
Sur Excel 2003 il faut un minimum de 72 points en largeur.

Avec une largeur plus petite, une barre de défilement horizontale apparaît.

Nota : je rappelle que True se convertit en -1...

A+
 

job75

XLDnaute Barbatruc
Re : ComboBox.ListWidth

Re,

Mes macros précédentes (post #11) vont bien sur Excel 2003.

Sur Excel 2010 il faut ajouter des points :

Code:
Sub Dimensionner1(o As Object)
Dim mem1$, mem2#, i&, L#
Application.ScreenUpdating = False
Application.EnableEvents = False
mem1 = o: mem2 = o.Width
o.AutoSize = True
For i = 0 To UBound(o.List)
  o.ListIndex = i
  If o.Width > L Then L = o.Width
Next
o.AutoSize = False
o = mem1: o.Width = mem2
o.ListWidth = Application.Max(72, 10 + L + 16 * (o.ListCount <= o.ListRows))
Application.EnableEvents = True
Application.ScreenUpdating = True
End Sub

Sub Dimensionner2(o As Object)
Application.ScreenUpdating = False
With Columns(Columns.Count)
  .Resize(o.ListCount) = o.List
  .Font.Name = o.Font.Name
  .Font.Size = o.Font.Size
  .Font.Bold = o.Font.Bold
  .Font.Italic = o.Font.Italic
  .AutoFit
  o.ListWidth = Application.Max(72, 6 + .Width - 16 * (o.ListCount > o.ListRows))
  .Delete
End With
Application.ScreenUpdating = True
End Sub
Le minimum de 72 est le même sur les 2 versions.

A+
 

Discussions similaires

Réponses
20
Affichages
701
Réponses
21
Affichages
1 K
  • Résolu(e)
Microsoft 365 Taille UserForm
Réponses
3
Affichages
301

Statistiques des forums

Discussions
311 725
Messages
2 081 940
Membres
101 845
dernier inscrit
annesof