Use isto:
Private Sub ListView1_ColumnClick(ByVal ColumnHeader As MSComctlLib.ColumnHeader)
'Usaremos o "Tag" de cada ColumHeader para armazenar
'se a coluna recebe valores:
' = N para Números
' = D para Datas
' = T para Textos
If ColumnHeader.Tag = "N" Then '
SortListView ListView1, ColumnHeader.Index, ldtNumber, OrdAsc
ElseIf ColumnHeader.Tag = "T" Then
SortListView ListView1, ColumnHeader.Index, ldtString, OrdAsc
Else
SortListView ListView1, ColumnHeader.Index, ldtDateTime, True
End If
OrdAsc = Not OrdAsc
End Sub
Private Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long
Private Declare Function LockWindowUpdate Lib "user32" (ByVal hwndLock As Long) As Long
Public Sub SortListView(ListView As ListView, ByVal Index As Integer, _
ByVal DataType As ListDataType, ByVal Ascending As Boolean)
On Error Resume Next
Dim i As Integer
Dim l As Long
Dim strFormat As String
Dim lngCursor As Long
lngCursor = ListView.MousePointer
ListView.MousePointer = vbHourglass
LockWindowUpdate ListView.hwnd
Dim blnRestoreFromTag As Boolean
Select Case DataType
Case ldtString
blnRestoreFromTag = False
Case ldtNumber
strFormat = String$(20, "0") & "." & String$(10, "0")
With ListView.ListItems
If (Index = 1) Then
For l = 1 To .Count
With .Item(l)
.Tag = .Text & Chr$(0) & .Tag
If IsNumeric(.Text) Then
If CDbl(.Text) >= 0 Then
.Text = Format(CDbl(.Text), strFormat)
Else
.Text = "&" & InvNumber(Format(0 - CDbl(.Text), strFormat))
End If
Else
.Text = ""
End If
End With
Next l
Else
For l = 1 To .Count
With .Item(l).ListSubItems(Index - 1)
.Tag = .Text & Chr$(0) & .Tag
If IsNumeric(.Text) Then
If CDbl(.Text) >= 0 Then
.Text = Format(CDbl(.Text), strFormat)
Else
.Text = "&" & InvNumber(Format(0 - CDbl(.Text), strFormat))
End If
Else
.Text = ""
End If
End With
Next l
End If
End With
blnRestoreFromTag = True
Case ldtDateTime
strFormat = "YYYYMMDDHhNnSs"
Dim dte As Date
With ListView.ListItems
If (Index = 1) Then
For l = 1 To .Count
With .Item(l)
.Tag = .Text & Chr$(0) & .Tag
dte = CDate(.Text)
.Text = Format$(dte, strFormat)
End With
Next l
Else
For l = 1 To .Count
With .Item(l).ListSubItems(Index - 1)
.Tag = .Text & Chr$(0) & .Tag
dte = CDate(.Text)
.Text = Format$(dte, strFormat)
End With
Next l
End If
End With
blnRestoreFromTag = True
End Select
ListView.SortOrder = IIf(Ascending, lvwAscending, lvwDescending)
ListView.SortKey = Index - 1
ListView.Sorted = True
If blnRestoreFromTag Then
With ListView.ListItems
If (Index = 1) Then
For l = 1 To .Count
With .Item(l)
i = InStr(.Tag, Chr$(0))
.Text = Left$(.Tag, i - 1)
.Tag = Mid$(.Tag, i + 1)
End With
Next l
Else
For l = 1 To .Count
With .Item(l).ListSubItems(Index - 1)
i = InStr(.Tag, Chr$(0))
.Text = Left$(.Tag, i - 1)
.Tag = Mid$(.Tag, i + 1)
End With
Next l
End If
End With
End If
LockWindowUpdate 0&
ListView.MousePointer = lngCursor
End Sub