OVH Cloud OVH Cloud

Tri de chiffres

3 réponses
Avatar
Gg
Bonsoir,
Petite question d'un débutant.
Dans une msflexgrid, je charge a partir d'un petit fichier .txt des données
avec des chiffres en tête de ligne.
Désirant faire un tri descendant ou ascendant sur les chiffres, j'utilise la
fonction SORT.
Le résultat n'est pas vraiment dans l'ordre, j'obtient :
1
10
11
...
2
20
21
22
...
3
etc....

Je peux résoudre le problème en utilisant la fonction FORMAT avec "0000" .
Mais ça m'affiche les zéros (0001 - 0002 etc..)
Pas très sur de ma méthode, y-a-t'il une autre solution?

Par avance Merci
Gg

3 réponses

Avatar
LE TROLL
Bonjour,

Une méthode VB qui t'évite les variables, car plus ténébreux, ça ne se
voit pas directement, soit:

-1- tu prends une liste (list1), propriété sorted=true
-2- De ton fichier txt, à chaque ligne tu récupères le nombre en chaîne
(string), puis pour être certain tu convertis ce nombre (entiers
semble-t-il) en numérique, puis tu le balances dans la liste qui va tes les
trier... soit:

Dim nbStr As String
Dim nbNum As Long
List1.Clear
nbStr = le nombre
nbNum = Val(nbStr)
List1.AddItem nbNum

--------------
Par contre si tu veux la méthode artisanale, il doit y en avoir d'autres
avec la gestion de tableaux:

dim x as long
dim nb() as long
dim trans as long
dim i as long
dim j as long
' tu comptes combien tu as de nombre = x
redim nb(x)
for i = 1 to x
for j = 1 to x-1
if nb(i) > nb(i+1) then
trans = nb(i+1)
nb(i) = nb(i+1)
nb(i+1) = trans
exit for
endif
next j
next i

Fait de tête et non vérifié, si ça plante, dis :o)

--
Merci beaucoup, au revoir et à bientôt :o)
------
Site de MES LOGICIELS
http://irolog.free.fr
Site éditeur MES ROMANS édités
Le serpent
http://www.manuscritdepot.com/a.joseph-attila-pusztay.1.htm
Le Gaulois
http://manuscritdepot.com/a.joseph-attila-pusztay.2.htm
mon adresse EMail
http://irolog.free.fr/ecrire/index.htm
------------------------------------------------------------------------------------
"Gg" a écrit dans le message de news:
4581b254$0$11516$
Bonsoir,
Petite question d'un débutant.
Dans une msflexgrid, je charge a partir d'un petit fichier .txt des
données
avec des chiffres en tête de ligne.
Désirant faire un tri descendant ou ascendant sur les chiffres, j'utilise
la
fonction SORT.
Le résultat n'est pas vraiment dans l'ordre, j'obtient :
1
10
11
...
2
20
21
22
...
3
etc....

Je peux résoudre le problème en utilisant la fonction FORMAT avec "0000" .
Mais ça m'affiche les zéros (0001 - 0002 etc..)
Pas très sur de ma méthode, y-a-t'il une autre solution?

Par avance Merci
Gg





Avatar
Jean-marc
"Gg" a écrit dans le message de news:
4581b254$0$11516$
Bonsoir,
Petite question d'un débutant.
Dans une msflexgrid, je charge a partir d'un petit fichier .txt des
données
avec des chiffres en tête de ligne.
Désirant faire un tri descendant ou ascendant sur les chiffres, j'utilise
la
fonction SORT.
Le résultat n'est pas vraiment dans l'ordre, j'obtient :
1
10
11
...
2
20
21
22
...
3
etc....

Je peux résoudre le problème en utilisant la fonction FORMAT avec "0000" .
Mais ça m'affiche les zéros (0001 - 0002 etc..)
Pas très sur de ma méthode, y-a-t'il une autre solution?




Hello,

c'est parce que tu tries des chaines de caractères et pas des
nombres. Tes chaines sont bien classées en ordre, mais en ordre
lexicographique, comme dans un dictionnaire.
A
AA
ABC
AZE
B
BA
etc.

Il faut donc travailler sur des nombres. Tu peux implémenter
différentes méthodes de tris, en fonciton de tes données,
du nombre de données, etc.

Voici une petite fonction qui te permet en un seul appel
de lire les données de ton fichier et de les récupérer dans
un tableu trié.
Voici:


Option Explicit

Private Sub Command1_Click()

Dim t() As Long
Dim n As Long
Dim bRet As Boolean
Dim i As Long
Dim szFileName As String

szFileName = "c:data.txt"
bRet = GetFromFileAndSort(szFileName, t(), n, 1)
If bRet Then
For i = LBound(t()) To UBound(t())
Debug.Print t(i)
Next i
Else
MsgBox "Erreur."
End If

End Sub

Public Function GetFromFileAndSort(ByVal szFileName As String, _
t() As Long, _
ByRef n As Long, _
ByVal Direction As Integer) As Boolean
Dim f As Integer
Dim szValue As String
Dim value As Variant
Dim curSize As Long


If Dir$(szFileName) <> "" Then
n = -1
f = FreeFile
Open szFileName For Input As #f
While Not EOF(f)
Line Input #f, szValue
If szValue <> "" Then
value = CLng(szValue)
n = n + 1
If n > curSize Then
curSize = (n + 1) * 2
ReDim Preserve t(curSize)
End If
t(n) = value
End If
Wend
Close #f
ReDim Preserve t(n)
If n > 0 Then
SortTab t, Direction
End If
GetFromFileAndSort = True
Else
GetFromFileAndSort = False
End If
End Function

Public Sub SortTab(t() As Long, Direction As Integer)
Dim i As Long
Dim finished As Boolean
Dim mustPermut As Boolean
Dim tmp As Variant

Do
finished = True
For i = LBound(t()) To UBound(t()) - 1
Select Case Direction
Case 1
mustPermut = t(i) > t(i + 1)
Case 2
mustPermut = t(i) < t(i + 1)
End Select
If mustPermut Then
finished = False
tmp = t(i)
t(i) = t(i + 1)
t(i + 1) = tmp
End If
Next i
Loop While Not finished

End Sub

Bonne prog!

--
Jean-marc Noury (jean_marc_n2)
Microsoft MVP - Visual Basic
mailto: remove '_no_spam_' ;
FAQ VB: http://faq.vb.free.fr/
Avatar
Gg
Bonsoir,
Ok, j'ai tout compris....
Avec mes remerciements.
Bon W-E
Gg