Optimisation code vba

Résolu/Fermé
-
 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

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

Whahou c'est beaucoup plus rapide merci beaucoup!!

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

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
> 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