Comment optimiser une macro VBA ?

Bonjour,

J'ai un soucis sur une macro VBA qui est très longue à s'actualiser. Ca peut aller jusqu'à 30 min pour traiter 5000 lignes. Il faut que je trouve une solution pour la semaine prochaine.... Le but de ma macro est de supprimer les lignes qui ont la valeur 0 dans la colonne F.
Savez vous SVP comment je peux optimiser le traitement ? Ci dessous le code:

La macro globale :

          Sub MAJ_Rapport()

Call Unhide
Range("E18").Select

Call MAJ_Data
Range("E18").Select

Call Degrouper
Range("E18").Select

Call Supress_Zero
Range("E18").Select

Call GrouperLignesAll
Range("E18").Select

End Sub

Quand j'exécute par petit bout je me rends compte que c'est la macro Supress_Zero qui met le plus de temps. Ci dessous le détail de celle ci :

 Sub Supress_Zero()

Application.ScreenUpdating = False

'Premier Bloc
NbLigMAX = Cells(12, 5).Value
For i = NbLigMAX To 22 Step -1
Type_ligne = Cells(i, 6).Value
If Type_ligne = 0 Then
Rows(i).Delete
End If
Next i

'Calcule les lignes MAX et MIN
Call recalculateLgMAX

'Deuxième Bloc
NbLigMIN2 = Cells(14, 5).Value
NbLigMAX2 = Cells(13, 5).Value
For k = NbLigMAX2 To NbLigMIN2 Step -1
Type_ligne = Cells(k, 6).Value
If Type_ligne = 0 Then
Rows(k).Delete
End If
Next k

Application.ScreenUpdating = True

End Sub


Merci d'avance de votre aide.

5 réponses

  1. Merci Tobas et Philou de vos retours. Je vais tester la méthode du filtre et vous tiens informés.
    0
    1. Contributeur
      Bonjour

      Je ne suis pas un spécialiste des macros, mais j'aurai fait avec fin droit et fin bas pour la sélection et un filtre sur la colonne 6 à zéro et suppression des lignes filtrées
      Puis on enlève le filtre et on se replace en A1

      Sub FILTRESUPPRIME()
      '
      ' FILTRESUPPRIME Macro
      '

      '
      Range("A1").Select
      Range(Selection, Selection.End(xlToRight)).Select
      Range(Selection, Selection.End(xlDown)).Select
      Selection.AutoFilter Field:=6, Criteria1:="0"
      Rows("2:2").Select
      Range(Selection, Selection.End(xlDown)).Select
      Selection.Delete Shift:=xlUp
      Selection.AutoFilter
      Range("A1").Select
      End Sub

      0
      1. Thx a lot !!!! Ca m'a l'air pas du tout. Ca se fait illico !

        Encore merci à vous et bon WE :)
        0
    2. les lignes entre les deux tableaux sont vide ?
      sinon tu fait tout d'un bloc
      exemple les lignes 22 à 200 si dans la colonne H il n'y a pas de zero
      0
      1. Oui les lignes sont vides ;(
        0
    3. Parce que le le test est fait sur deux tableaux différents.

      Exple : le Premier bloc va traiter les lignes 22 à 100 et le Deuxième bloc va traiter les lignes 110 à 200. Ce sont des plages variables et je ne veux pas supprimer les lignes entre ces deux tableaux. Vous pensez que c'est à cause de ça ? Est ce que je dois scinder mes macros ?
      0
      1. Oui les lignes sont vides :(
        0
    4. bonjour,
      je ne comprend pas pourquoi ta macro fait deux fois le travail
      premier bloc
      test la valeur zéro et supprime la ligne
      deuxième bloc
      fait la même chose
      0