Classificar Listview VBA

Aprenda como fazer

Nesse vídeo demonstro como é possível ordenar dados de uma coluna de um listview, seja por ordem alfabética, ordem numérica ou por data.

Private Sub ListView1_ColumnClick(ByVal ColumnHeader As MSComctlLib.ColumnHeader)

Dim Item            As ListItem
Dim j, f, i         As Long
Dim k               As Variant

    ' Ordenação por datas
    If ColumnHeader.Index = 2 Then
        For i = 1 To ListView1.ListItems.Count
            ListView1.ListItems(i).ListSubItems(ColumnHeader.Index - 1).Text = _
            CDec(CDate(ListView1.ListItems(i).ListSubItems(ColumnHeader.Index - 1).Text))
        Next i
    End If
    
    
    'Ordenação por Valor
    If ColumnHeader.Index = 4 Then
    
        With ListView1
            
            For i = 1 To ListView1.ListItems.Count
                For j = i + 1 To ListView1.ListItems.Count
                    
                    If Val(.ListItems(i).ListSubItems(ColumnHeader.Index - 1)) > Val(.ListItems(j).ListSubItems(ColumnHeader.Index - 1)) Then
                        
                            k = ListView1.ListItems(i).Text
                            ListView1.ListItems(i).Text = ListView1.ListItems(j).Text
                            ListView1.ListItems(j).Text = k
                            
                        For f = 1 To ListView1.ColumnHeaders.Count - 1
                            k = ListView1.ListItems(i).ListSubItems(f)
                            ListView1.ListItems(i).ListSubItems(f).Text = ListView1.ListItems(j).ListSubItems(f).Text
                            ListView1.ListItems(j).ListSubItems(f).Text = k
                        Next f
                        
                    End If
                Next j
            Next i
            
        End With
        
        Exit Sub
    End If

    
    
    
    
    With ListView1
        .SortKey = ColumnHeader.Index - 1
        .Sorted = True
        If .SortOrder = lvwDescending Then
            .SortOrder = lvwAscending
        Else
            .SortOrder = lvwDescending
        End If
    End With
    
    
    
    If ColumnHeader.Index = 2 Then
        For i = 1 To ListView1.ListItems.Count
            ListView1.ListItems(i).ListSubItems(ColumnHeader.Index - 1).Text = _
            Format(CDate(ListView1.ListItems(i).ListSubItems(ColumnHeader.Index - 1).Text), "DD/MM/YYYY")
        Next i
    End If

End Sub