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
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.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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
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?
Entre le 1 et 2 ci dessus quel est celui qui prend le plus de temps et combien de fois plus?1)Cells(L2, 1).EntireRow.Cut
Cells(L1, 1).EntireRow.Insert Shift:=xlDown
2)IDate = Cells(i, 1)
![]()
Partager