XL 2010 Résolu par la communauté : Tri bcp trop long

Usine à gaz

XLDnaute Barbatruc
Supporter XLD
Bonjour toutes et à tous,

Comme dirait mon cher Marcel, je suis toujours sur mon "chef d'œuvre" de fichier <LOL
D'ailleurs, je rectifie car en fait c'est votre "chef d'œuvre" à toutes et tous.
Et je n'ai pas de "Merci" assez gros pour vous en remercier :)

Mon fichier est plutôt gros, environ 2 mégas et plus de 20.000 lignes bientôt avec une dizaine de formules plutôt longues par ligne (donc plus de 200.000 formules).
Exemple :
Code:
=SI(L1="Bientôt";CONCATENER(AN5;" ";"               à traiter");
SI(L1="Rappels ";CONCATENER(AM5;" ";"               à traiter");
SI(L1="OK";CONCATENER(AL5;" ";"               à traiter");
SI(L1="URGENTS";CONCATENER(AK5;" ";"               à traiter");
SI(L1="ROKR";CONCATENER(AJ5;" ";"               à traiter");
SI(L1="toutbon";CONCATENER(AG5;" ";"               à traiter");
CONCATENER($AF$5-AI5;" ";"               à traiter")))))))

J'ai un gros souci de tris qui sont très longs (plus d'une minute).
Et, pour nos sélections, nous trions tout le temps.

Voici un aperçu de l'un d'entres eux :
Code:
Sub DatesRappelsOKRdV()
    Application.EnableEvents = False
    Application.ScreenUpdating = False
    Application.Calculation = xlManual
    Sheets("SuivisAppels").Select
 
    If [y5] = "oubli" Then
     Call Blocage
    Exit Sub
    End If
 
    ActiveSheet.Unprotect Password:=""
    Range("E3").Select
    ActiveCell.FormulaR1C1 = 1
 
    Rows("7:20000").Select
    Selection.EntireRow.Hidden = False
    Dim I As Long
    For I = 7 To Cells(Rows.Count, 33).End(xlUp).Row '7 = n° ligne - 33 = n° col
    Rows(I).Hidden = Not Cells(I, 33) = Range("E3") 'n° client "à faire"
    Range("l1").Select
    ActiveCell.FormulaR1C1 = "Rappels URGENTS OK RdV"
    Next I
 
    Range("E3").Select
    ActiveCell.FormulaR1C1 = "OK RdV - Rappelez vite"
    '1er tri ordre n° clients
    Rows("7:20000").Select
    ActiveWorkbook.Worksheets("SuivisAppels").Sort.SortFields.Clear
    ActiveWorkbook.Worksheets("SuivisAppels").Sort.SortFields.Add Key:=Range("t7:t20000"), _
        SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
    With ActiveWorkbook.Worksheets("SuivisAppels").Sort
        .SetRange Range("A7:BZ20000")
        .Header = xlGuess
        .MatchCase = False
        .Orientation = xlTopToBottom
        .SortMethod = xlPinYin
        .Apply
    End With
 
    '2e3e tri ordre dates
    Rows("7:20000").Select
    ActiveWorkbook.Worksheets("SuivisAppels").Sort.SortFields.Clear
    ActiveWorkbook.Worksheets("SuivisAppels").Sort.SortFields.Add Key:=Range("ag7:ag20000") _
        , SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
    With ActiveWorkbook.Worksheets("SuivisAppels").Sort
        .SetRange Range("A7:BBZ20000")
        .Header = xlGuess
        .MatchCase = False
        .Orientation = xlTopToBottom
        .SortMethod = xlPinYin
        .Apply
    End With
    ActiveSheet.Protect Password:="", DrawingObjects:=True, Contents:=True, Scenarios:=True
    ActiveSheet.EnableSelection = xlNoRestrictions
    Call Remonte
    Application.EnableEvents = True
    Application.ScreenUpdating = True
    Application.Calculation = xlAutomatic
End Sub

je cherche une solution que je ne trouve pas.

Si quelqu'un a une idée, ce serait super ;)
Ne pouvant pas reproduite le souci sur un "petit" fichier test, je ne peux pas joindre de fichier.

Espérant être clair (ce qui ne semble pas être mon point fort LOL),
Je reste à écoute.

Avec mes remerciements, je vous souhaite, à toutes et à tous, un bon dimanche.
Amicalement,
Lionel,
 

Lone-wolf

XLDnaute Barbatruc
Bonjour Lionel :)

Il faut nettoyer ton code mon cher Marcel, par-ce que avec tous ces Select, ça doit fumer gros chez vous :D

Regarde combien de fois tu sélectionne Rows("7:20000") au lieu de mettre With Range("a7:a20000") > le code qui va avec End With par exemple. Sans compter le reste.

Pas besoin de : ActiveWorkbook.Worksheets("SuivisAppels"), si tu est sur la feuille
With Sheets("SuivisAppels") suffit amplement.
 

Lone-wolf

XLDnaute Barbatruc
Re

Je vais voir avec le With. C'est qui encore celle-là?! o_O With Ney Huston??? :D

VB:
Sub test()
    Application.ScreenUpdating = False
    With ActiveSheet
        .Rows("7:20000").Hidden = IIf(.Rows("7:20000").Hidden, False, True)
    End With
End Sub
 
Dernière édition:

TooFatBoy

XLDnaute Barbatruc
Il faut nettoyer ton code mon cher Marcel, par-ce que avec tous ces Select, ça doit fumer gros chez vous :D
Je ne suis pas certain que le code soit de moi car je ne me rappelle pas de ça, mais qu'il soit de moi ou pas ne change rien au fait que moins on utilise les "Select" mieux on se porte.

Du moins c'est ma façon de voir les choses car ça oblige à sélectionner la feuille où on veut faire les "Select", et ça prend un temps fou.
On peut réduire ce temps perdu pour rien en bloquant le rafraichissement de l'affichage d'Excel, mais le mieux est tout de même d'éviter les "Select". ;)
 

mapomme

XLDnaute Barbatruc
Supporter XLD
Bonjour à tous,

Re

Je vais voir avec le With. C'est qui encore celle-là?! o_O With Ney Huston??? :D

VB:
Sub test()
    Application.ScreenUpdating = False
    With ActiveSheet
        .Rows("7:20000").Hidden = IIf(.Rows("7:20000").Hidden, False, True)
    End With
End Sub

N'est ce pas plus simple et compréhensible d'écrire ?:
VB:
    With ActiveSheet
      .Rows("7:20000").Hidden = Not .Rows("7").Hidden
    End With
 
Dernière édition:

Usine à gaz

XLDnaute Barbatruc
Supporter XLD
Bonjnour Lone,
Bonjour Marcel,
Bonjour mapomme,
Bonjour à toutes et à tous,

Marcel, je n'ai pas dit que tu avais écrit mon code mais juste que tu avais qualifié mon classeur de "Chef d'oeuvre" LOL,
Lone et mapomme
J'ai résolu mon souci en adaptant un code de MichD donné sur un autre fil :
Code:
Sub test()
With Worksheets("Feuil1") 'Nom feuille à adapter au besoin
   With .Range("A1:A" & .Range("A65536").End(xlUp).Row)
        .Sort key1:=.Item(1, 1), order1:=xlAscending, Header:=xlNo
    End With
    With .Range("B1:B" & .Range("B65536").End(xlUp).Row)
        .Sort key1:=.Item(1, 1), order1:=xlAscending, Header:=xlNo
    End With
End With
End Sub
mais je n'ai pas compris cette partie du code : ".Sort key1:=.Item(1, 1), "

Merci à tous d'avoir été là,
Bonne journée,
Amicalement,
Lionel,
 

mapomme

XLDnaute Barbatruc
Supporter XLD
Bonjour Lone-wolf,

.item(i,j) désigne la cellule de la ligne i et de la colonne j du range où on applique la propriété item.
La base est la première cellule du range. i et j peuvent être nul ou négatifs.

Pour:
With .Range("A1:A" & .Range("A65536").End(xlUp).Row)
.Sort key1:=.Item(1, 1), order1:=xlAscending, Header:=xlNo
End With
.item(1,1) désigne la cellule A1

Pour:
With .Range("B1:B" & .Range("B65536").End(xlUp).Row)
.Sort key1:=.Item(1, 1), order1:=xlAscending, Header:=xlNo
End With
.item(1,1) désigne la cellule B1
 
Dernière édition:

Usine à gaz

XLDnaute Barbatruc
Supporter XLD
Bonjour mapomme,

Je n'arrive pas à comprendre.
J'utilise le code en essayant de trier toutes mes lignes complètes, base du trie sur colonne H.

Je n'y arrive pas, il me trie que la colonne A
Et je ne vois pas où est mon erreur.
Voici le code :
Code:
Sub Macro1()
With Worksheets("Feuil1") 'Nom feuille à adapter au besoin
With .Range("a12:a" & .Range("h65536").End(xlUp).Row)
        .Sort key1:=.Item(1, 1), order1:=xlAscending, Header:=xlNo
    End With
    End With
End Sub
Sub Macro2()
With Worksheets("Feuil1") 'Nom feuille à adapter au besoin
With .Range("a12:a" & .Range("h65536").End(xlUp).Row)
        .Sort key1:=.Item(1, 1), order1:=xlDescending, Header:=xlNo
    End With
    End With
End Sub

Je joins le fichier test.

Merci d'être encore sur le fil ;)
Amicalement,
Lionel,
 

Pièces jointes

  • Test tri.xlsm
    19.7 KB · Affichages: 27

mapomme

XLDnaute Barbatruc
Supporter XLD
Re,

Voir le fichier joint (macro11 et macro22).

Ta macro:
Sub Macro1()
With Worksheets("Feuil1") 'Nom feuille à adapter au besoin
With .Range("a12:a" & .Range("h65536").End(xlUp).Row)
.Sort key1:=.Item(1, 1), order1:=xlAscending, Header:=xlNo
End With
End With
End Sub

"a12:a" ne désigne que la colonne A. On ne va pas jusqu'à la colonne H. Il faut écrire "a12:h"

.Item(1, 1) désigne la cellule A12. Or on veut trier sur la colonne H. On peut écrire à la place de .item(1,1) l'expression plus compréhensible .Cells(12,"h")
 

Pièces jointes

  • arthour973- Test tri- v1.xlsm
    18.4 KB · Affichages: 25
Dernière édition:

Discussions similaires

Réponses
3
Affichages
550
Réponses
11
Affichages
396

Statistiques des forums

Discussions
311 720
Messages
2 081 926
Membres
101 842
dernier inscrit
seb0390