Comment réduire le temps d'exéctuion de mon code VBA

Fermé
Jasmine - 1 juil. 2014 à 11:17
skk201 Messages postés 938 Date d'inscription jeudi 11 septembre 2008 Statut Membre Dernière intervention 16 octobre 2016 - 1 juil. 2014 à 14:48
Bonjour,

J'ai rencontré un problème de code VBA.
Le code marche bien, mais ça prend trop de temps pour l'exécution.
Quelqu'un peut m'aider d'optimiser le code,stp?

Sub distribution_duree_moy()
Application.ScreenUpdating = False
Dim i As Integer
Dim j As Integer
Dim N As Integer
Dim Mu As Long
Dim Sigma As Long
Dim Nb_Lignes_MP_Initial As Long
Dim nb_lignes_éclatés As Long

Nb_Lignes_MP_Initial = Range(Worksheets("MP initial").Cells(2, 2), Worksheets("MP initial").Cells(2, 2).End(xlDown)).Rows.Count
N = 1

For i = 1 To Nb_Lignes_MP_Initial
Sheets("méthode 1").Range("B2").Value = i

Worksheets("mu_sigma").Activate

SolverOk SetCell:="$E$14", MaxMinVal:=2, ValueOf:=0, ByChange:="$C$16,$C$17", _
Engine:=1, EngineDesc:="GRG Nonlinear"
SolverOk SetCell:="$E$14", MaxMinVal:=2, ValueOf:=0, ByChange:="$C$16,$C$17", _
Engine:=1, EngineDesc:="GRG Nonlinear"
SolverSolve UserFinish:=True
SolverFinish KeepFinal:=1

Sheets("MP initial").Cells(i + 1, 39).Value = Sheets("mu_sigma").Cells(16, 3).Value
Sheets("MP initial").Cells(i + 1, 40).Value = Sheets("mu_sigma").Cells(17, 3).Value
Sheets("MP initial").Cells(i + 1, 41).Value = Sheets("méthode 1").Cells(13, 10).Value
Sheets("MP initial").Cells(i + 1, 43).Value = Sheets("méthode 1").Cells(16, 10).Value
nb_lignes_éclatés = Sheets("méthode 1").Cells(10, 3).Value

For j = 1 To nb_lignes_éclatés
Sheets("MP final").Cells(j + N, 1).Value = Sheets("méthode 1").Cells(2, 3).Value
Sheets("MP final").Cells(j + N, 2).Value = Sheets("méthode 1").Cells(2, 4).Value
Sheets("MP final").Cells(j + N, 3).Value = Sheets("méthode 1").Cells(2, 5).Value
Sheets("MP final").Cells(j + N, 4).Value = Sheets("méthode 1").Cells(2, 6).Value
Sheets("MP final").Cells(j + N, 5).Value = Sheets("méthode 1").Cells(2, 7).Value
Sheets("MP final").Cells(j + N, 6).Value = Sheets("méthode 1").Cells(2, 8).Value
Sheets("MP final").Cells(j + N, 7).Value = Sheets("méthode 1").Cells(2, 9).Value
Sheets("MP final").Cells(j + N, 8).Value = Sheets("méthode 1").Cells(2, 10).Value
Sheets("MP final").Cells(j + N, 9).Value = Sheets("méthode 1").Cells(2, 11).Value
Sheets("MP final").Cells(j + N, 10).Value = Sheets("méthode 1").Cells(2, 12).Value
Sheets("MP final").Cells(j + N, 11).Value = Sheets("méthode 1").Cells(2, 13).Value
Sheets("MP final").Cells(j + N, 12).Value = Sheets("méthode 1").Cells(2, 14).Value
Sheets("MP final").Cells(j + N, 13).Value = Sheets("méthode 1").Cells(2, 15).Value * Sheets("méthode 1").Cells(12 + j, 8).Value
Sheets("MP final").Cells(j + N, 14).Value = Sheets("méthode 1").Cells(2, 16).Value * Sheets("méthode 1").Cells(12 + j, 8).Value
Sheets("MP final").Cells(j + N, 15).Value = Sheets("méthode 1").Cells(2, 17).Value * Sheets("méthode 1").Cells(12 + j, 8).Value
Sheets("MP final").Cells(j + N, 16).Value = Sheets("méthode 1").Cells(2, 18).Value
Sheets("MP final").Cells(j + N, 17).Value = Sheets("méthode 1").Cells(2, 19).Value
Sheets("MP final").Cells(j + N, 18).Value = Sheets("méthode 1").Cells(2, 20).Value
Sheets("MP final").Cells(j + N, 19).Value = Sheets("méthode 1").Cells(2, 21).Value
Sheets("MP final").Cells(j + N, 20).Value = Sheets("méthode 1").Cells(2, 22).Value
Sheets("MP final").Cells(j + N, 21).Value = Sheets("méthode 1").Cells(12 + j, 7).Value
Sheets("MP final").Cells(j + N, 22).Value = 0
Sheets("MP final").Cells(j + N, 23).Value = Sheets("méthode 1").Cells(2, 25).Value
Sheets("MP final").Cells(j + N, 24).Value = Sheets("méthode 1").Cells(2, 26).Value
Sheets("MP final").Cells(j + N, 25).Value = Sheets("méthode 1").Cells(2, 27).Value
Sheets("MP final").Cells(j + N, 26).Value = Sheets("méthode 1").Cells(2, 28).Value
Sheets("MP final").Cells(j + N, 27).Value = Sheets("méthode 1").Cells(2, 29).Value
Sheets("MP final").Cells(j + N, 28).Value = Sheets("méthode 1").Cells(2, 30).Value
Sheets("MP final").Cells(j + N, 29).Value = Sheets("méthode 1").Cells(2, 31).Value
Sheets("MP final").Cells(j + N, 30).Value = Sheets("méthode 1").Cells(2, 32).Value
Sheets("MP final").Cells(j + N, 31).Value = Sheets("méthode 1").Cells(2, 33).Value
Sheets("MP final").Cells(j + N, 32).Value = Sheets("méthode 1").Cells(2, 34).Value

Next
N = N + nb_lignes_éclatés

Next

Application.ScreenUpdating = True

End Sub

A voir également:

4 réponses

nexus1991t Messages postés 31 Date d'inscription vendredi 29 janvier 2010 Statut Membre Dernière intervention 19 avril 2018 21
1 juil. 2014 à 11:20
Tu utilises ce code dans Excel ?
0
skk201 Messages postés 938 Date d'inscription jeudi 11 septembre 2008 Statut Membre Dernière intervention 16 octobre 2016 54
1 juil. 2014 à 11:24
Bonjour
Essaye d'utilisé les conseil de ce site.

http://www.info-3000.com/vbvba/conseiloptimisation.php

Je pense notamment à la désactivation du calcule automatique.
0
nexus1991t Messages postés 31 Date d'inscription vendredi 29 janvier 2010 Statut Membre Dernière intervention 19 avril 2018 21
1 juil. 2014 à 11:32
L'idéal c'est de cacher ta feuille avant le traitement puis de la ré afficher à la fin, car il y a toute une partie graphique qui alourdi, comme le déplacement de cellule en cellule. Ainsi tu n'affiche ta fenêtre qu'à la fin du traitement et suivant celui ci c'est presque immédiat.
0
bonjour
si on a beaucoup de foction & de vba un peux partout


Ex: macro

Sub test()
With Application
.ScreenUpdating = False
.Calculation = xlManual
.EnableEvents = False
End With
' - Code
'
'
'
' Fin
With Application
.ScreenUpdating = True
.Calculation = xlCalculationAutomatic
.EnableEvents = True
End With
End Sub

A+
Maurice
0
skk201 Messages postés 938 Date d'inscription jeudi 11 septembre 2008 Statut Membre Dernière intervention 16 octobre 2016 54
Modifié par skk201 le 1/07/2014 à 14:48
Attention avec
.Calculation = xlManual 
!

Car imagine que tu utilises les données d'une cellule pour savoir le nombre de ligne complète de ta feuille et que cette cellule utilise une formule
=NBVAL(A:A)
par exemple alors la formule ne se mettra pas à jour.

Si ta macro consiste à ajouter des nouvelles lignes et que tu prend toujours le NBVAL comme référence pour le nombre de ligne dans la liste, alors tu écriras toujours dans la même ligne.

(Un peu complex pour rien dire, en gros faut quand même faire attention et pas hésiter a mettre un
ActiveSheet.Calculate
avant de prendre une valeur dans un cellule, afin d'éviter les problèmes)
0