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
Partager