XL 2016 VBA ListView UserForm - Help !

  • Initiateur de la discussion Initiateur de la discussion Dudu2
  • Date de début Date de début

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 !

Dudu2

XLDnaute Barbatruc
Bonjour,

Je suis paumé avec les ListView.
Je voudrais 1 colonne et j'en ai 2 !
VB:
    With ListView
        .ListItems.Clear
        .FullRowSelect = True
        .Gridlines = True
        .HideColumnHeaders = True
        For i = LBound(TabValues) To UBound(TabValues)
            .ListItems.Add i, , TabValues(i)
        Next i
    End With

1756460499268.png
 
Solution
Je vais te dire ce que j'ai appris grâce aux colistiers.
  • A l'initialisation, il semble que la ListView ait 2 colonnes par défaut, alors voilà comment je l'initialise pour une colonne unique sans titres de colonnes et pour avoir les Scroll Bars (H & V) automatiquement si ça déborde ( .FlatScrollBar = False):
    VB:
       With Me.ListView        .FullRowSelect = True
            .Gridlines = False
            .ColumnHeaders.Add , , "Colonne", .Width - 4
            .HideColumnHeaders = True
            .View = lvwReport
            .MultiSelect = True
            .FlatScrollBar = False
        End With

  • Au chargement initial, le 1er item est sélectioné par défaut, alors il faut ajouter:
    Code:
    ListView.ListItems(1).Selected = False

  • Pour sélectionner...
A mon avis la sélection fonctionne mais c'est l'affichage de ou des éléments sélectionnés qui ne fonctionne pas. Il semblerait que la propriété HideSelection pose des problèmes. Essayer ce code après sélection :

car même si la propriété est déjà à Faux avant , chez moi cela me remet l'affichage des sélections.
Pour connaître l'index de l'item sélectionné appelons-le ind :
VB:
ind = ListView1.SelectedItem.index
puis, pour adresser l'item en question :
Code:
ListView1.ListItems(ind)
Puis pour les colonnes :
VB:
ListView1.ListItems(ind).SubItems(i)
Mille excuses
 
J'ai le .MultiSelect = True pas de souci.

@nullosse, cette instruction .HideSelection = False a fait progresser l'affaire de sélection mais bizarrement ça sélectionne en gris !
Quand je sélectionne au tout début du chargement de la ListView, ça sélectionne en bleu.

Et en gris, ça reconnait bien les items comme étant sélectionnés.

1756474664175.png
 
A défaut de donner un classeur, la bonne syntaxe parmi toutes celles proposées aurait été bien.
Et on aurait aussi peut-être pu savoir ce qu'il y avait en gros dans "TabValues" (par exemple, est-ce un tableau à une seule dimension ?).

Tout ça m'aurait permi de pouvoir suivre le fil de discussion et apprendre des choses sur les ListView.
 
Je vais te dire ce que j'ai appris grâce aux colistiers.
  • A l'initialisation, il semble que la ListView ait 2 colonnes par défaut, alors voilà comment je l'initialise pour une colonne unique sans titres de colonnes et pour avoir les Scroll Bars (H & V) automatiquement si ça déborde ( .FlatScrollBar = False):
    VB:
       With Me.ListView        .FullRowSelect = True
            .Gridlines = False
            .ColumnHeaders.Add , , "Colonne", .Width - 4
            .HideColumnHeaders = True
            .View = lvwReport
            .MultiSelect = True
            .FlatScrollBar = False
        End With

  • Au chargement initial, le 1er item est sélectioné par défaut, alors il faut ajouter:
    Code:
    ListView.ListItems(1).Selected = False

  • Pour sélectionner des items via le VBA, pour avoir l'affichage des items sélectionnés, il faut préalablement faire:
    VB:
    With ListView
        .HideSelection = False
        .SetFocus
    End ListView

    Ensuite on peut valoriser les items sélectionnés:
    VB:
    For i = 1 To .ListItems.Count
        If <Condition> Then ListView.ListItems(i).Selected = True
    Next i

  • La valeur d'un item se récupère ou se définit via:
    VB:
    ValeurItem = ListView.ListItems(i).Text

  • L'item cliqué (sa ligne) se récupère avec:
    VB:
    Private Sub ListView_Click()
        IndexItemCliqué = Me.ListView.SelectedItem.Index
    End Sub
    ou bien:
    VB:
    Private Sub ListView_MouseUp(ByVal Button As Integer, ByVal Shift As Integer, ByVal x As stdole.OLE_XPOS_PIXELS, ByVal y As stdole.OLE_YPOS_PIXELS)
        IndexItemCliqué = Me.ListView.SelectedItem.Index
    End Sub

  • Les items d'une ListView sont éditables et si l'on veut l'empêcher pour que ça se comporte comme une ListBox il faut gérer l'évènement:
    VB:
    Private Sub ListView_BeforeLabelEdit(Cancel As Integer)
        Cancel = True
    End Sub
Voilà, ça m'a permis de gérer mes ListViews.

Edit: Après on peut avoir du multicolonnes qui se gère avec les SubItems, par exemple:
Code:
For i = 1 To UBound(T, 1)
    .ListItems.Add , , T(i, 1)
    For j = 2 To UBound(T, 2)
        .ListItems(i).ListSubItems.Add , , T(i, j)
    Next j
Next i

Edit: En cliquant sur un item on le sélectionne s'il n'est pas sélectionné.
Par contre s'il est sélectionné, il reste sélectionné.
Pour désélectionner un item sélectionné c'est un peu complexe.
Voici le code:
VB:
Private TabListViewSelected() As Boolean

'----------------------
'MouseDown sur ListView
'----------------------
Private Sub ListView_MouseDown(ByVal Button As Integer, ByVal Shift As Integer, ByVal x As stdole.OLE_XPOS_PIXELS, ByVal y As stdole.OLE_YPOS_PIXELS)
    Call MouseDown(Me.ListView)
End Sub

'--------------------
'MouseUp sur ListView
'--------------------
Private Sub ListView_MouseUp(ByVal Button As Integer, ByVal Shift As Integer, ByVal x As stdole.OLE_XPOS_PIXELS, ByVal y As stdole.OLE_YPOS_PIXELS)
     Call MouseUp(Me.ListView)
End Sub

'----------------------
'MouseDown sur ListView
'----------------------
Private Sub MouseDown(ListView As ListView)
    Dim i As Integer
 
    Erase TabListViewSelected
 
    With ListView
        If .ListItems.Count > 0 Then
            'Mémorise l'état de sélection des items avant leur éventuel changement d'état de sélection
            ReDim TabListViewSelected(1 To .ListItems.Count)
    
            For i = 1 To .ListItems.Count
                TabListViewSelected(i) = .ListItems(i).Selected
            Next i
        End If
    End With
End Sub

'--------------------
'MouseUp sur ListView
'--------------------
Private Sub MouseUp(ListView As ListView)
     Dim i As Integer
     Dim SelectedItem As Integer

     With ListView
        'La table de l'état de sélection des Items n'est pas vide
        If Not (Not TabListViewSelected) Then
        
            'Item cliqué
            SelectedItem = .SelectedItem.Index
        
            'L'item cliqué etait sélectionné
            If TabListViewSelected(SelectedItem) Then
            
                'Le désélectionner en table
                TabListViewSelected(SelectedItem) = False
                .HideSelection = False
                
                'Cette instruction désélectionne tout !!!???
                '.ListItems(.SelectedItem.Index).Selected = False
                
                'Cette boucle positionne la liste à la fin
                For i = 1 To .ListItems.Count
                    .ListItems(i).Selected = TabListViewSelected(i)
                Next i
                
                'Boucle nécessaire pour repositionner la liste
                For i = .ListItems.Count To SelectedItem Step -1
                    .ListItems(i).Selected = TabListViewSelected(i)
                Next i
            End If
        End If
    End With
End Sub
 
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

Discussions similaires

Réponses
5
Affichages
234
  • Question Question
Microsoft 365 affichage userform
Réponses
4
Affichages
360
Réponses
10
Affichages
281
Réponses
8
Affichages
233
Réponses
2
Affichages
200
Réponses
8
Affichages
466
Retour