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 'gle 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 = xlCalculationAutomaticCeci 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").ActivateBonjour 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