Temps d'exécution d'une macro démesuré

Salut

Qu'est ce qui pourrait faire que cette macro met 16 secondes pour s'exécuter, sachant que la boucle est parcourue 14 fois (soit seulement 71 sommes conditionnelles à calculer) ?

Application.ScreenUpdating = False

Set c = Sheets("Nb actions").Rows(1).Find(Sheets("Récap").Range("W4"), lookat:=xlValue)
ColonneRecherche = c.Column
ColonneCours = ColonneRecherche - 1

With Sheets("Récap")
    For Ligne = 5 To WorksheetFunction.CountA(.Columns(1)) + 1
        'Somme des prix d'achat supérieurs à 0 pour un compte et une valeur donnée
        .Cells(Ligne, 5) = WorksheetFunction.SumIfs(Sheets("Nb actions").Columns(ColonneRecherche), Sheets("Nb actions").Columns(1), .Cells(Ligne, 1), Sheets("Nb actions").Columns(2), .Cells(Ligne, 2), Sheets("Nb actions").Columns(ColonneRecherche), ">0")
        'Somme des prix d'achat inféieurs à 0 pour un compte et une valeur donnée
.Cells(Ligne, 8) = -WorksheetFunction.SumIfs(Sheets("Nb actions").Columns(ColonneRecherche), Sheets("Nb actions").Columns(1), .Cells(Ligne, 1), Sheets("Nb actions").Columns(2), .Cells(Ligne, 2), Sheets("Nb actions").Columns(ColonneRecherche), "<0")
        'Somme des quantités d'achat supérieures à 0 pour un compte et une valeur donnée
.Cells(Ligne, 7) = WorksheetFunction.SumIfs(Sheets("Prix achat").Columns(ColonneRecherche), Sheets("Prix achat").Columns(1), .Cells(Ligne, 1), Sheets("Prix achat").Columns(2), .Cells(Ligne, 2), Sheets("Prix achat").Columns(ColonneRecherche), ">0")
        'Somme des quantités d'achat inférieures à 0 pour un compte et une valeur donnée
.Cells(Ligne, 10) = -WorksheetFunction.SumIfs(Sheets("Prix achat").Columns(ColonneRecherche), Sheets("Prix achat").Columns(1), .Cells(Ligne, 1), Sheets("Prix achat").Columns(2), .Cells(Ligne, 2), Sheets("Prix achat").Columns(ColonneRecherche), "<0")
        'Somme des dividendes supérieurs à 0 pour un compte et une valeur donnée
.Cells(Ligne, 21) = WorksheetFunction.SumIfs(Sheets("Historique dividendes").Columns(ColonneRecherche), Sheets("Historique dividendes").Columns(1), .Cells(Ligne, 1), Sheets("Historique dividendes").Columns(2), .Cells(Ligne, 2), Sheets("Historique dividendes").Columns(ColonneRecherche), ">0")
    Next Ligne

    'Somme des dividendes inférieurs à 0 pour un compte donné
.Cells(14, 23) = -WorksheetFunction.SumIfs(Sheets("Historique dividendes").Columns(ColonneRecherche), Sheets("Historique dividendes").Columns(2), "0 - Droits de garde", Sheets("Historique dividendes").Columns(ColonneRecherche), "<0")
End With

Juste une précisions les sommes calculées sont ensuites utilisées dans la feuille " récap " par 10 formules pour chaque ligne, mais ça devrait pas avoir de conséquences significatives.

Merci d'avance à ceux qui pourront trouver une explication.

Manu

Bonjour,

ajoutez ces deux lignes en début de procédure :

Application.ScreenUpdating = False
Application.Calculation = xlCalculationManual

Puis à la fin de la procédure :

Application.Calculation = xlCalculationAutomatic

@ bientôt

LouReeD

bonjour Manu32, salut LouReeD, faut-il vraiment faire la somme de +1.048.000 lignes ? La dernière ligne de cette feuille, c'est laquelle ?

Et pour compléter LooReeD, n'oubliez pas d'ajouter

Application.ScreenUpdating = True

en fin de procédure, après

Application.Calculation = xlCalculationAutomatic

BsAlv, j'ai modifié mon code en

Application.ScreenUpdating = False

Dim CptNb, ValNb As Range, CalcNb As Range, CptAchat As Range, ValAchat As Range, CalcAchat As Range, CptDividendes As Range, _
ValDividendes As Range, CalcDividendes As Range

Set c = Sheets("Nb actions").Rows(1).Find(Sheets("Récap").Range("W4"), lookat:=xlValue)
Col = c.Column
With Sheets("Nb actions")
    Set CptNb = .Range(.Cells(2, 1), .Cells(WorksheetFunction.CountA(.Columns(1)), 1))
    Set ValNb = .Range(.Cells(2, 2), .Cells(WorksheetFunction.CountA(.Columns(1)), 2))
    Set CalcNb = .Range(.Cells(2, Col), .Cells(WorksheetFunction.CountA(.Columns(1)), Col))
End With
With Sheets("Prix achat")
    Set CptAchat = .Range(.Cells(2, 1), .Cells(WorksheetFunction.CountA(.Columns(1)), 1))
    Set ValAchat = .Range(.Cells(2, 2), .Cells(WorksheetFunction.CountA(.Columns(1)), 2))
    Set CalcAchat = .Range(.Cells(2, Col), .Cells(WorksheetFunction.CountA(.Columns(1)), Col))
End With
With Sheets("Historique dividendes")
    Set CptDividendes = .Range(.Cells(2, 1), .Cells(WorksheetFunction.CountA(.Columns(1)), 1))
    Set ValDividendes = .Range(.Cells(2, 2), .Cells(WorksheetFunction.CountA(.Columns(1)), 2))
    Set CalcDividendes = .Range(.Cells(2, Col), .Cells(WorksheetFunction.CountA(.Columns(1)), Col))
End With

With Sheets("Récap")
    For Ligne = 5 To WorksheetFunction.CountA(.Columns(1)) + 1
        .Cells(Ligne, 5) = WorksheetFunction.SumIfs(CalcNb, CptNb, .Cells(Ligne, 1), ValNb, .Cells(Ligne, 2), CalcNb, ">0")
        .Cells(Ligne, 8) = -WorksheetFunction.SumIfs(CalcNb, CptNb, .Cells(Ligne, 1), ValNb, .Cells(Ligne, 2), CalcNb, "<0")
        .Cells(Ligne, 7) = WorksheetFunction.SumIfs(CalcAchat, CptAchat, .Cells(Ligne, 1), ValAchat, .Cells(Ligne, 2), CalcAchat, ">0")
        .Cells(Ligne, 10) = -WorksheetFunction.SumIfs(CalcAchat, CptAchat, .Cells(Ligne, 1), ValAchat, .Cells(Ligne, 2), CalcAchat, "<0")
        .Cells(Ligne, 21) = WorksheetFunction.SumIfs(CalcDividendes, CptDividendes, .Cells(Ligne, 1), ValDividendes, .Cells(Ligne, 2), CalcDividendes, ">0")
    Next Ligne

    .Cells(14, 23) = -WorksheetFunction.SumIfs(CalcDividendes, ValDividendes, "0 - Droits de garde", CalcDividendes, "<0")
End With

Application.ScreenUpdating = True

Il est plus complexe à cause de la définition des 9 Range précis à la place de seulement 3 colonnes entières mais ça n'a rien changé sur le temps d'exécution.

Bonsoir,

à partir du moment où vous mettez du "Cells(R,C) =", Excel détecte le changement de valeur dans la cellule et lance le calcul de la feuille voir du classeur si cette dernière est liée à des formules, essayez de mettre les calcul en manuel afin d'éviter ceci.

@ bientôt

LouReeD

LouReeD

C'est bon ça marche, la macro prend moins d'une seconde pour s'exécuter.

Merci du tuyau

Manu

Merci de ce retour !

Pour compléter ce que dit saboh12617, le ScreenUpdating est remis automatique à True lorsque la sub où il a été mis à False se termine, donc la ligne n'est pas nécessaire, ceci est valable également pour le On Error Resume Next, si le "End Sub" de la procédure qui l'a lancé arrive alors il revient en "position" par défaut.

Ceci dit on peut faire les choses propre et mettre à True le Screen et On Error Goto 0 également.

Par contre pour Application.EnableEvents, il faut absolument le remettre à True, tout comme le "Calculation".

@ bientôt

LouReeD

saboh12617

Juste pour ma culture personnelle c'est quoi l'intérêt de mettre le screenUpdating à true à la fin de la macro ? Une fois la macro terminée l'affichage est de toutes manières mis à jour non ?

Manu

Edit : Nos messages se sont croisés avec celui de LouReeD

je sais je sais... je suis rapide !

@ bientôt

LouReeD

Rechercher des sujets similaires à "temps execution macro demesure"