Temps exécution trop long

Bonjour,

Dans le fichier que je vous fais parvenir, lorsque j'appuie sur le bouton pour exécuter la macro commande, le temps d'exécution est trop long.

Y a-t-il moyen de diminuer le temps d'exécution?

Merci,

Oiseau bleu

16fichier-temps.xlsm (111.38 Ko)

Bonjour,

Sur mon PC : Core i7-3540M 3.00GHz l'action prend environ 1sec, ça te paraît trop long ?

Girodo,

Salut oiseaubleu,

A mettre au début de ton code ( après Sub XX() ) :

    'On désactive les messages d'alertes d'excel et on désactive le défilement des macros
    Application.ScreenUpdating = False
    Application.DisplayAlerts = False

Puis mettre à la fin de ton code ( avant End Sub ) :

    'On active les messages d'alertes d'excel et on active le défilement des macros
    Application.ScreenUpdating = True
    Application.DisplayAlerts = True

Cordialement,

Baboutz

Merci pour vos réponses.

En ajoutant les commandes suivantes :

Application.ScreenUpdating = False

Application.DisplayAlerts = False

cela a accélérer la vitesse d'exécution; mais y aurait-il une façon de remodeler le For pour accélérer la vitesse?

Merci,

Oiseau bleu

Super ! N'oublie pas de remettre à true à la fin de ton code.

Oulà quel charabia !

Je n'ai pas trop le temps ce soir mais si tu pourrais commenter le code ça me simplifierai la vie pour comprendre et t'aider à le simplifier

Bonne soirée,

Baboutz

Bonjour,

Voici un fichier avec plus de commentaires pour les macros.

Merci,

Oiseau bleu

11fichier-temps.xlsm (126.62 Ko)

Bonjour à tous,

Application.DisplayAlerts = False

Je ne crois pas que ceci puisse aider dans le cas présent ... voir ...

https://docs.microsoft.com/fr-ca/office/vba/api/excel.application.displayalerts

Application.ScreenUpdating = True à la fin du code, ce n'est pas nécessaire (sauf cas particulier). L'actualisation de l'affichage de l'écran reprendra automatiquement à la fin du code. Je me souviens d'avoir lu un commentaire de MFERRAND à ce sujet.

J'ai modifié un tantinet le code :

  • afin de copier B et C de la feuille Base en une seule opération.
  • j'ai employé "FillDown" pour copier les formules de G, i, N et O en une seule opération pour toutes les lignes ajoutées.

Un essai ...

ric

Bonjour à tous,

J'ai modifié le fichier soumis afin d'y retirer les dernières lignes ajoutées lors du dernier test.

ric

Salut oiseaubleu, salut ric,

Je ne crois pas que ceci puisse aider dans le cas présent ... voir ...

https://docs.microsoft.com/fr-ca/office/vba/api/excel.application.displayalerts

Tu as tout à fait raison. Je le met toujours par habitude

L'actualisation de l'affichage de l'écran reprendra automatiquement à la fin du code. Je me souviens d'avoir lu un commentaire de MFERRAND à ce sujet.

Je ne savais pas... merci !

@oiseaubleu J'ai repris le fichier de ric que j'ai modifié.

  • Première erreur qu'il faut éviter(sauf dans certains cas) : ne pas utiliser le ".select" sur des cellules et feuilles.

Il suffit de bien indiquer la feuille, par exemple : Worksheets("Travail")

Ainsi, ton code :

Travail.Rows(derlnT & ":" & derlnT + nbempl).Select
Selection.Insert Shift:=xlDown, CopyOrigin:=xlFormatFromLeftOrAbove

Devient :

Worksheets("Travail").Rows(derlnT & ":" & derlnT + nbempl).Insert Shift:=xlDown, CopyOrigin:=xlFormatFromLeftOrAbove
  • Deuxième erreur : ne jamais utiliser de copy/paste !!

Il faut déclarer deux variables comme range, la première qui indique la range des cellules que tu veux copier et la deuxième qui indique la range des cellules où tu veux coller (attention, il faut que ces deux variables aient le même nombre de cellules).

C'est cette erreur qui faisait que l'exécution de ta macro prenait du temps.

Ainsi, ton code :

    Base.Range("B" & j + bec & ":C" & j + bec).Copy
        Travail.Range("B" & derlnT - 1 + j + k & ":C" & derlnT + j + k).PasteSpecial Paste:=xlPasteValues, _
                        Operation:=xlNone, SkipBlanks:=False, Transpose:=False

Devient :

Dim CopyRange As Range
Dim PasteRange As Range

        Set CopyRange = ThisWorkbook.Worksheets("Base").Range("B" & j + bec & ":C" & j + bec)
        Set PasteRange = ThisWorkbook.Worksheets("Travail").Range("B" & derlnT - 1 + j + k & ":C" & derlnT + j + k)

        PasteRange.Value2 = CopyRange.Value2

Le .Value2 ne fonctionne qu'avec des tableaux pour information, d'où son utilisation ici.

  • Enfin, tu as mis dans ta boucle for l'ajout des formules à chaque fois alors que tu peux insérer toutes les formules en une ligne de code en dehors de cette boucle.

Ce code récupère la ligne qui possède déjà la formule et la glisse dans les cellules du dessous. Comme tu peux le faire manuellement.

Ainsi ton code :

Worksheets("Travail").Range("L" & derlnT - 1 + j + k & ":L" & derlnT + j + k).FormulaLocal = "=SI(SOMME(I" & _
                        derlnT - 1 + j + k & ":K" & derlnT - 1 + j + k & ")+SI(ESTVIDE(H" & _
                        derlnT - 1 + j + k & ");0;MIN(H" & derlnT - 1 + j + k & ";40))=0;"""";" & _
                        "SOMME(I" & derlnT - 1 + j + k & ":K" & derlnT - 1 + j + k & ")+SI(ESTVIDE(H" _
                        & derlnT - 1 + j + k & ");0;MIN(H" & derlnT - 1 + j + k & ";40)))"

Devient :

Worksheets("Travail").Range("L" & Worksheets("Travail").Range("B" & Rows.Count).End(xlUp).Row - 90).AutoFill Destination:=Range("L" & Worksheets("Travail").Range("B" & Rows.Count).End(xlUp).Row - 90 & ":L" & Worksheets("Travail").Range("B" & Rows.Count).End(xlUp).Row), Type:=xlFillDefault

(Oui, j'ai eu la flemme de mettre une variable pour trouver la dernière ligne du tableau, d'où le formule un peu longue ici, tu modifier cela si tu veux)

Voici donc toutes les modifications que j'ai apporté et qui permette que l'exécution de ta macro sois rapide.

N'oublie pas de faire ces changements dans ton code du UserForm !

Voici donc le fichier final avec modifications :

12fichier-temps.xlsm (116.80 Ko)

Bonne journée,

Baboutz

PS :

Merci à vous 2 pour vos réponses.

Merci beaucoup du temps que vous m'avez accordé.

Les 2 fichiers fonctionnent beaucoup plus rapidement que celui que j'avais expédié et il y a un fichier que vous m'avez expédié qui fonctionne plus rapidement que l'autre.

Merci pour vos conseils.

Oiseau bleu

Avec plaisir !

Je viens de remarquer qu'il y avait un bug dans le dernier fichier que je t'ai envoyé : certains fichiers de cette discussion avaient pour nom de première feuille "Travail" et d'autres "Heures".

Je te remet ici le fichier sans bug :

9fichier-temps.xlsm (105.25 Ko)

Bonne journée,

Baboutz

Rechercher des sujets similaires à "temps execution trop long"