Ceci est une page optimisée pour les mobiles. Cliquez sur ce texte pour afficher la vraie page.

Tri avec sort plus rapide ?

ccdouble6

XLDnaute Occasionnel
Bonjour le forum,
Cela fait un moment que je n'ai plus posté ici, mais aussi un moment que je réussis à trouver toutes mes réponses en cherchant lisant, apprenant et... adaptant
Merci au passage pour tout ce boulot que vous accomplissez, vous êtes énormes :O

Alors voilà que je sèche sur une question de... vitesse d'éxécution.
J'ai Excel 2007 et un tableau enregistré en xlsb,
de 3000 lignes (de 31 à 3030) dont déjà 400 de renseignées,
et 500 colonnes dont de très nombreuses vides (remplissables à l'avenir).

Je souhaite trier ces 3000 lignes par les données d'une colonne qui peut varier,
dont le n° se met en L27C271 (donc le type de donnée peut varier aussi, entre numérique, alphanum, texte simple et date).
Etant donné que dans le futur certaines lignes pourront avoir des "trous", je préfère d'emblée trier les 3000 au lieu de faire compiler jusqu'à la première ligne vide, d'où ce que j'ai appelé le tri zéro, à partir de la colonne 270 qui indique par formule si la ligne a un trou (renvoie 0) ou non (renvoi 1).

Le texte que j'ai mis ci-dessous marche très bien, mais la durée prend entre 6 et 10 secondes sur mon ordi. Je me demande donc s'il y a un moyen de réduire cette durée rien que par le texte.
(J'ai lu des algorithmes Quicksort, Shell, qui sont intéressants mais très très denses, et me déciderai à les décortiquer si vraiment il n'y a pas d'autre moyen. J'avance trèèès lentement et veux vraiment pouvoir maîtriser et comprendre ce que je fais, et avec ces algos j'ai peur d'être noyé :s )

Quelqu'un peut-il donc me corriger svp ?
Voici le texte :

Sub Do_TriSimpleC1()
'Tri CROISSANT sur la colonne 271
'ACTION PAR BOUTON
Dim ifin As Integer 'nb lignes limite
Dim j As Integer
Dim n As Integer
Dim plage As Range

'Affectations
ifin = 3030
j = 271
n = Cells(27, j).Value 'col source
Set plage = Range(Cells(31, 1), Cells(ifin, 500))

'----DEPART----
Application.EnableEvents = False
Application.ScreenUpdating = False
Application.Calculation = xlCalculationManual
'TRI ZERO: col 270, puis TRI FINAL
plage.Sort Key1:=Cells(31, 270), Order1:=xlDescending, _
Key2:=Cells(31, n), Order1:=xlAscending, _
Header:=xlGuess, OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom
Application.Calculation = xlCalculationAutomatic
Application.ScreenUpdating = True
Application.EnableEvents = True
End Sub

Toutes les idées seront les bienvenues
bonne journée !
Ced.
 

job75

XLDnaute Barbatruc
Bonjour ccdouble6,

Votre macro ne fait qu'une seule chose : le tri d'un tableau sur 2 colonnes.

A mon avis il n'y a rien qui puisse faire gagner du temps sur cette opération très simple.

La durée d'exécution est fonction de la taille du tableau.

A+
 

job75

XLDnaute Barbatruc
Re,

Il est très possible que la durée d'exécution un peu longue provienne du recalcul des formules.

Pour vérifier encadrez les instructions comme ceci :
Code:
t = Timer
plage.Sort Key1:=Cells(31, 270), Order1:=xlDescending, _
Key2:=Cells(31, n), Order1:=xlAscending, _
Header:=xlGuess, OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom
MsgBox "Tri en " & Timer - t & " seconde(s)"
t = Timer
Application.Calculation = xlCalculationAutomatic
MsgBox "Recalcul en " & Timer - t & " seconde(s)"
Merci de nous donner les 2 résultats chez vous.

A+
 

ccdouble6

XLDnaute Occasionnel
Bonjour Job75,
Merci pour ces précisions,
j'ai appliqué le timer :
tri en 6.425 s
recalcul en 0.156 s

c'est dommage que je ne puisse gagner plus de temps,
mais je suis déjà content que mon texte soit au top
Merci et bonne soirée !
 

Discussions similaires

Les cookies sont requis pour utiliser ce site. Vous devez les accepter pour continuer à utiliser le site. En savoir plus…