optimisation en temps d'exécution d'un tri
Bonjour,
J'ai fait une routine en VBA qui permet de trier les x premières lignes par ordre chronologique (de la date la plus petite a la plus grande). La dernière ligne du champ à trier etant la ligne d'index LastTask.
Les dates se situe dans la première colonne
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35
| Sub switchligne_P(ByVal L1 As Integer, ByVal L2 As Integer) 'Permet d'intervertir 2 lignes
Dim L As Integer
If L1 > L2 Then
L = L1
L1 = L2
L2 = L
End If
Cells(L2, 1).EntireRow.Cut
Cells(L1, 1).EntireRow.Insert Shift:=xlDown
Cells(L1 + 1, 1).EntireRow.Cut
Cells(L2 + 1, 1).EntireRow.Insert Shift:=xlDown
End Sub
LastTask = xxx 'Dernier ligne où doit se finir le trie
'Trie
CurrentLigne = 1
Do While (CurrentLigne < LastTask) 'Si CurrentLigne = LastTask il reste plus qu'une ligne, elle est donc dans l'ordre
LowerDate = Cells(CurrentLigne, 1) 'Par default on considère les task du haut comme celle etant les plus petite date
I_low = CurrentLigne
i = CurrentLigne + 1
Do While (i <= LastTask)
IDate = Cells(i, 1) 'Lit la date de la ligne i
If (LowerDate > IDate) Then 'Verifie que la date de la ligne i n'est pas plus petite
LowerDate = IDate 'Sauvegarde la nouvelle date plus petite
I_low = i
End If
i = i + 1
Loop
If (I_low <> CurrentLigne) Then
switchligne_P CurrentLigne, I_low 'Met la ligne avec le date la plus petite à la place de la ligne courante
End If
CurrentLigne = CurrentLigne + 1
Loop |
le principe de cette alogo est pour chaque ligne de regarder si en de sous il y en a une plus petit. si il y en a une plus petit alors on on interverti le ligne.
Cette routine fonctionne parfaitement mais son temps d'exection et estrêmement lent.
En effet, il utilise deux boucles while imbriqué l'un dans l'autre ce qui n'est pas bon...
Quelqu'un a t'il une idée pour optimiser ce trie de maniere a le rendre plus rapide?
Citation:
1)Cells(L2, 1).EntireRow.Cut
Cells(L1, 1).EntireRow.Insert Shift:=xlDown
2)IDate = Cells(i, 1)
Entre le 1 et 2 ci dessus quel est celui qui prend le plus de temps et combien de fois plus?
:?