listview string karakter sıralama sorunu

Katılım
15 Ocak 2007
Mesajlar
791
Excel Vers. ve Dili
2003 excel visual basic
arkadaşlar ve üstadlar selamlar
uzun bir süredir uğraştığım Listview nesnesinde sıralama yaparken değerler sayı veya tarih olmasına rağmen string karakter olarak sıralaması bir belaydı açıkçası :D birkaç siteyi araştırdığımda şöyle bir çözüm yolu sunulmuş.Link aşağıda yer almaktadır.bu kodlar VBE için yazıldığında excel kullanıcıları için çalışırken problem açar.kodları excel için revize ettiğimde bilgi vereceğim iyi çalışmalar...
http://www.programlama.com/sys/c2html/view.php3?DocID=2015
 
Katılım
15 Haziran 2007
Mesajlar
115
Excel Vers. ve Dili
2003 Türkçe
Günaydın Emrexcel123,
Açıklamanızdan anladığım, Listview de sayıları ve tarih sütunları mı hatalı sıralanıyor? Eğer öyle ise aşağıdaki kodu dener misiniz?

Formun orijinalini http://silkyroad.developpez.com/VBA/ListView/ adresinden indirebilirsin, çok kullanışlı ve hoş yapılmış.

Private Sub ListView1_ColumnClick(ByVal ColumnHeader As MSComctlLib.ColumnHeader)
Dim i As Integer, j As Integer
Dim strFormat As String
Dim x As Integer


Select Case ColumnHeader.Index - 1

' ------ Tri d'une colonne contenant des Dates -------
Case 2, 3 'les colonnes 3 et 4 contiennent les dates de création et modification

ListView1.Sorted = False
ListView1.SortKey = ColumnHeader.Index - 1

'Boucle sur toutes les lignes
For i = 1 To ListView1.ListItems.Count

'Passage des données au format décimal
ListView1.ListItems(i).ListSubItems(ColumnHeader.Index - 1).Text = _
CDec(CDate(ListView1.ListItems(i). _
ListSubItems(ColumnHeader.Index - 1).Text))
Next i

' ------ Application du tri -----------
If ListView1.SortOrder = lvwAscending Then
ListView1.SortOrder = lvwDescending
Else
ListView1.SortOrder = lvwAscending
End If

ListView1.Sorted = True
'--------------------------------------

'Boucle sur toutes les lignes
For i = 1 To ListView1.ListItems.Count
'Ensuite on revient au format DD/MM/YYYY
ListView1.ListItems(i).ListSubItems(ColumnHeader.Index - 1).Text = _
Format(CDate(ListView1.ListItems(i).ListSubItems _
(ColumnHeader.Index - 1).Text), "DD/MM/YYYY")
Next i


' ------ Tri d'une colonne contenant des valeurs numériques -------
Case 1 'la 2eme colonne contient la taille des fichiers

'
'source:
'http://www.experts-exchange.com/Programming/
'Programming_Languages/Visual_Basic/Q_10235567.html
'

x = ColumnHeader.Index - 1
strFormat = String$(20, "0") & "." & String$(10, "0")

ListView1.Sorted = False
ListView1.SortKey = x


If ColumnHeader.Index = 1 Then
'Boucle sur toutes les lignes pour passage en format "triable"
For i = 1 To ListView1.ListItems.Count
ListView1.ListItems(i).Tag = ListView1.ListItems(i).Text

If CDbl(ListView1.ListItems(i).Text) >= 0 Then
ListView1.ListItems(i).Text = _
Format(CDbl(ListView1.ListItems(i).Text), strFormat)
Else
ListView1.ListItems(i).Text = "&" & _
InvNumber(Format(0 - _
CDbl(ListView1.ListItems(i).Text), strFormat))
End If
Next i
'------------------------------------------------------------

' ------ Application du tri -----------
If ListView1.SortOrder = lvwAscending Then
ListView1.SortOrder = lvwDescending
Else
ListView1.SortOrder = lvwAscending
End If

ListView1.Sorted = True
'--------------------------------------

'Boucle sur toutes les lignes pour remise au format initial
For i = 1 To ListView1.ListItems.Count
ListView1.ListItems(i).Text = ListView1.ListItems(i).Tag
Next i

Else

'Boucle sur toutes les lignes pour passage en format "triable"
For i = 1 To ListView1.ListItems.Count
ListView1.ListItems(i).ListSubItems(x).Tag = _
ListView1.ListItems(i).ListSubItems(x).Text

If CDbl(ListView1.ListItems(i).ListSubItems(x).Text) >= 0 Then
ListView1.ListItems(i).ListSubItems(x).Text = _
Format(CDbl(ListView1.ListItems(i). _
ListSubItems(x).Text), strFormat)
Else
ListView1.ListItems(i).ListSubItems(x).Text = "&" & _
InvNumber(Format(0 - CDbl(ListView1.ListItems(i). _
ListSubItems(x).Text), strFormat))
End If
Next i
'--------------------------------------------------

' ------ Application du tri -----------
If ListView1.SortOrder = lvwAscending Then
ListView1.SortOrder = lvwDescending
Else
ListView1.SortOrder = lvwAscending
End If

ListView1.Sorted = True
'--------------------------------------

'Boucle sur toutes les lignes pour remise au format initial
For i = 1 To ListView1.ListItems.Count
ListView1.ListItems(i).ListSubItems(x).Text = _
ListView1.ListItems(i).ListSubItems(x).Tag
Next i

End If


' ------ Tri des colonnes contenant du texte -------
Case Else
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 Select
End Sub


Private Function InvNumber(ByVal Number As String) As String
Static i As Integer
For i = 1 To Len(Number)
Select Case Mid$(Number, i, 1)
Case "-": Mid$(Number, i, 1) = " "
Case "0": Mid$(Number, i, 1) = "9"
Case "1": Mid$(Number, i, 1) = "8"
Case "2": Mid$(Number, i, 1) = "7"
Case "3": Mid$(Number, i, 1) = "6"
Case "4": Mid$(Number, i, 1) = "5"
Case "5": Mid$(Number, i, 1) = "4"
Case "6": Mid$(Number, i, 1) = "3"
Case "7": Mid$(Number, i, 1) = "2"
Case "8": Mid$(Number, i, 1) = "1"
Case "9": Mid$(Number, i, 1) = "0"
End Select
Next
InvNumber = Number
End Function
 
Üst