code ultra lent pour supprimer des lignes

Sebast

XLDnaute Impliqué
Bonjour à toutes et à tous,

le code suivant est censé supprimer des lignes quand un critère est rempli. Or, il est horriblement lent, à tel point que je pensais que l'ordi avait planté mais quand je l'interromps et contrôle le nombre de lignes restant, je vois bien qu'il manque des lignes (donc le job est fait, mais quelle lenteur !). Pour me convaincre que ça marche, je garde 10 lignes pour lesquelles je change le critère, et ça marche bel et bien (mais 10 lignes ...).
J'ai un bon ordi récent avec 4 Go de RAM, processeur Pentium donc ce n'est pas de ce côté qu'il faut regarder ...

Le fichier fait certes environ 10 000 lignes mais tout de même !!!!

Sub calculation()

With Application
.ScreenUpdating = False
.EnableEvents = False
.calculation = xlCalculationManual
End With
Dim numlign As Integer
Dim i As Integer
numlign = Range("A" & Rows.Count).End(xlUp).Row

For i = numlign To 2 Step -1
If Cells(i, 26) = 2011 Then ' quand l'année contenue en colonne 26 vaut 2011
Rows(i).Delete
End If
Next i

End Sub


Merci d'avance pour vos idées (boucle ?) car je vais faire un usage régulier de cette macro
 

francedemo

XLDnaute Occasionnel
Re : code ultra lent pour supprimer des lignes

bonjour,

essaye en passant par un tableau:
tu remplis les éléments dans un tableau
tu effaces tes données
tu colles ton tableau sur l'emplacement de tes données (que tu viens d'effacer)
en général, ça va plus vite (tu n'écris qu'une fois dans le fichier)

si la piste t’intéresse, ...

à+
 

Sebast

XLDnaute Impliqué
Re : code ultra lent pour supprimer des lignes

Bonjour Francedemo,

merci pour ta réponse mais je ne vois pas du tout. Tu écris :
...
... tu effaces tes données

c'est justement ce que je veux faire, supprimer les lignes, mais c'est HORRIBLEMENT lent.
Qu'entends-tu par tableau ?

Merci d'avance
 

francedemo

XLDnaute Occasionnel
Re : code ultra lent pour supprimer des lignes

à essayer:

Code:
Sub calculation()

Dim NumLign As Integer
Dim NumCol As Integer
Dim i As Integer
Dim Tablo() As Variant
Dim debut As Long

debut = Timer

With Application
   .ScreenUpdating = False
   .EnableEvents = False
   .calculation = xlCalculationManual
End With

NumLign = .[A65536].End(xlUp).Row
NumCol = [ZZ1].End(xlToLeft).Column

ReDim Tablo(1 To NumLign, 0 To NumCol)
For i = NumLign To 2 Step -1
   If Not Cells(i, 26) = 2011 Then
      For j = 1 To NumCol
         Tablo(i, j) = Cells(i, j).Value  ' quand l'année contenue en colonne 26 vaut 2011
      Next j
   End If
Next i
[A2].CurrentRegion.Offset(1, 0).Clear
[A2].Value = Tablo

With Application
   .ScreenUpdating = True
   .EnableEvents = True
   .calculation = xlCalculationAutomatic
End With

MsgBox ("Terminé en " & Timer - debut & " seconde(s)")

End Sub

(pas testé)
 

BOISGONTIER

XLDnaute Barbatruc
Repose en paix
Re : code ultra lent pour supprimer des lignes

Bonsoir,

Voir PJ

0,03 sec pour 3.000 lignes supprimées

(conserve la présentation)

Code:
Sub supLignesRapide()
  Application.ScreenUpdating = False
  A = Range("z2:z" & [z65000].End(xlUp).Row)
  For i = LBound(A) To UBound(A)
    If A(i, 1) <> 2011 Then A(i, 1) = 0 Else A(i, 1) = "sup"
  Next i
  Columns("aa:aa").Insert Shift:=xlToRight
  [aa2].Resize(UBound(A)) = A
  [A2].CurrentRegion.Sort Key1:=Range("aa2"), Order1:=xlAscending, Header:=xlGuess
  On Error Resume Next
  Range("aa2:aa65000").SpecialCells(xlCellTypeConstants, 2).EntireRow.Delete
  Columns("aa:aa").Delete Shift:=xlToLeft
End Sub

JB
 

Pièces jointes

  • Classeur1.xls
    386.5 KB · Affichages: 78
  • Classeur1.xls
    386.5 KB · Affichages: 86
  • Classeur1.xls
    386.5 KB · Affichages: 86
Dernière édition:

Sebast

XLDnaute Impliqué
Re : code ultra lent pour supprimer des lignes

Bonjour Mikachu,

ultra lent signifie que au bout d'un quart d'heure, j'interromps le process, persuadé qu'il ne s'est rien passé mais pourtant si, des lignes sont supprimées ...
 

Sebast

XLDnaute Impliqué
Re : code ultra lent pour supprimer des lignes

Bonjour Francedemo,


merci pour ton code, j'ai dû un peu l'adapter et quelle rapidité ...
Je dois encore digérer tout ça, pas mal de notions me sont encore étrangères mais j'avoue que ça turbine.

Encore merci pour ta contribution
 

Sebast

XLDnaute Impliqué
Re : code ultra lent pour supprimer des lignes

Bonjour Boisgonthier,

merci pour ton aide. C'est effectivement impressionnant de rapidité ...
En revanche, je ne comprends pas pourquoi il faut placer un ON ERROR ...

encore un grand merci pour tes lumières
 

Discussions similaires

Réponses
7
Affichages
369
Réponses
2
Affichages
154

Statistiques des forums

Discussions
312 305
Messages
2 087 085
Membres
103 461
dernier inscrit
dams94