XL 2019 En-tête fixe ListBox

Boostez vos compétences Excel avec notre communauté !

Rejoignez Excel Downloads, le rendez-vous des passionnés où l'entraide fait la force. Apprenez, échangez, progressez – et tout ça gratuitement ! 👉 Inscrivez-vous maintenant !

Raoul AGONGBE

XLDnaute Nouveau
Bonjour chers experts à divers niveaux

J'ai une préoccupation à mon niveau à propos de ma ListBox à laquelle je veux fixer l'en-tête (une première expérience) mais qui ne répond pas. Je sollicite votre expertise pour y parvenir.

VB:
Function show_data_in_listbox1()
ListBox3.ColumnCount = 10
ListBox3.ColumnWidths = "40;60;40;60;70;70;30;70;70;60"
Dim LastRow As Long
LastRow = Cells(Rows.Count, "A").End(xlUp).Row
ListBox3.RowSource = "COURIERS_RECUS!A3:J" & LastRow
ListBox3.ColumnHeads = True
End Function
 

Pièces jointes

  • Message d'erreur.jpg
    Message d'erreur.jpg
    10.1 KB · Affichages: 12
Bonjour Raoul,
Sans fichier difficile de répondre vraiment.
Mais comme votre macro est une fonction donc pas dans l'userform, il faut préciser de quoi vous parlez donc préciser à quel userform cela doit s'appliquer.
Essayez par ex :
Code:
Function show_data_in_listbox1()
With Userform1.ListBox3  ' à modifier
    .ColumnCount = 10
    .ColumnWidths = "40;60;40;60;70;70;30;70;70;60"
    Dim LastRow As Long
    LastRow = Cells(Rows.Count, "A").End(xlUp).Row
    .RowSource = "COURIERS_RECUS!A3:J" & LastRow
    .ColumnHeads = True
End With
End Function
Ne pas oublier les points pour bien ramener l'action à l'objet déclaré dans le With.
 
Hello

Perso, je ne me prend plus trop la tete avec les entetes de Listbox
puisque la ligne d'entete ne peut etre définie que si la Lbx est remplie avec la propriété rowsource, mais qu'elle est incompatible avec la méhode additem, je créée maintenant une autre lbx séparée qui ne contient que les entetes et que je place au dessus
j'ai donc
Lbx_Entete pour la ligne d'entete
et
Lbx_data qui contient mes lignes de données..
 
Bonjour,

N'y connaissant pas grand-chose en ListBox, je suis ce fil de discussion pour en savoir plus à ce sujet.

Puisque la ligne d'en-têtes ne peut être définie que si la ListBox est remplie avec la propriété RowSource, mais qu'elle est incompatible avec la méhode AddItem, je crée maintenant une autre ListBox séparée qui ne contient que les en-têtes et que je place au dessus.
Déjà, j'apprends qu'on ne peut pas utiliser la ligne d'en-têtes si on n'utilise pas RowSource.
Ça doit expliquer les problèmes que j'ai pu avoir lors de mes tentatives d'utilisation de ListBox...

Ensuite, je retiens l'astuce de la double ListBox. 👍

Enfin, ce sera une question : quel pourrait bien être l'intérêt d'utiliser AddItem si on utilise RowSource ?
Et n'est-il pas justement plus simple et plus rapide d'utiliser RowSource que de faire des boucles avec AddItem ?
 
Bonjour
la méthode rowsource permet effectivement le header mais a un désavantage conséquent
c'est qu'une fois le rowsource renseigné (mano mano ou par vba ) la listbox ne peut plus être modifiée
donc (tri,additem,removeitem, etc...) on oublie
pour une listbox ou combobox qui permette un simple choix alors oui ça peut être un avantage c'est simple

en gros du vba pour une listbox avec rowsource c'est mort
perso la 2d listbox d’entête est l'astuce que j'utilise
ListeBoxEntetes.list=array("titre1,"titre 2,"titre 3",et...)
ListeBoxEntetes.columnwidths="x;y;z;...."

top et .left etc....et .zorder1
simple à mettre en place

Patrick
 
et comme les gars de VBA sont des gens sympa, la méthode AddItem ne permet pas d'avoir plus de 10 colonnes dans une listbox..
Bonjour @vgendron il y a une astuce simple pour cela
 
Bonjour @vgendron il y a une astuce simple pour cela
Cette astuce m'a l'air d'exploiter une anomalie / bug d'excel et c'est très bien !
 
re
en gros pour faire simple on le fait avec un array vide
VB:
Private Sub UserForm_Click()
    Dim t(1 To 2, 1 To 20)
    With ListBox1
        .ColumnCount = 20
        .List = t
        .Clear
    'la listbox esy vide mais contient 20 volonnes
        For i = 1 To 10
            .AddItem
            For a = 1 To 20
                .List(i - 1, a - 1) = "L" & i & "c" & a
            Next
        Next

    End With
End Sub
 
Salut,
et pourquoi pas utiliser une ListView :
on peut changer le nom des colonnes. Les colonnes sont redimensionnables. On peut avoir des lignes pour séparer les éléments. Pas de limitation sur le nombre de colonnes.
Avec la fonction magique FillLV2D tout se simplifie :
VB:
Public Function FillLV2D(myLv, coln, colw, arr) As Boolean
'Fill ListView with array 2D, coln = name of columns, colw = width of columns, arr = Data 2D
Dim i As Integer, j As Integer
myLv.ListItems.Clear
myLv.ColumnHeaders.Clear
For i = LBound(coln) To UBound(coln)  ' Fill Column Headers
    myLv.ColumnHeaders.Add , , coln(i), colw(i - LBound(coln))
Next i
For i = LBound(arr, 1) To UBound(arr, 1)  ' Fill Data
    myLv.ListItems.Add , , arr(i, 1)
    For j = LBound(arr, 2) + 1 To UBound(arr, 2)
        myLv.ListItems(i).ListSubItems.Add , , arr(i, j)
    Next j
Next i
myLv.View = lvwReport
myLv.FullRowSelect = True
myLv.LabelEdit = lvwManual
myLv.Gridlines = True
End Function

Exemple d'utilisation :
Code:
Sub AfficherUsfLV()
   Dim coln, colw, arr
   Dim LastRow As Long
   LastRow = Worksheets(1).Cells(Rows.Count, "A").End(xlUp).Row
   arr = Worksheets(1).Range("A2:J" & CStr(LastRow))
   coln = Application.Transpose(Application.Transpose(Worksheets(1).Range("A1:J1")))
   colw = Array(40, 60, 40, 30, 50, 40, 30, 40, 70, 40)
   FillLV2D UsfLV.ListView1, coln, colw, arr
   UsfLV.Show
End Sub

ListView.png


Nullosse
 
Dernière édition:
- Navigue sans publicité
- Accède à Cléa, notre assistante IA experte Excel... et pas que...
- Profite de fonctionnalités exclusives
Ton soutien permet à Excel Downloads de rester 100% gratuit et de continuer à rassembler les passionnés d'Excel.
Je deviens Supporter XLD
Retour