XL 2013 Lenteur sur filtre

batseb

XLDnaute Nouveau
Bonjour,

Nous venons de migrer sur Excel 2013 dans notre entreprise et nous rencontrons beaucoup de difficultés pour adapter nos macros par rapport au nouveau comportement d'Excel.

Nous bloquons sur le point suivant. Il y a une ligne qui était quasi instantanée sur Excel 2010 et qui dure indéfiniment sur Excel 2013.

Nous filtrons sur la colonne Periode (qui est triée par défaut), puis nous supprimons les lignes visibles.
'tableau avec une ligne d'entete
'Base_LigneDeb : c'est le no de la premiere ligne de données
'donc Base_LigneDeb - 1 : c'est la ligne d'entête

'nos colonnes sont gérées en énumération qui s'appelle IndTabBase

L'onglet Base contient 70 000 lignes et la suppression concerne 10 000 lignes.

Code:
Sub EffacerLignesBase()
    Dim LigneFin As Long
    
    'on recherche la dernière ligne
    LigneFin = Cells(Rows.Count, IndTabBase.Ste).End(xlUp).Row
    
    'on nettoie
    Range(Cells(Base_LigneDeb - 1, IndTabBase.MINELEMENTS), Cells(LigneFin, IndTabBase.MAXELEMENTS)).AutoFilter Field:=IndTabBase.Periode, Criteria1:=">=" & Params.PeriodeDeb, Operator:=xlAnd, Criteria2:="<=" & Params.PeriodeFin

    If Cells(Rows.Count, IndTabBase.Ste).End(xlUp).Row >= Base_LigneDeb Then
        Range(Cells(Base_LigneDeb, IndTabBase.MINELEMENTS), Cells(LigneFin, IndTabBase.MAXELEMENTS)).SpecialCells(xlCellTypeVisible).EntireRow.Delete 'Ca patiente très longtemps sur cette ligne
    End If

    ActiveSheet.AutoFilterMode = False

    LigneFin = Cells(Rows.Count, IndTabBase.Ste).End(xlUp).Row

    Range(Cells(Base_LigneDeb - 1, IndTabBase.MINELEMENTS), Cells(LigneFin, IndTabBase.MAXELEMENTS)).AutoFilter
End Sub

Pour info, nous avons essayé avec ScreenUpdating = false + EnableEvents = false + Calcul Manuel mais toujours le pb de lenteur...

Merci de nous dire ce qu'il faut changer. Peut être qu il y a un paramètre à appliquer dans Excel 2013!! (Noël approche!!)

Merci d'avance pour vos messages constructifs.
 
Dernière édition:

batseb

XLDnaute Nouveau
Re : Lenteur sur filtre

Bonjour Gosselien,

Malheureusement, je ne peux pas déposer de fichiers...

Par contre l'exemple est simple :
21 colonnes (ligne entete = ligne 1) => de A à U
70 000 lignes de données
Colonne Periode = colonne P, les valeurs oscillent entre 1 et 10

Après on met les données que l'on veut, le problème reste le même.

Voici le code générique :
Code:
Sub EffacerLignesBase()
    Dim LigneFin As Long
        
    LigneFin = Cells(Rows.Count, 1).End(xlUp).Row
    
    'on nettoie
    Application.ScreenUpdating = False
    Application.Calculation = xlCalculationManual
    
    Range(Cells(1, 1), Cells(LigneFin, 21)).AutoFilter Field:=16, Criteria1:=">=" & "10", Operator:=xlAnd, Criteria2:="<=" & "10"
    If Cells(Rows.Count, 1).End(xlUp).Row >= 2 Then
        Range(Cells(2, 1), Cells(LigneFin, 1)).SpecialCells(xlCellTypeVisible).EntireRow.Delete
    End If
    ActiveSheet.AutoFilterMode = False
    LigneFin = Cells(Rows.Count, 1).End(xlUp).Row
    Range(Cells(1, 1), Cells(LigneFin, 21)).AutoFilter
    
    Application.Calculation = xlCalculationAutomatic
    Application.ScreenUpdating = True
End Sub
 

gosselien

XLDnaute Barbatruc
Re : Lenteur sur filtre

re,

2,33 secondes avec 10500 records dont 1100 sont enlevés...
ton code semble bon, essaie ceci pour voir :


Sub EffacerLignesBase()
Dim t
t = Timer
Dim LigneFin As Long
LigneFin = Cells(Rows.Count, 1).End(xlUp).Row
colonnefin = 21
'on nettoie
Application.ScreenUpdating = False
Application.Calculation = xlCalculationManual
Range(Cells(1, 1), Cells(LigneFin, 21)).AutoFilter Field:=16, Criteria1:=">=" & "10", Operator:=xlAnd, Criteria2:="<=" & "10"
If Cells(Rows.Count, 1).End(xlUp).Row >= 2 Then
MsgBox (Application.Subtotal(3, Columns("P")) - 1 & " lignes sélectionnées")
zz = Range(Cells(2, 1), Cells(LigneFin, 1)).Rows.Count
Range(Cells(2, 1), Cells(LigneFin, colonnefin)).SpecialCells(xlCellTypeVisible).EntireRow.Delete
End If
ActiveSheet.AutoFilterMode = False
LigneFin = Cells(Rows.Count, 1).End(xlUp).Row
Range(Cells(1, 1), Cells(LigneFin, 21)).AutoFilter
Application.Calculation = xlCalculationAutomatic
Application.ScreenUpdating = True
MsgBox (Timer - t)
End Sub
 

Membres actuellement en ligne

Statistiques des forums

Discussions
314 738
Messages
2 112 339
Membres
111 513
dernier inscrit
jeanmarty