Tri données ListView

JORDAN

XLDnaute Impliqué
Bonjour tout le monde,

Je charge une ListView avec des données stockées dans un fichier .Csv avec
le code ci-dessous, maintenant je cherche à trier cette listview par ordre alphabétique
de la 2ème colonne, dès son alimentation, vu que les données de la listview sont modifiées
dès la saisie d'un autre caractère dans la Cbx,

Mais je ne sais pas trop comment faire ça depuis un fichier csv

Auriez-vous une solution pour faire ce tri ??

Par avance merci et bon week-end

Code:
Sub ChargCbxRec()

' ---------------
' Remplir la LVW1
' ---------------
Dim NbreCar As Integer
Dim myFso As Object, StoCsv As Object, CsvLine As String
Dim I As Long
Dim LigneTexte  As String
Dim ColonneTexte As Variant
Dim Ligne As ListItem
Dim J As Integer

On Error Resume Next

Set myFso = CreateObject("Scripting.FileSystemObject")

' Gestion des erreurs
' -------------------
If CbxDes = "" Then
    UsfRec.CBX2.SetFocus
    Exit Sub
End If

' Nombre de caractères dans la CBX2
' ----------------------------------
NbreCar = Len(CbxDes)

' Vider la ListView
' -----------------
UsfRec.LVW1.ListItems.Clear

' Définit le fichier de recherche
' -------------------------------
Set StoCsv = myFso.OpenTextFile("C:\ARCHIVES\STOCK.csv", 1)

' Boucle de recherche
' -------------------
While Not StoCsv.AtEndOfStream

' Stockage des données lues
' -------------------------
    CsvLine = StoCsv.ReadLine

' Conditions de recherche
' -----------------------
    If Left(Split(CsvLine, ";")(1), NbreCar) = CbxDes Then
        If Split(CsvLine, ";")(4) = ChoixRecherche Then
            J = J + 1

' Remplir la LVW1
' --------------------
            ColonneTexte = Split(CsvLine, ";")
            Set Ligne = UsfRec.LVW1.ListItems.Add(, , ColonneTexte(0))

            With UsfRec.LVW1
                .ListItems(J).ListSubItems.Add , , Split(CsvLine, ";")(1)
                .ListItems(J).ListSubItems.Add , , Split(CsvLine, ";")(2)
                .ListItems(J).ListSubItems.Add , , Split(CsvLine, ";")(3)
                .ListItems(J).ListSubItems.Add , , Split(CsvLine, ";")(4)
                .ListItems(J).ListSubItems.Add , , Split(CsvLine, ";")(5)
                .ListItems(J).ListSubItems.Add , , Split(CsvLine, ";")(6)
           End With
        End If
    End If
Wend

' Fermeture du fichier lu
' -----------------------
StoCsv.Close

' Remise à zéro des variables
' ---------------------------
Set StoCsv = Nothing: Set myFso = Nothing: Set Ligne = Nothing

End Sub
 

JORDAN

XLDnaute Impliqué
Re : Tri données ListView

Re,
je viens de faire un essai en rajouant le code suivant
le problème est :
Dès que je laisse la ligne UsfRec.LVW1.Sorted = True
la 1ère colonne est triée, si je retire cette ligne je n ai que l'affichage
de la 1ere colonne sauf la dernière ligne qui est complète

Avez vous une idée d'où provient le problème ??

Merci à vous et bonne soirée

Code:
    UsfRec.LVW1.Sorted = False
    UsfRec.LVW1.SortKey = 1
    UsfRec.LVW1.SortOrder = lvwAscending
    UsfRec.LVW1.Sorted = True
 

Bebere

XLDnaute Barbatruc
Re : Tri données ListView

bonjour Jordan
un code qui devrait t'aider

Private Sub ListView1_ColumnClick(ByVal ColumnHeader As MSComctlLib.ColumnHeader)
ListView1.Sorted = False
ListView1.SortKey = ColumnHeader.Index - 1

If ListView1.SortOrder = lvwAscending Then
ListView1.SortOrder = lvwDescending
Else
ListView1.SortOrder = lvwAscending
End If

ListView1.Sorted = True
End Sub
à bientôt
 

JORDAN

XLDnaute Impliqué
Re : Tri données ListView

Bonjour Bebere, le Forum,

Merci pour ton code
j'avais déjà testé le tri de la ListView par ColumnClick
et cela fonctionnait très bien
Mais dans mon cas je cherche à effectuer le tri sans cliquer
sur une colonne mais automatiquement dès que la ListView change
Bien sur, la fonction ListView1.Change n'existe pas !!
Donc j'ai inséré le code comme ci-dessous, si je tape 1 seule lettre
dans la ComboBox, j'ai bien la colonne de triée et l'affichage de la
ListView est correct
Dès que je tape une seconde lettre dans la ComboBox, il ne reste que
l'affichage de la 1ère colonne, les autres sont vides.

Et là, je ne comprends plus rien, pourquoi les autres colonnes deviennent vides !!

Si vous avez une info, merci à vous

Bonne journée

Code:
Sub ChargCbxRec()

' ------------------------------------
' Remplir le CBX6 et la LVW1
' ------------------------------------

Dim NbreCar As Integer
Dim myFso As Object, StoCsv As Object, CsvLine As String
Dim I As Long
Dim LigneTexte  As String
Dim ColonneTexte As Variant
Dim Ligne As ListItem
Dim J As Integer

On Error Resume Next

Set myFso = CreateObject("Scripting.FileSystemObject")

' Gestion des erreurs
' -------------------
If CbxDes = "" Then
    UsfRec.CBX2.SetFocus
    Exit Sub
End If

' Nombre de caractères dans la CBX6
' --------------------------------------
NbreCar = Len(CbxDes)

' Vider la ListView
' -----------------
UsfRec.LVW1.ListItems.Clear

' Définit le fichier de recherche
' -------------------------------
Set StoCsv = myFso.OpenTextFile("C:\ARCHIVES\STOCK.csv", 1)

' Boucle de recherche
' -------------------
While Not StoCsv.AtEndOfStream

' Stockage des données lues
' -------------------------
    CsvLine = StoCsv.ReadLine

' Conditions de recherche
' -----------------------
    If Left(Split(CsvLine, ";")(1), NbreCar) = CbxDes Then
        If Split(CsvLine, ";")(4) = ChoixRecherche Then
            J = J + 1
            
' Remplir le CBX2
' --------------------
            'UsfRec.CBX2.AddItem Split(CsvLine, ";")(1)

' Remplir la LVW1
' --------------------
            ColonneTexte = Split(CsvLine, ";")
            Set Ligne = UsfRec.LVW1.ListItems.Add(, , ColonneTexte(0))

            With UsfRec.LVW1
                .ListItems(J).ListSubItems.Add , , Split(CsvLine, ";")(1)
                .ListItems(J).ListSubItems.Add , , Split(CsvLine, ";")(2)
                .ListItems(J).ListSubItems.Add , , Split(CsvLine, ";")(3)
                .ListItems(J).ListSubItems.Add , , Split(CsvLine, ";")(4)
                .ListItems(J).ListSubItems.Add , , Split(CsvLine, ";")(5)
                .ListItems(J).ListSubItems.Add , , Split(CsvLine, ";")(6)
           End With
        End If
    End If
Wend

' Fermeture du fichier lu
' -----------------------
StoCsv.Close

' Remise à zéro des variables
' ---------------------------
Set StoCsv = Nothing: Set myFso = Nothing: Set Ligne = Nothing

UsfRec.LVW1.Sorted = False
UsfRec.LVW1.SortKey = 1
UsfRec.LVW1.SortOrder = lvwAscending
UsfRec.LVW1.Sorted = True

End Sub
 

JORDAN

XLDnaute Impliqué
Re : Tri données ListView

Bonjour Skoobi,
je préparais justement un fichier de test
Donc le voici avec aussi STOCK.csv à mettre sous C

pour lancer la macro il faut faire F4
puis saisir P dans la combobox (en majuscule)
jusque là tout va bien
puis saisir une 2eme lettre et là ça beug

Merci à vous
 

Pièces jointes

  • FichierTST.zip
    48.5 KB · Affichages: 62
  • STOCK.zip
    510 bytes · Affichages: 53
  • STOCK.zip
    510 bytes · Affichages: 51
  • STOCK.zip
    510 bytes · Affichages: 56

skoobi

XLDnaute Barbatruc
Re : Tri données ListView

Bonjour Jordan,

Voici la procédure modifiée:

Code:
Sub ChargCbxRec()
  Dim NbreCar As Integer
  Dim myFso As Object, StoCsv As Object, CsvLine As String
  Dim ColonneTexte As Variant
  Dim Ligne As ListItem
  Set myFso = CreateObject("Scripting.FileSystemObject")
  If CbxDes = "" Then
    UserForm1.CBX2.SetFocus
    Exit Sub
  End If
  NbreCar = Len(CbxDes)
  With UserForm1.LVW1
    .ListItems.Clear
[COLOR=black].Sorted = False[/COLOR]
    Set StoCsv = myFso.OpenTextFile("C:\STOCK.csv", 1)
    While Not StoCsv.AtEndOfStream
      CsvLine = StoCsv.ReadLine
      If Left(Split(CsvLine, ";")(1), NbreCar) = CbxDes Then
        ColonneTexte = Split(CsvLine, ";")
        .ListItems.Add , , ColonneTexte(0)
        .ListItems(.ListItems.Count).ListSubItems.Add , , ColonneTexte(1)
        .ListItems(.ListItems.Count).ListSubItems.Add , , ColonneTexte(2)
        .ListItems(.ListItems.Count).ListSubItems.Add , , ColonneTexte(3)
        .ListItems(.ListItems.Count).ListSubItems.Add , , ColonneTexte(4)
        .ListItems(.ListItems.Count).ListSubItems.Add , , ColonneTexte(5)
        .ListItems(.ListItems.Count).ListSubItems.Add , , ColonneTexte(6)
      End If
    Wend
    StoCsv.Close
    Set StoCsv = Nothing: Set myFso = Nothing: Set Ligne = Nothing
    .SortKey = 1
    .SortOrder = lvwAscending
    .Sorted = True
    .View = lvwReport
  End With
End Sub
 

Discussions similaires

Réponses
12
Affichages
572

Membres actuellement en ligne

Statistiques des forums

Discussions
312 294
Messages
2 086 895
Membres
103 404
dernier inscrit
sultan87