Bonjour à tous,
J'ai pas mal cherché pour réduire le temps de traitement,
en partant d'un filtre élaboré.
Au début, j'utilisais une formule "SommeProd" sur les 29000 lignes, => 7 minutes de traitement,
avec =NB.SI.ENS(.....), j'arrivais à 3,50 minutes
C'est l'écriture de la formule qui prend tout ce temps, le filtre étant instantané.
pour info., la macro de Banzai met 2,52 minutes.
J'ai donc opté pour une formule "SommeProd" sur une plage de 100 lignes,
(50 lignes avant et 50 lignes après la cellule concernée), çà devrait suffire comme plage.
Sub Filtre()
'-- macro Claude Dubois pour muratime le 25/09/2011
'-- utilise les colonnes Q:R, les données commencent à la ligne 50
Dim f As Worksheet
Dim Lg&, x
x = Time
Application.ScreenUpdating = False
Lg = Range("a" & Rows.Count).End(xlUp).Row
Set f = Sheets("Resultat")
Range("r50:r" & Lg) = "=a50&b50&c50" 'concatène "A:C"
'-- formule SUMPRODUCT flotant (50 lignes avant et 50 lignes après la cellule) --
Range("q50:q" & Lg) = _
"=SumProduct((r1:r100=r50)*((e1:e100=""CG"")+(e1:e100=""CP"")))"
'--- filtre ---
Range("q2") = "=and(q50=0,a50>0)" 'critère
Rows(49).Copy Destination:=f.Range("a1") 'en-têtes
Range("a49:q" & Lg).AdvancedFilter Action:=xlFilterCopy, CriteriaRange:= _
Range("q1:q2"), CopyToRange:=f.Range("a1:p1"), Unique:=False
Columns("q:r").Clear
f.Activate
MsgBox ("temps macro = " & Format(Time - x, "hh:mm:ss"))
End Sub
Ce qui explique pourquoi les données commencent à la ligne 50, (lignes 1 à 40 masquées)
le temps de traitement est inférieur à 2 secondes. (testé avec 29000 lignes)
Les données étant censées être triées par date.
à tester avec données réelles
Amicalement
Claude