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.
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.