Comment alimenter une listview + rapidement ?

DanielD

XLDnaute Nouveau
Bonjour le forum,

Voilà… j'aimerais alimenter une listview à trois colonnes à partir des données contenues dans une feuille. Je parviens à le faire de cette manière en utilisant une plage nommée :

Code:
Dim Donnees As New Collection
Dim L As Integer
Dim Item As Variant


With ListView2
.ListItems.Clear
With .ColumnHeaders
.Clear
.Add , , "Option", 50
.Add , , "Titre", 150
.Add , , "Programme", 150

End With
.View = lvwReport
End With

On Error Resume Next


For Each C In [plagenommée]
Donnees.Add C.Text, C.Text
Next C


For Each Item In [plagenommée]
ListView2.ListItems.Add , , Item
Next Item



For i = 1 To ListView2.ListItems.Count
For Each C In [plagenommée]
If C.Text = ListView2.ListItems(i) Then

ListView2.ListItems(i).ListSubItems.Add , , C.Offset(0, 1)
ListView2.ListItems(i).ListSubItems.Add , , C.Offset(0, 27)
End If
Next C
Next i

Mais cela prend un temps très long (j'ai presque mille enregistrements !)

Y aurait-i un moyen de procéder autrement, par exemple en s'inspirant de la méthode ci-dessous utlisée pour alimenter une listbox (et que j'ai trouvé sur le forum, of course...merci à son auteur, d'ailleurs !). Elle est infiniment plus rapide !

Code:
Dim x As Integer, j As Integer, i As Integer, ii As Integer
Dim Tmp1 As String

Private sub Initialize
Ini

Me.OptionButton1 = True
With Me.ListBox1
.MultiSelect = fmMultiSelectMulti
.ColumnCount = 4
.ColumnWidths = "50;50;50;50"
.Column() = Tablo
End With


        For i = LBound(Tablo, 2) To UBound(Tablo, 2)
                For j = LBound(Tablo, 2) + ii To UBound(Tablo, 2)
                    If Tablo(1, i) > Tablo(1, j) Then
                        Tmp1 = Tablo(1, j)
                        Tablo(1, j) = Tablo(1, i)
                        Tablo(1, i) = Tmp1
                    End If
                Next j
        ii = ii + 1
        Next i


Next i
End sub
Ci dessous la procédure Ini

Code:
Private Sub Ini()
Dim T As Variant
Dim x As Integer, j As Integer, i As Integer, ii As Integer
Dim Tmp1 As String, Tmp2 As String, Tmp3 As String, Tmp4 As String


With wksCKL
    If .FilterMode = True Then .ShowAllData
    T = .Range("A2:AZ" & .Range("A65536").End(xlUp).Row)
End With


    For i = LBound(T, 1) To UBound(T, 1)
        If T(i, 1) <> "" Then
            ReDim Preserve Tablo(4, x)
            Tablo(0, x) = T(i, 1)
            Tablo(1, x) = T(i, 30)
            Tablo(2, x) = T(i, 31)
            Tablo(3, x) = T(i, 29)
            x = x + 1
        End If
    Next
        For i = LBound(Tablo, 2) To UBound(Tablo, 2)
                For j = LBound(Tablo, 2) + ii To UBound(Tablo, 2)
                If Descending = False Then
                    If Tablo(C0, i) > Tablo(C0, j) Then
                        Tmp1 = Tablo(0, j): Tmp2 = Tablo(1, j): Tmp3 = Tablo(2, j): Tmp4 = Tablo(3, j)
                        Tablo(0, j) = Tablo(0, i): Tablo(1, j) = Tablo(1, i): Tablo(2, j) = Tablo(2, i): Tablo(3, j) = Tablo(3, i)
                        Tablo(0, i) = Tmp1: Tablo(1, i) = Tmp2: Tablo(2, i) = Tmp3: Tablo(3, i) = Tmp4
                    End If
                Else
                    If Tablo(C0, i) < Tablo(C0, j) Then
                        Tmp1 = Tablo(0, j): Tmp2 = Tablo(1, j): Tmp3 = Tablo(2, j): Tmp4 = Tablo(3, j)
                        Tablo(0, j) = Tablo(0, i): Tablo(1, j) = Tablo(1, i): Tablo(2, j) = Tablo(2, i): Tablo(3, j) = Tablo(3, i)
                        Tablo(0, i) = Tmp1: Tablo(1, i) = Tmp2: Tablo(2, i) = Tmp3: Tablo(3, i) = Tmp4
                    End If
                End If
                Next j
        ii = ii + 1
        Next i

Me.ListBox1.Column() = Tablo()

End Sub
Merci à tous pour votre aide

Daniel
 

Discussions similaires

Réponses
11
Affichages
286

Statistiques des forums

Discussions
312 193
Messages
2 086 059
Membres
103 110
dernier inscrit
Privé