Optimisation temps d'exécution macro

Bonjour à toutes et tous,

J'ai mis au point un macro fonctionne bien mais qui, au goût des utilisateurs est trop longue. (entre 8 et 12 mn) en fonction du fichier remis en forme.

Après analyse du code j'ai l'impression que la partie ci-dessous pourrait être la cause de ce temps long puisque la plage de cellule sélectionnée varie en fonction du fichier récupéré

For Each MaCellule In Selection

End If

après recherche sur le forum, j'ai ajouté les codes "standard" en début et en fin de macro qui m'ont permis de gagner du temps mais pas assez

En vous remerciant d'avance pour votre aide

Salut,

En premier lieu, je te conseille de désactiver la mise à jour de l'écran en mettant en début de ta macro cette instruction:

Application.ScreenUpdating = False

et à la fin

Application.ScreenUpdating = True

Dit moi ce que cela change.

Si tu peux mettre ton fichier aussi, se serait pas mal. Pour comprendre ce qu'il fait

Cordialement,

Bonjour

Merci pour ton retour rapide.

j'ai déjà indiqué les messages ci-dessous

en début

Application.DisplayAlerts = False

Application.ScreenUpdating = False

en fin

Application.DisplayAlerts = True

Application.ScreenUpdating = True

Bonjour,

Un fragment de code aussi limité ne permet pas de détecter ce qui provoque une durée d'exécution excessive. Et le code en entier ne le permet pas toujours non plus sans le fichier dans lequel il s'exécute.

Quoi qu'il en soit, le problème n° 1 de ce bout de code réside dans : Selection. Toute démarche d'optimisation consiste en effet à bannir toute utilisation de Select, Activate, Selection et autres éléments équivalents, car ces instructions génèrent des opérations supplémentaires parasites qui prennent inutilement du temps.

Cependant, pour atteindre les temps que tu indiques, les opérations parasites doivent être incommensurables !

Si tu veux que l'on se penche sur ton problème, tu vois ce qu'il te reste à faire...

Bonjour à tous,

pour cette partie remplace par :

    Dim pl As Range
   On Error Resume Next
    Set pl = Selection.SpecialCells(xlCellTypeBlanks)
    On Error GoTo 0
    If Not pl Is Nothing Then pl.Value = "-"

Mais comme MFerrand je pense qu'il y a sûrement d'autres parties à optimiser.

eric

Edit : une amélioration pour tenir compte du cas d'une sélection débordant du UsedRange :

    Dim pl As Range, pl2 As Range, lig As Long
    Set pl = Range("A2:B10")
    On Error Resume Next
    Set pl2 = pl.SpecialCells(xlCellTypeBlanks)
    On Error GoTo 0
    If Not pl2 Is Nothing Then
        lig = pl2.Row + pl2.Rows.Count
        If lig < pl.Row + pl.Rows.Count - 1 Then Set pl2 = Union(pl2, Intersect(pl, Rows(lig + 1 & ":" & pl.Row + pl.Rows.Count - 1)))
        If Not pl2 Is Nothing Then pl2.Value = "-"
    End If
Rechercher des sujets similaires à "optimisation temps execution macro"