Optimisation code vba

Résolu
florebobosch -  
 Mosca -
Bonjour,

J'ai un classeur qui constitue une grille tarifaire : chaque ligne représente une pièce et donne son prix en fonction de sa quantité. J'ai créé un code permettant de masquer les lignes inutiles (lignes dont la quantité de la pièce est à 0) de mes feuilles avant de les imprimer seulement l'algorithme parcours la feuille ligne par ligne et cela prend beaucoup de temps (plus de 30s), est-ce que quelqu'un saurait comment améliorer mon code qui est le suivant ?

Sub imprimerfeuille()
    Dim numerocol As Integer
    Dim numerolig As Long
    Dim Derlig As Long
    Dim Cell As Range
    Derlig = Split(ActiveSheet.UsedRange.Address, "$")(4)
    numerocol = 2
    For numerolig = 5 To Derlig
        If Cells(numerolig, numerocol) = "0" Or IsEmpty(Cells(numerolig, numerocol)) Then
            If Not Application.CountA(Cells(numerolig, numerocol).EntireRow) = 0 And Cells(numerolig, 3).Font.Bold = False And Not Cells(numerolig, 3).Interior.ColorIndex = 2 Then
                Cells(numerolig, numerocol).EntireRow.Hidden = True
            End If
        End If

    Next
    ActiveSheet.PrintOut
    With ActiveSheet.Cells
    .EntireRow.Hidden = False
    End With

End Sub


Merci d'avance, bonne journée!

Flore


EDIT : Ajout des balises de code (la coloration syntaxique).
Explications disponibles ici : ICI

Merci d'y penser dans tes prochains messages.

1 réponse

  1. Mosca
     
    Bonjour,

    Une possible optimisation en bloquant le rafraichissement de l'affichage

    Application.ScreenUpdating = False
        For numerolig = 5 To Derlig
        ' 
        'execution de la boucle
        '
        Next
    Application.ScreenUpdating = True 
    


    Cordialement
    0
    1. florebobosch
       
      Whahou c'est beaucoup plus rapide merci beaucoup!!
      0
    2. florebobosch
       
      Juste une petite question sur le fonctionnement de ces deux lignes, qu'est-ce que ça fait au juste ? Est-ce que j'ai intérêt à le mettre dans tous mes programmes ?

      Merci encore,

      Flore
      0
    3. florebobosch
       
      Rebonjour,

      J'ai une dernière question si vous avez le temps de me répondre, je voudrais maintenant créer un bouton "imprimer" dans la page d'entête qui imprime toutes les feuilles du classeur de la même façon que précédemment c'est-à-dire en supprimant toutes les lignes inutiles à chaque fois.
      J'ai créé le code ci-dessous :
      Sub toutimprimer()

      Dim wks As Worksheet
      If Worksheets("feuille1").Visible = True Then
      Worksheets("feuille1").Activate
      Call imprimerfeuille
      ElseIf Worksheets("feuille2").Visible = True Then
      Worksheets("feuille2").Activate
      Call imprimerfeuille
      End If
      Worksheets("feuille3").Activate
      Call imprimerfeuille
      Worksheets("feuille3").Activate
      Call imprimerfeuille


      End Sub

      Seulement encore une fois c'est très long et excel se place sur chaque feuille pour exécuter le code, est-il possible d'améliorer cela ?

      Merci, bonne journée,

      Flore
      0
      1. Mosca > florebobosch
         
        Comme je l'ai dit plus haut, l'instruction Application.ScreenUpdating active ou désactive le rafraichissement de l'affichage.

        C'est intéressant de l'utiliser lorsque la macro affecte l'affichage comme c'est le cas ici, pour un grand nombre d’itérations.

        Sinon, la macro imprimerfeuille est assez simple, on ne peut pas l'améliorer significativement.

        L'environnement de travail peut aussi influer sur les temps d'exécution (taille du fichier, capacités de la machine, travail en réseau...)

        Bonne continuation
        0