Microsoft 365 filtrages temps exécution très long

Usine à gaz

XLDnaute Barbatruc
Bonjour à toutes et à tous,
J'ai un gros problème de tris que je ne parviens pas à résoudre malgré mes recherches et mes tentatives.
Je me permets de me tourner une fois de plus vers vous pour demander de l'aide.

Procédure
Mon fichier de travail contient beaucoup de lignes (environ 60.000 actuellement) que je dois classer ,en fonction des urgences de rappels.
Si mon souci retient votre attention, vous le verrez dans le classeur test joint, il y a 5 types de classements des appels (+ Afficher toutes les lignes).
A appeler URGENT :
- aujourd’hui,

A appeler BIENTÔT :
- dép. A Rapp (dates dépassées sur rappels à faire),
- dép. Rép. (dates dépassées sur Répondeurs),
- OK RdV (vendeurs ayant donné le OK RdV au Rappel),
- les autres (s/A Rapp. et Repond.).

J'ai 5 boutons pour les tris permettant d'afficher UNIQUEMENT les lignes de rappels.
Bien évidemment les lignes des rappels URGENTS sont priorisées.

Pour afficher les lignes voulues, j'ai codé en filtrage avec classement (macros AffichageSuivisAppels).

Si je supprime les formatages de toutes les lignes à partir de la ligne 7 ... plus de problème les filtrages sont instantanés.

Mais, afin de pouvoir avoir une visibilité minimum pour consulter une ligne avant appel, , je dois conserver le formatage des lignes pour les colonnes :
- J N° Client,
- S commentaires après appels,
- T et V Dates de rappels,
- X situation au dernier appel,

Et là, ça ne va plus du tout, les filtrages sont très longs et cela me cause une perte de temps très importante.
Je me suis permis de joindre un fichier test "un peu gros" environ 6.500 lignes.
Si vous testez, vous pourrez constater les temps de filtrages pour 6.500 lignes.
Alors vous pourrez imaginer pour 60.000 et plus.

En espérant avoir été clair (il m'arrive souvent de ne pas l'être LOL), je joins le fichier test dans l'espoir d'une solution :)
Un grand merci déjà pour m'avoir lu.

Je vous souhaite une bonne fin de dimanche.
Amicalement,
lionel,
 

Pièces jointes

  • tris_test4.xlsm
    908.2 KB · Affichages: 25
Solution
Bonjour Lionel, le forum,
Je fais ce filtrage des dizaines de fois par jour et 10 secondes c'est vraiment trop long.
Alors en effet il faut effacer tous les formats de la ligne 7 jusqu'à la dernière ligne de la feuille.

Et les recréer ensuite sur les lignes du VisibleRange, voyez ce fichier (2) et ces 2 macros :
VB:
Sub Filtrer(critere As Range)
Trie_Ttlignes
[6:6].AutoFilter
[6:6].AutoFilter Field:=24, Criteria1:=[E3] 'Field:=1 colonne filtrage
[X1] = "=""Affiché""&""                          ""&SUBTOTAL(103,R[6]C:R[99999]C)"
[V1] = "=IF(R5C35>0,R5C35,""O"")"
[AA5] = "=COUNTIF(C[-3],""" & critere & """)"
lig = 0
VisibleRangeFormat
End Sub

Sub VisibleRangeFormat()
Dim col%, P As Range
If ActiveWindow.ScrollRow <> lig And...

job75

XLDnaute Barbatruc
Bonsoir Lionel, sylvanu,

Dans le fichier joint j'ai fait du ménage sur tes 6 macros.

Tu faisais un tri après chaque filtrage... Ne sachant pas pourquoi j'ai supprimé tous les tris.

A+
 

Pièces jointes

  • tris_test4(1).xlsm
    904.9 KB · Affichages: 10

Usine à gaz

XLDnaute Barbatruc
Bonsoir Gérard,
Une fois de plus merci à toi de m'avoir répondu :)

Effectivement, partant du principe que les lignes sont classées à l'ouverture par date de rappel ( col T), il n'est peut-être pas utile de refaire un tri après chaque filtrage (sauf peut-être si après appel, la nouvelle date de rappel prévue laisse la ligne dans la même catégorie filtrée ... à voir).
Mais, même trie supprimé, ça reste trop long ... bcp trop long.

Toutefois ta remarque, judicieuse "comme toujours lol", m'a fait penser à ceci :

Puisque si les formats des lignes sont supprimés et qu'alors les filtrages sont instantanés.
Je pourrais dé-formater les lignes, faire le filtrage souhaité et re-formater UNIQUEMENT les lignes affichées après après filtrage.

Je vais voir ça ...
Merci Gérard pour ton intervention :)
lionel,
 

Usine à gaz

XLDnaute Barbatruc
Re-Gérard,

Je fais ce filtrage des dizaines de fois par jour et 10 secondes c'est vraiment trop long.
Mais comme je le dis dans mon précédent message, ce que tu m'as dit m'a fait penser à :
Dé-formater les lignes, faire le filtrage souhaité et re-formater UNIQUEMENT les lignes affichées après après filtrage.

Trop fatigué pour ce soir, je pense que je verrai cela demain et je te tiendrai informé.
Bonne nuit Gérard ... et à toutes et à tous,
lionel,
 

job75

XLDnaute Barbatruc
Bonjour Lionel, le forum,
Je fais ce filtrage des dizaines de fois par jour et 10 secondes c'est vraiment trop long.
Alors en effet il faut effacer tous les formats de la ligne 7 jusqu'à la dernière ligne de la feuille.

Et les recréer ensuite sur les lignes du VisibleRange, voyez ce fichier (2) et ces 2 macros :
VB:
Sub Filtrer(critere As Range)
Trie_Ttlignes
[6:6].AutoFilter
[6:6].AutoFilter Field:=24, Criteria1:=[E3] 'Field:=1 colonne filtrage
[X1] = "=""Affiché""&""                          ""&SUBTOTAL(103,R[6]C:R[99999]C)"
[V1] = "=IF(R5C35>0,R5C35,""O"")"
[AA5] = "=COUNTIF(C[-3],""" & critere & """)"
lig = 0
VisibleRangeFormat
End Sub

Sub VisibleRangeFormat()
Dim col%, P As Range
If ActiveWindow.ScrollRow <> lig And ActiveWorkbook.Name = ThisWorkbook.Name And UCase(ActiveSheet.Name) = "SUIVISAPPELS" Then
    lig = ActiveWindow.ScrollRow
    Application.ScreenUpdating = False
    ActiveSheet.Protect Password:="", UserInterfaceOnly:=True
    Rows("7:100000").ClearFormats 'RAZ
    Set P = Intersect(ActiveWindow.VisibleRange.EntireRow, Range("A7:A100000")).SpecialCells(xlCellTypeVisible).EntireRow
    For col = 1 To 29
        With Intersect(Columns(col), P)
            If col < 27 Then .Borders.Weight = xlHairline: .VerticalAlignment = xlCenter
            Select Case col
                Case 2: .VerticalAlignment = xlTop: .Orientation = xlVertical
                Case 5, 20, 22: .NumberFormat = "dd mm yyyy hh:mm": .WrapText = True: .ShrinkToFit = True: .HorizontalAlignment = xlCenter
                Case 19, 24: .WrapText = True
                Case 29: .Interior.Color = 15592941 'gris clair
            End Select
        End With
    Next
End If
On Error Resume Next
Application.OnTime t, "VisibleRangeFormat", , False
t = Now + 1 / 86400 'temporisation 1 seconde
Application.OnTime t, "VisibleRangeFormat"
End Sub
La 2ème macro est relancée toutes les secondes par Application.OnTime.

Si pour une raison quelconque le processus est arrêté il suffit de cliquer sur le bouton "Afficher toutes les lignes" pour le relancer.

Voyez aussi les macros dans ThisWorkbook :
VB:
Private Sub Workbook_Open()
VisibleRangeFormat 'lance la macro et le processus
Me.Saved = True 'évite l'invite à la fermeture si aucunemodification
End Sub

Private Sub Workbook_BeforeClose(Cancel As Boolean)
On Error Resume Next
Application.OnTime t, "VisibleRangeFormat", , False 'évite la relance du processus
End Sub
J'ai testé sur 60 000 lignes : les filtrages se font chez moi en 0,5 seconde environ.

A+
 

Pièces jointes

  • tris_test4(2).xlsm
    679.4 KB · Affichages: 9
Dernière édition:

Usine à gaz

XLDnaute Barbatruc
Bonjour Gérard, le Forum,

Vraiment super MERCI :) je pensais bien à cette solution mais je n'avais pas eu le temps de le faire et je ne l'aurais pas fait aussi bien lol :)

Merci Gérard de l'avoir fait et 0.5 sec (chez moi aussi) c'est génial (comme toujours :))
Amicalement,
lionel,
 

Discussions similaires

Réponses
3
Affichages
167
Réponses
7
Affichages
631
Réponses
23
Affichages
1 K
Réponses
22
Affichages
1 K

Statistiques des forums

Discussions
314 655
Messages
2 111 603
Membres
111 217
dernier inscrit
aladinkabeya2