Tri colonne d'une ListView par valeur Numérique, et non Texte?

YANN-56

XLDnaute Barbatruc
Bonjour à ceux qui passeront par là

Je ne parviens pas à trier une colonne de ma Listview par
la valeur numérique contenue dans les SubItems de celle-ci.

J'ai tenté plein de trucs à l'initialisation, comme "CDec", Diviser par 1000 et c.
En supprimant ".text," en tentant ".Value"… Ploufff

Ci-joint un test de Tri.

Merci d'avance, je suis un peu coincé pour poursuivre une appli.

YANN-56
 

Pièces jointes

  • TRI_LISTVIEW.xls
    34.5 KB · Affichages: 165
  • TRI_LISTVIEW.xls
    34.5 KB · Affichages: 167
  • TRI_LISTVIEW.xls
    34.5 KB · Affichages: 169

Cousinhub

XLDnaute Barbatruc
Re : Tri colonne d'une ListView par valeur Numérique, et non Texte?

Bonjour,

en trichant un peu...

J'ai rajouté une colonne, de largeur 0...

Et dans cette colonne, je transforme la valeur numérique en texte, précédé d'une répétition de "A", en fonction du nombre de caractères présents dans la cellule numérique...

dans l'initialyze :

Code:
Private Sub UserForm_Initialize()
Dim Ws As Worksheet
Set Ws = Worksheets("LISTE")
With UserForm1.ListView1
    .Gridlines = True
    .View = 3
    .CheckBoxes = False
    .MultiSelect = True
    With .ColumnHeaders
        .Add , , "PRODUITS", 120
        .Add , , "NOMBRE", 60, lvwColumnRight
        .Add , , "essai", 0
    End With
    For i = 10 To Ws.Range("A65536").End(xlUp).Row
        .ListItems.Add , , Ws.Cells(i, 1).Value
        .ListItems(UserForm1.ListView1.ListItems.Count).ListSubItems.Add , , Ws.Cells(i, 2).Value
        For j = 1 To Len(Ws.Cells(i, 2).Value)
            x = x & Chr(Mid(Ws.Cells(i, 2), j, 1) + 65)
        Next j
        x = Application.Rept("A", 5 - j) & x
        .ListItems(UserForm1.ListView1.ListItems.Count).ListSubItems.Add , , x
        x = ""
    Next i
End With
End Sub

et dans le tri :

Code:
Private Sub ListView1_ColumnClick(ByVal ColumnHeader As MSComctlLib.ColumnHeader)
With Me.ListView1
    .Sorted = False
    .SortKey = ColumnHeader.Index - 1
    If ColumnHeader.Index = 2 Then .SortKey = ColumnHeader.Index
    If .SortOrder = lvwAscending Then
        .SortOrder = lvwDescending
    Else
        .SortOrder = lvwAscending
    End If
    .Sorted = True
End With
End Sub
 

YANN-56

XLDnaute Barbatruc
Re : Tri colonne d'une ListView par valeur Numérique, et non Texte?

Avec plaisir de recontrer encore une fois bhbh
sur le chemin de mes recherche, et ses aides judicieuses.

Je n'ai pas testé, mais je ne doute que cela fonctionne.

Je m'attendais cependant à plus simple pour que soit considéré
en tant que nombre, et non texte les donnée écrites dans une colonne.

Sans doute VBA ne le permet pas.

Merci beaucoup à toi, d'avoir pris la peine de me répondre,
et bonne fin de journée.

YANN-56
 

YANN-56

XLDnaute Barbatruc
Re : Tri colonne d'une ListView par valeur Numérique, et non Texte?

Bonsoir à ceux qui passeront par là,
et particulièrement à bhbh s'il le fait.

J'ai bidouillé grace à son aide une traduction du
texte en numérique dans la troisième colonne.
permettant ainsi un tri cohérent de la deuxième.

Méthode piquée chez "Boisgontier" dans un autre post.
(En espérant ne pas avoir écorché son nom)

Voici la modif:

Private Sub UserForm_Initialize()

With UserForm1.ListView1
.Gridlines = True
.View = 3
.CheckBoxes = False
.MultiSelect = True

With .ColumnHeaders
.Add , , "PRODUITS", 120
.Add , , "NOMBRE", 40, lvwColumnRight
.Add , , "ALPHA", 0

End With

For i = 10 To Worksheets("LISTE").Range("A65536").End(xlUp).Row

.ListItems.Add , , Worksheets("LISTE").Cells(i, 1).Value

.ListItems(UserForm1.ListView1.ListItems.Count).ListSubItems.Add , , _
Worksheets("LISTE").Cells(i, 2).Value

'=======================================================================
.ListItems(UserForm1.ListView1.ListItems.Count).ListSubItems.Add , , _
Format(Val(Worksheets("LISTE").Cells(i, 2).Value) + 10000, "00000")
'=======================================================================

Next i

End With

End Sub


Private Sub ListView1_ColumnClick(ByVal ColumnHeader As MSComctlLib.ColumnHeader)

'======================================
N°_COLONNE = ColumnHeader.Index - 1
If N°_COLONNE = 1 Then N°_COLONNE = 2
'======================================

UserForm1.ListView1.Sorted = False

UserForm1.ListView1.SortKey = N°_COLONNE

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

UserForm1.ListView1.Sorted = True

End Sub

J'arrive mieux ainsi à me lire.

Merci encore bhbh,
tu m'as poussé vers la bonne voie.

YANN-56

Classeur modifié joint.
 

Pièces jointes

  • TRI_LISTVIEW_2.xls
    40.5 KB · Affichages: 214

kjin

XLDnaute Barbatruc
Re : Tri colonne d'une ListView par valeur Numérique, et non Texte?

Bonsoir,
Avec les données de l'exemple
Code:
Private Sub ListView1_ColumnClick(ByVal ColumnHeader As MSComctlLib.ColumnHeader)
x = ColumnHeader.Index - 1
If x = 1 Then
    For i = 1 To ListView1.ListItems.Count
        ListView1.ListItems(i).ListSubItems(x).Text = _
                Format(ListView1.ListItems(i).ListSubItems(x).Text, "0000")
    Next i
    ListView1.SortKey = x
    Tri
    For i = 1 To ListView1.ListItems.Count
        ListView1.ListItems(i).ListSubItems(x).Text = _
                Format(ListView1.ListItems(i).ListSubItems(x).Text, "0")
    Next i
Else
ListView1.SortKey = ColumnHeader.Index - 1
Tri
End If

End Sub
Sub Tri()
ListView1.Sorted = False
If ListView1.SortOrder = lvwAscending Then
    ListView1.SortOrder = lvwDescending
    Else
    ListView1.SortOrder = lvwAscending
End If
ListView1.Sorted = True

End Sub
A+
kjin
 

YANN-56

XLDnaute Barbatruc
Re : Tri colonne d'une ListView par valeur Numérique, et non Texte?

Bonjour kjin, bhbh, et à ceux qui passeront par là.

Ta méthode intervient après avoir changer les SubItems.
(C'est ainsi que je procède pour traduire les dates numériques)

J'ai encore appris un truc grâce à toi, dont je vais aussi me servir.
Et je t'en remercie beaucoup.

Avec le décalage horaire; dois-je dire bonjour ou bonsoir à bhbh ???

Aujourd'hui, pour une fois, en sud Bretagne, les lunettes de soleil … Hum!

Fin des vacances!

Ne sois pas amère…
Pour un navigateur un Amer est un point de repère à terre.
Tu n'as aucune raison de piquer ton Phare.
Quand je sombre dans les flots profonds de VBA,
je ne suis pas mécontent que l'on me jette une bouée ainsi que tu l'as fait.

Trêve de sottises.

Bravo pour votre compétence.
Plein de bonnes choses à vous. Et Merci encore.

YANN-56
 

Statistiques des forums

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