RE:listview ordenado por cabecera
Yo utilizo este codigo que consegui en internet es un poco largo pero funciona con cualquier tipo de datos, Texto, numeros y fechas.. espero que te sirva
Private Sub lsvAvisosVIP_ColumnClick(ByVal ColumnHeader As MSComctlLib.ColumnHeader)
With lsvAvisosVIP
Dim I As Long
Dim Formato As String
Dim strData() As String
Dim Columna As Long
Columna = ColumnHeader.Index - 1
Select Case UCase(.ColumnHeaders.Item(ColumnHeader.Index).Tag)
Case "DATE"
Formato = "YYYYMMDDHhNnSs"
With .ListItems
If (Columna > 0) Then
For I = 1 To .Count
With .Item(I).ListSubItems(Columna)
.Tag = .Text & Chr$(0) & .Tag
If IsDate(.Text) Then
.Text = Format(CDate(.Text), Formato)
Else
.Text = ""
End If
End With
Next I
Else
For I = 1 To .Count
With .Item(I)
.Tag = .Text & Chr$(0) & .Tag
If IsDate(.Text) Then
.Text = Format(CDate(.Text), Formato)
Else
.Text = ""
End If
End With
Next I
End If
End With
.SortOrder = (.SortOrder + 1) Mod 2
.SortKey = ColumnHeader.Index - 1
.Sorted = True
With .ListItems
If (Columna > 0) Then
For I = 1 To .Count
With .Item(I).ListSubItems(Columna)
strData = Split(.Tag, Chr$(0))
.Text = strData(0)
.Tag = strData(1)
End With
Next I
Else
For I = 1 To .Count
With .Item(I)
strData = Split(.Tag, Chr$(0))
.Text = strData(0)
.Tag = strData(1)
End With
Next I
End If
End With
Case "NUMBER"
Formato = String(30, "0") & "." & String(30, "0")
With .ListItems
If (Columna > 0) Then
For I = 1 To .Count
With .Item(I).ListSubItems(Columna)
.Tag = .Text & Chr$(0) & .Tag
If IsNumeric(.Text) Then
If CDbl(.Text) >= 0 Then
.Text = Format(CDbl(.Text), Formato)
Else
.Text = "&" & InvNumber(Format(0 - CDbl(.Text), Formato))
End If
Else
.Text = ""
End If
End With
Next I
Else
For I = 1 To .Count
With .Item(I)
.Tag = .Text & Chr$(0) & .Tag
If IsNumeric(.Text) Then
If CDbl(.Text) >= 0 Then
.Text = Format(CDbl(.Text), Formato)
Else
.Text = "&" & InvNumber(Format(0 - CDbl(.Text), Formato))
End If
Else
.Text = ""
End If
End With
Next I
End If
End With
.SortOrder = (.SortOrder + 1) Mod 2
.SortKey = ColumnHeader.Index - 1
.Sorted = True
With .ListItems
If (Columna > 0) Then
For I = 1 To .Count
With .Item(I).ListSubItems(Columna)
strData = Split(.Tag, Chr$(0))
.Text = strData(0)
.Tag = strData(1)
End With
Next I
Else
For I = 1 To .Count
With .Item(I)
strData = Split(.Tag, Chr$(0))
.Text = strData(0)
.Tag = strData(1)
End With
Next I
End If
End With
Case Else
.SortOrder = (.SortOrder + 1) Mod 2
.SortKey = ColumnHeader.Index - 1
.Sorted = True
End Select
End With
lsvAvisosVIP.Refresh
End Sub