Bonjour,
Dans le but d'automatiser le calcul de la largeur de chaque colonne, propriété ColumnWidths, d’un ListBox, j’ai écrit une petite procédure qui construit cette propriété dynamiquement en fonction de la largeur de chaque colonne de la feuille Excel qui alimente ce ListBox.
En fin de procédure, je rectifie la largeur du ListBox en fonction du total de la largeur de chaque colonne.
Au départ j’ai dessiné le ListBox avec une largeur à 200.
La rectification dynamique de la largeur ne s’effectue pas sauf si je place un point d’arrêt pendant l’exécution.
Si je dessine le ListBox avec une largeur supérieure à la valeur qu’elle doit prendre cela fonctionne.
J’ai donc pris le parti de la dessiner ainsi mais évidemment quand j’ai copié le code dans le projet dans lequel elle doit tourner cela ne fonctionne plus. C’est-à-dire que la largeur reste à sa valeur initiale mais si je place un point d’arrêt cela fonctionne.
Pour mon test, j’utilise une feuille dont la propriété CodeName est shtTest. La plage commence à A1, la première ligne contient les étiquettes de champs et j’ai placé une dizaine de colonnes et 5 lignes.
Je m’arrache les cheveux depuis plus de 3 heures avec ce problème.
J’ai cherché en vain une méthode équivalente à Repaint que j’utilise de temps en temps pour les UserForm
Quelqu’un parmi vous a-t-il déjà rencontré ce problème ?
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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
Option Explicit
Private Sub UserForm_Initialize()
 Me.Caption = "Test ListBox AutoWith"
 InitListOrder
End Sub
Sub InitListOrder()
 Dim tblSrce As String
 Dim tbl As Range
 Dim c As Long, cw As String, tw As Double
 Set tbl = shtTest.Range("A1").CurrentRegion
 With tbl ' Rectifie tbl pour ne pas englober la ligne d'en-tête
  Set tbl = .Offset(1, 0).Resize(.Rows.Count - 1, .Columns.Count)
 End With
 With lstBox
 .RowSource = tbl.Parent.Name & "!" & tbl.Address
 .ColumnCount = tbl.Columns.Count
 ' Point d'arrêt à partir d'ici
 .ColumnHeads = True
  For c = 1 To .ColumnCount
   cw = cw & tbl.Cells(1, c).Width & ";"
   tw = tw + tbl.Cells(1, c).Width '+ 1
  Next
  cw = Left(cw, Len(cw) - 1): .ColumnWidths = cw
 .Width = tw + 3 ' Rectifie la largeur du ListBox
 End With
 Set tbl = Nothing
 Debug.Print lstBox.Width & " tw = " & tw + 3
End Sub