Allèger Calcul Maccro

Bonjour à tous, deuxième requête dans le forum.

Je travailler sur un gros fichier excel 8760 lignes (heures de l'année) avec une 50ène de colonnes et des calculs et graphiques dans tous les sens. Le tout piloté à partir d'une dizaine de paramètres sur une autre feuille.

J'ai une macro qui vient injecter 3 paramètres et récupérer 4 résultats de ces calculs. Pour 60 itérations (j'ai 12600 scénarios possibles), j'ai environs 3 minutes de traitement de données. Je souhaiterais donc essayer de réduire le temps de calcul.

J'ai déjà essayé en supprimant les graphs, ca ne change étrangement rien. Désolé si je ne mets pas le tableur entier mais je vous mets ma macro.

Première question, je souhaiterai savoir si le faire de coller mes 3 données d'entrée une par une :

Range("C13") = volumestorage

Range("C9") = powerel

Range("C10") = powerfc

Ne demande pas de faire 3 fois les calculs et si je ne pouvais pas tout coller d'un coup ...

Sinon je suis ouvert a toutes modifs

Merci a tous

Romain

Sub LCOES_V01()

Dim startsheet&, volumestorage&, powerel&, powerfc&, comptage&, energy&, pourcentage As Variant, surplus&, nbriteration&, pricemwh&, start As Single

'declaration des variables

comptage = 0

nbriteration = Range("E5")

startsheet = Range("A7", "A65535").SpecialCells(xlCellTypeVisible).Row

start = Timer

Application.ScreenUpdating = False 'gle la page

Sheets("Parameters").Activate

Range("C7").Select

ActiveCell.FormulaR1C1 = "=R[3]C"

Range("C6").Select

ActiveCell.FormulaR1C1 = "=R[4]C"

Range("C7").Select

Sheets("CalculsVBA").Select

Columns("I:Q").Select

Selection.ClearContents

Sheets("LCOES").Select

Range(Cells(startsheet, 1), ActiveCell.Offset(nbriteration, 2)).Select

Range(Selection, Selection.End(xlDown)).Select

Selection.Copy

Sheets("CalculsVBA").Select

Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _

:=False, Transpose:=False

For i = 1 To nbriteration

volumestorage = Cells(i, 9)

powerel = Cells(i, 10)

powerfc = Cells(i, 11)

Sheets("Parameters").Activate

Range("C13") = volumestorage

Range("C9") = powerel

Range("C10") = powerfc

energy = Range("F7")

pourcentage = Range("G7")

surplus = Range("J6")

pricemwh = Range("J9")

Sheets("CalculsVBA").Activate

Cells(i, 12) = energy

Cells(i, 13) = pourcentage

Cells(i, 14) = surplus

Cells(i, 15) = pricemwh

Next i

Sheets("LCOES").Select

Cells(startsheet, 5).Select

For j = 1 To nbriteration

Sheets("CalculsVBA").Activate

Range(Cells(j, 12), Cells(j, 15)).Select

Selection.Copy

Sheets("LCOES").Select

ActiveSheet.Paste

Do

Selection.Offset(1, 0).Select

Loop Until Selection.EntireRow.Hidden = False

Next j

Range("A1").Select

MsgBox "Done ! Processing period : " & Timer - start & " seconds"

Select Case MsgBox("Do you want to edit a Scatter plot chart ?", vbYesNo + vbQuestion, "Graph edition")

Case vbYes

'lancer la vba sur le graphique

ActiveSheet.ChartObjects("Graphique 10").Activate

ActiveSheet.ChartObjects("Graphique 10").Activate

ActiveSheet.Shapes("Graphique 10").IncrementLeft -39

ActiveSheet.Shapes("Graphique 10").IncrementTop 103.5

ActiveSheet.ChartObjects("Graphique 10").Activate

ActiveSheet.Shapes("Graphique 10").ScaleWidth 7.2037056479, msoFalse, _

msoScaleFromBottomRight

ActiveSheet.Shapes("Graphique 10").ScaleHeight 7.6666693586, msoFalse, _

msoScaleFromTopLeft

Case vbNo

End Select

End Sub

Bonjour,

le fait de geler l'affichage de la page permet de gagner du temps, et vous l'avez fait !

Ensuite le fait d'entrer une valeur dans une cellule qui fait parti d'un calcul, cela engendre le recalcule de la feuille voir du classeur...

C'est pourquoi je vous propose d'ajouter après :

Application.ScreenUpdating = False

un

Application.Calculation = xlCalculationManual

afin de stopper les calculs automatiques des feuilles du classeur.

Ensuite en fin de traitement et avant de créer les graphs vous mettez un :

Application.Calculation = xlCalculationAutomatic

Comme cela les calculs sont relancés juste avant que les résultats ne soient pris en compte pour les graphs

Sinon de manière générale il y a des balises (petits boutons verts au dessus de la fenêtre de message) qui permettent de dire quel type de texte vous voulez afficher, exemple avec la balise "Code"

Sans

Application.Calculation = xlCalculationAutomatic

Avec :

Application.Calculation = xlCalculationAutomatic

Ceci permet une meilleur lecture du message et il y aura plus de personne à répondre !

@ bientôt

LouReeD

Edit : une cellule n'est pas obligée d'être sélectionnée pour être lu ou écrite, n'y même sa feuille :

avec la feuille 1 active, on peut très bien écrire dans la cellule B9 de la feuille 3 sans l'activer, du coup :

Sheets("Feuille 3").Activate
Range("B9").Value ="LouReeD"

est remplacé par :

Sheets("Feuille 3").Range("B9").Value ="LouReeD"

Ca n'a l'air de rien mais si vous devez faire autre chose sur la feuille 1 alors il n'est plus utile de faire :

Sheets("Feuille 1").Activate

Bonjour le fil, bonjour le forum

Je me permets d'ajouter que les Select ne font que ralentir l'exécution du code. La plupart du temps on peut s'en passer en utilisant With... End With ou une variable onglet. Le début de ton code sans Select (je te laisse le soin de terminer) :

With Sheets("Parameters")
    .Range("C7").FormulaR1C1 = "=R[3]C"
    .Range("C6").FormulaR1C1 = "=R[4]C"
End With
Sheets("CalculsVBA").Columns("I:Q").ClearContents
'etc.

Oi , voilà, c'est exactement ce que je voulais dire !!!! ... mais en plus claire, comme le code !!!!

Merci ThauThème et bonjour !

Avez vous vu ? il utilise aussi les balises pour la couleur du texte, le gras de certaines parties etc....

Utilisation des balises !

Enfin, non ce n'est pas obligatoire, mais c'est tellement plus agréable à lire, non ?

@ bientôt

LouReeD

Merci beaucoup pour vos réponses, je vais appliquer tout cela.

LooReed une dernière question, je fait est que je dois quand même faire les calculs entre chaque itération, cela ne va pas poser de problème ?

J'aurai pu faire l'essai maios j'imagine que tu la la réponse à cette question

Romain


C'est bueno j'ai répondu a ma question.

Ca marche du tonerre le code : Application.Calculation = xlCalculationManual + Automatic,

J'ai divisé mes temps de réponse par 5 !

Merci encore

Romain

Re

comme dit plus haut : pas de balise pas de lecture...

Donc vous modifiez des valeurs dans des cellules, puis la feuilles "prend" ces valeurs pour mettre à jour de nouveaux résultat, puis vous récupérer ces résultats pour les inscrire dans un tableau, ensuite, itération suivante on recommence en modifiant les valeurs du début... Dans ce cas il ne faut pas utiliser calculation d'application !

Mais en somme vous utilisez la feuille Excel comme un calculatrice ?

Ne serait il pas plus simple de faire ces calculs sous VBA ?

Là je sèche !!!!

@ bientôt

LouReeD

Non mais c'est bon, en fait j'ai fais cela :

Application.Calculation = xlCalculationManual

Sheets("Parameters").Activate
Range("C13") = volumestorage
Range("C9") = powerel
Range("C10") = powerfc

Application.Calculation = xlCalculationAutomatic

energy = Range("G7")
pourcentage = Range("H7")
surplus = Range("K6")
pricemwh = Range("N9")

Avec la balise qui va bien

Du coup je stop les calculs avant de mettre mes données dans les INput un par un, je relance les calculs et je récupères mes OUTput un par un également pour les copier dans un autre tableau.

Mais ca m'a énormément aidé.

Romain

Ravis que cela vous convienne !

@ bientôt

LouReeD

Rechercher des sujets similaires à "alleger calcul maccro"