Accélérer un code VBA

MAZETTE

XLDnaute Occasionnel
Bonjour à tous,

Petite question d'ordre technique...

Voilà, j'ai un code qui me supprime des lignes en fonction de plusieurs critéres mais il est d'une lenteur....pffffffff

Existe-il un moyen d' accélérer ce code s'il vous plait?

cf la piece jointe

Merci à vous
 

Pièces jointes

  • essai1.zip
    44.7 KB · Affichages: 52
  • essai1.zip
    44.7 KB · Affichages: 49
  • essai1.zip
    44.7 KB · Affichages: 59
Dernière édition:

Staple1600

XLDnaute Barbatruc
Re : Accélérer un code VBA

Bonjour


1) Merci de rendre ton message plus lisible
VB:
Sub macro()
Application.ScreenUpdating = False' essayes en ajoutant ceci
For c = Range("A19500").End(xlUp).Row To 1 Step -1
If Range("A" & c) <> "Période" And Range("A" & c) <> "Date" And Range("A" & c) <> "1210" And Range("A" & c) <> "1395" And Range("A" & c) <> "4540" And Range("A" & c) <> "4544" And Range("A" & c) <> "NET" And Range("A" & c) <> "1735" And Range("A" & c) <> "1745" And Range("A" & c) <> "3670" And Range("A" & c) <> "3900" And Range("A" & c) <> "1755" And Range("A" & c) <> "3280" And Range("A" & c) <> "Congés" And Range("A" & c) <> "jours" Then
Rows(c).Delete: i = i + 1
Next c
MsgBox ("Nombre de ligne traité: ") & i
End Sub

2) Peux-tu joindre un fichier exemple sommaire.
Merci.

3) Essayes de modifier ton code comme je te l'indique au 1)
 
Dernière édition:

MAZETTE

XLDnaute Occasionnel
Re : Accélérer un code VBA

Bonjour Staple1600,

Un petit bout de fichier comme demandé, il faut imager que je traite plus de 10000 lignes...

Merci
 

Pièces jointes

  • essai1.zip
    44.7 KB · Affichages: 58
  • essai1.zip
    44.7 KB · Affichages: 63
  • essai1.zip
    44.7 KB · Affichages: 59

Staple1600

XLDnaute Barbatruc
Re : Accélérer un code VBA

Re


Tu ne veux pas modifier ton premier message ?
(Pour qu'il soit agréable à lire )

Pour accélérer ton code, j'utiliserai le filtre élaboré.
VB:
Sub Mazette()
[C2].FormulaR1C1 = _
        "=AND(RC[-2]<>""Période"",RC[-2]<>""Date"",RC[-2]<>1220,RC[-2]<>1395,RC[-2]<>1735,RC[-2]<>1755,RC[-2]<>3280,RC[-2]<>3670,RC[-2]<>3900,RC[-2]<>4540,RC[-2]<>4544,RC[-2]<>""NET"",RC[-2]<>""Congés"")"
[A1:A1044].AdvancedFilter Action:=xlFilterInPlace, CriteriaRange:=[C1:C2], Unique:=False
End Sub
 
Dernière édition:

PMO2

XLDnaute Accro
Re : Accélérer un code VBA

Bonjour,

Essayez le code suivant en remplacement du vôtre

Code:
Sub DeleteRows_pmo()
Dim S As Worksheet
Dim R As Range
Dim nbCol&
Dim var
Dim i&
Dim j&
Dim k&
Dim cpt&
Dim bool As Boolean
Dim T()
Dim garder
'--- Indiquez les critères à conserver (sous forme de texte (String)) ---
garder = Array("Période", "Date", "1210", "1395", "4540", "4544", "NET", "1735", "1745", "3670", "3900", "1755", "3280", "Congés", "jours")
'---
ActiveSheet.Copy After:=Sheets(Sheets.Count)
Set S = ActiveSheet
nbCol& = S.UsedRange.Columns.Count
Set R = S.Range(S.Cells(1, 1), S.Cells(S.[a65536].End(xlUp).Row, nbCol&))
var = R
ReDim T(1 To UBound(var, 1), 1 To UBound(var, 2))
For i& = 1 To UBound(var, 1)
  bool = False
  For k& = 0 To UBound(garder)
    If CStr(var(i&, 1)) = garder(k) Then
      bool = True
      Exit For
    End If
  Next k&
  If bool Then
    cpt& = cpt& + 1
    For j& = 1 To UBound(var, 2)
      T(cpt&, j&) = var(i&, j&)
    Next j&
  End If
Next i&
R = T
ActiveWindow.ScrollRow = 1
End Sub

Le résultat s'inscrit dans une nouvelle feuille.

Cordialement.

PMO
Patrick Morange
 

Staple1600

XLDnaute Barbatruc
Re : Accélérer un code VBA

Re


Je vois que Lien supprimé n' avait pas retenu ton attention.
(Mais que finalement tu as pu la tester...) ;)
La prochain étape: adapter le code pour supprimer les lignes
Je te laisse essayer et reviendrai plus tard.

EDITION: bonjour PMO
D'après toi, utiliser l'AdvancedFilter est plus rapide ou pas que l'emploi d'une boucle ?

EDITION2: bonjour tbft
 
Dernière édition:

tbft

XLDnaute Accro
Re : Accélérer un code VBA

Bonjour tout le monde

J'ai essayé d'accélerer la macro en travaillant la recherche des lignes à effacer en utilisant une variable.

VB:
Sub Macro123456()
Dim lig As Long, nb_lig As Long, nb As Long
Dim val As String
Dim entree As Variant
Dim liste_a_effacer() As Long
  nb = 0
  entree = Range(Cells(1, 1), Cells(Range("A19500").End(xlUp).Row, 1)).Value
  nb_lig = UBound(entree, 1)
  For lig = 1 To nb_lig
    val = entree(lig, 1)
    If val <> "Période" And val <> "Date" And val <> "1210" And val <> "1395" And val <> "4540" And val <> "4544" And val <> "NET" And val <> "1735" And val <> "1745" And val <> "3670" And val <> "3900" And val <> "1755" And val <> "3280" And val <> "Congés" And val <> "jours" Then
'      Rows(c).Delete
      nb = nb + 1
      ReDim Preserve liste_a_effacer(nb)
      liste_a_effacer(nb) = lig
    End If
  Next lig
  MsgBox ("Nombre de ligne traité: ") & nb
  For lig = nb To 1 Step -1
    Rows(liste_a_effacer(lig)).Delete
  Next lig
End Sub
'
 

MAZETTE

XLDnaute Occasionnel
Re : Accélérer un code VBA

Re Staple1600,

Milles excuses, je me suis embrouillé dans les messages désolé.

Du coup je vient de le tester, mais ce que je souhaitai c'était plutot de supprimer les lignes plutôt que de les masquer.

Quoiqu'il en soit, il semble que le filtre soit plus rapide qu'une boucle.

Merci encore
 

Staple1600

XLDnaute Barbatruc
Re : Accélérer un code VBA

Re


J'ai l'impression que tu m'a encore zappé
Cela devient une habitude (lol)

Code:
Sub MazetteBIS()
Dim pae As Range
[C2].FormulaR1C1 = _
      "=OR(RC[-2]=""Période"",RC[-2]=""Date"",RC[-2]=1220,RC[-2]=1395,RC[-2]=1735,RC[-2]=1755,RC[-2]=3280,RC[-2]=3670,RC[-2]=3900,RC[-2]=4540,RC[-2]=4544,RC[-2]=""NET"",RC[-2]=""Congés"")"
[A1:A1044].AdvancedFilter Action:=xlFilterInPlace, CriteriaRange:=[C1:C2], Unique:=False
Set pae = [_FilterDataBase]
pae.Offset(1, 0).Resize(pae.Rows.Count - 1).SpecialCells(12).Delete Shift:=xlUp
End Sub
 

PMO2

XLDnaute Accro
Re : Accélérer un code VBA

Bonjour Staple1600,

EDITION: bonjour PMO
D'après toi, utiliser l'AdvancedFilter est plus rapide ou pas que l'emploi d'une boucle ?

Je ne sais pas et il faudrait essayez les 2 approches.

La méthode que j'utilise est une boucle sur un tableau VisualBasic (en mémoire)
et, en portant les lignes de la feuille des données à 14448 lignes, le résultat est pratiquement immédiat.

Cordialement.

PMO
Patrick Morange
 

Discussions similaires

Réponses
6
Affichages
384
Réponses
22
Affichages
732
Réponses
2
Affichages
110

Statistiques des forums

Discussions
312 023
Messages
2 084 716
Membres
102 636
dernier inscrit
TOTO33000