Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Lenteurs de macros VBA sous Excel 2007 vs Excel 2003

4 réponses
Avatar
Nicolas
Bonjour,

J'utilise une boucle "FOR" pour effectuer des traitements de remplissage
dans un fichier d'environ 26000 lignes. Ce développement VBA programmé sous
Excel 2003 prend environ 40 secondes. Sur le même PC sous Excel 2007, le même
traitement prend 5 minutes.

Certaines fonctions sous VBA 2007 auraient elles changées au profit d'autres ?
Quelqun peut il m'éclairer svp ? Merci par avance.

Ci-dessous la boucle "FOR" en cause :

For i = 1 To NombreLignes - 1
If ActiveCell.Offset(i, 0).Value = "Base" Then
Puissance = ActiveCell.Offset(i, 14).Value
Fixe = Application.WorksheetFunction.VLookup(Puissance, PlageST, 5, False)
PF_CU_bareme = Application.WorksheetFunction.VLookup(Puissance, PlageST,
6, False)
PF_MU_bareme = Application.WorksheetFunction.VLookup(Puissance, PlageST,
8, False)
PF_LU_bareme = Application.WorksheetFunction.VLookup(Puissance, PlageST,
10, False)
Conso_CU_bareme = Application.WorksheetFunction.VLookup(Puissance,
PlageST, 7, False)
Conso_MU_bareme = Application.WorksheetFunction.VLookup(Puissance,
PlageST, 9, False)
Conso_LU_bareme = Application.WorksheetFunction.VLookup(Puissance,
PlageST, 11, False)

PF_CU = Fixe + (PF_CU_bareme * Puissance)
Conso_CU = (Conso_CU_bareme * ActiveCell.Offset(i, 7).Value) / 100
TURPE2_CU = PF_CU + Conso_CU
MOYENNE_CU = TURPE2_CU / (ActiveCell.Offset(i, 10).Value / 1000)
CTA_CU = 0.21 * PF_CU

PF_MU = Fixe + (PF_MU_bareme * Puissance)
Conso_MU = (Conso_MU_bareme * ActiveCell.Offset(i, 7).Value) / 100
TURPE2_MU = PF_MU + Conso_MU
MOYENNE_MU = TURPE2_MU / (ActiveCell.Offset(i, 10).Value / 1000)
CTA_MU = 0.21 * PF_MU

PF_LU = Fixe + (PF_LU_bareme * Puissance)
Conso_LU = (Conso_LU_bareme * ActiveCell.Offset(i, 7).Value) / 100
TURPE2_LU = PF_LU + Conso_LU
MOYENNE_LU = TURPE2_LU / (ActiveCell.Offset(i, 10).Value / 1000)
CTA_LU = 0.21 * PF_LU

TURPE2_OPTIMISE_BASE = Application.WorksheetFunction.Min(TURPE2_CU +
CTA_CU, TURPE2_MU + CTA_MU, TURPE2_LU + CTA_LU)
If TURPE2_OPTIMISE_BASE = TURPE2_CU + CTA_CU Then OPTIMISE = "CU"
If TURPE2_OPTIMISE_BASE = TURPE2_MU + CTA_MU Then OPTIMISE = "MU"
If TURPE2_OPTIMISE_BASE = TURPE2_LU + CTA_LU Then OPTIMISE = "LU"
If OPTIMISE = "CU" Then
PF_OPT = PF_CU
Conso_OPT = Conso_CU
TURPE2_OPT = TURPE2_CU
MOYENNE_OPT = MOYENNE_CU
CTA_OPT = CTA_CU
End If
If OPTIMISE = "MU" Then
PF_OPT = PF_MU
Conso_OPT = Conso_MU
TURPE2_OPT = TURPE2_MU
MOYENNE_OPT = MOYENNE_MU
CTA_OPT = CTA_MU
End If
If OPTIMISE = "LU" Then
PF_OPT = PF_LU
Conso_OPT = Conso_LU
TURPE2_OPT = TURPE2_LU
MOYENNE_OPT = MOYENNE_LU
CTA_OPT = CTA_LU
End If
' CU
ActiveCell.Offset(i, 16).Value = Round(PF_CU, 2)
ActiveCell.Offset(i, 17).Value = Round(Conso_CU, 2)
ActiveCell.Offset(i, 18).Value = Round(TURPE2_CU, 2)
ActiveCell.Offset(i, 19).Value = Round(MOYENNE_CU, 2)
ActiveCell.Offset(i, 20).Value = Round(CTA_CU, 2)
' MU
ActiveCell.Offset(i, 22).Value = Round(PF_MU, 2)
ActiveCell.Offset(i, 23).Value = Round(Conso_MU, 2)
ActiveCell.Offset(i, 24).Value = Round(TURPE2_MU, 2)
ActiveCell.Offset(i, 25).Value = Round(MOYENNE_MU, 2)
ActiveCell.Offset(i, 26).Value = Round(CTA_MU, 2)
' LU
ActiveCell.Offset(i, 28).Value = Round(PF_LU, 2)
ActiveCell.Offset(i, 29).Value = Round(Conso_LU, 2)
ActiveCell.Offset(i, 30).Value = Round(TURPE2_LU, 2)
ActiveCell.Offset(i, 31).Value = Round(MOYENNE_LU, 2)
ActiveCell.Offset(i, 32).Value = Round(CTA_LU, 2)
' minimum TURPE2 BASE optimisé
ActiveCell.Offset(i, 40).Value = OPTIMISE
ActiveCell.Offset(i, 41).Value = Round(PF_OPT, 2)
ActiveCell.Offset(i, 42).Value = Round(Conso_OPT, 2)
ActiveCell.Offset(i, 43).Value = Round(TURPE2_OPT, 2)
ActiveCell.Offset(i, 44).Value = Round(MOYENNE_OPT, 2)
' CTA BASE optimisée
ActiveCell.Offset(i, 46).Value = Round(CTA_OPT, 2)
ActiveCell.Offset(i, 47).Value = Round(CTA_OPT / (ActiveCell.Offset(i,
10).Value / 1000), 2)
End If
If ActiveCell.Offset(i, 0).Value = "Double" Then
Puissance = ActiveCell.Offset(i, 14).Value
Fixe = Application.WorksheetFunction.VLookup(Puissance, PlageDT, 5, False)
PF_MUDT_bareme = Application.WorksheetFunction.VLookup(Puissance,
PlageDT, 6, False)
ConsoHP_MUDT_bareme = Application.WorksheetFunction.VLookup(Puissance,
PlageDT, 7, False)
ConsoHC_MUDT_bareme = Application.WorksheetFunction.VLookup(Puissance,
PlageDT, 8, False)

PF_MUDT = Fixe + (PF_MUDT_bareme * Puissance)
ConsoHP_MUDT = (ConsoHP_MUDT_bareme * ActiveCell.Offset(i, 7).Value) / 100
ConsoHC_MUDT = (ConsoHC_MUDT_bareme * ActiveCell.Offset(i, 8).Value) / 100
TURPE2_MUDT = PF_MUDT + ConsoHP_MUDT + ConsoHC_MUDT
MOYENNE_MUDT = TURPE2_MUDT / (ActiveCell.Offset(i, 10).Value / 1000)
CTA_MUDT = 0.21 * PF_MUDT
' MU DT
ActiveCell.Offset(i, 34).Value = Round(PF_MUDT, 2)
ActiveCell.Offset(i, 35).Value = Round(ConsoHP_MUDT + ConsoHC_MUDT, 2)
ActiveCell.Offset(i, 36).Value = Round(TURPE2_MUDT, 2)
ActiveCell.Offset(i, 37).Value = Round(MOYENNE_MUDT, 2)
ActiveCell.Offset(i, 38).Value = Round(CTA_MUDT, 2)
' TURPE2 DOUBLE (optimisé)
ActiveCell.Offset(i, 40).Value = "MU DT"
ActiveCell.Offset(i, 41).Value = Round(PF_MUDT, 2)
ActiveCell.Offset(i, 42).Value = Round(ConsoHP_MUDT + ConsoHC_MUDT, 2)
ActiveCell.Offset(i, 43).Value = Round(TURPE2_MUDT, 2)
ActiveCell.Offset(i, 44).Value = Round(MOYENNE_MUDT, 2)
' CTA DOUBLE
ActiveCell.Offset(i, 46).Value = Round(CTA_MUDT, 2)
ActiveCell.Offset(i, 47).Value = Round(CTA_MUDT / (ActiveCell.Offset(i,
10).Value / 1000), 2)
End If
Next i

4 réponses

Avatar
Youky
Bonjour
Un début pour speeder
J'ai modifié que le début de la macro, je trouve le N° ligne ensuite direct
cela évite le VLookup .
La gestion d'écran et de calculation peuvent faire aussi gagner du temps
Je pense aussi qu'il serait bon d'éviter le Activecell.offset à moins que la
macro utilise la selection
pour le départ(et même on peut gérer).
Youky

Application.ScreenUpdating = False 'affichage non géré donc+rapide
Application.Calculation = xlManual 'plus de calcul auto.
For i = 1 To NombreLignes - 1
If ActiveCell.Offset(i, 0).Value = "Base" Then
Puissance = ActiveCell.Offset(i, 14).Value
' remplacer A:A par la bonne colonne
'c'est la colonne ou l'on recherche la Puissance
lig = [A:A].Find(Puissance, , xlValues).Row 'recherche de la ligne
Fixe = Cells(lig, 5)
PF_CU_bareme = Cells(lig, 6) ' on connait la ligne on y va direct
PF_MU_bareme = Cells(lig, 8) ' si PlageST est <>de la page active il
faut indiquer l'Onglet
PF_LU_bareme = Cells(lig, 10)
Conso_CU_bareme = Cells(lig, 7)
Conso_MU_bareme = Cells(lig, 9)
Conso_LU_bareme = Cells(lig, 11)

PF_CU = Fixe + (PF_CU_bareme * Puissance)
'le reste de la macro
'bla bla bla
Application.Calculation = xlAutomatic 'on remet calcul auto normal
Application.ScreenUpdating = True ' on remets l'affichage
Avatar
Youky
En supposant que tes plages

PlageST est sur Feuil2

PlageDT est sur Feuil3

A remplacer en macro selon le codename de la feuille

Il s'agit du nom de gauche en fenêtre projet et pas le nom d'onglet

La macro commence à la ligne de la cellule active

A vérifier si Puissance est bien en colonne N :N

Youky





Application.ScreenUpdating = False
Application.Calculation = xlManual
For i = ActiveCell.Row To NombreLignes - 1
If Cells(i, 1).Value = "Base" Then
Puissance = Cells(i, 14).Value
' remplacer N:N si pas la bonne colonne
'c'est la colonne ou l'on recherche la Puissance
lig = [N:N].Find(Puissance, , xlValues).Row 'recherche de la ligne
Fixe = Cells(lig, 5)
PF_CU_bareme = feuil2.Cells(lig, 6) ' on connait la ligne on y va direct
PF_MU_bareme = feuil2.Cells(lig, 8) ' si PlageST est <>de la page active
PF_LU_bareme = feuil2Cells(lig, 10)
Conso_CU_bareme = feuil2.Cells(lig, 7)
Conso_MU_bareme = feuil2Cells(lig, 9)
Conso_LU_bareme = feuil2Cells(lig, 11)

PF_CU = Fixe + (PF_CU_bareme * Puissance)



Conso_CU = (Conso_CU_bareme * Cells(i, 7).Value) / 100
TURPE2_CU = PF_CU + Conso_CU
MOYENNE_CU = TURPE2_CU / (Cells(i, 10).Value / 1000)
CTA_CU = 0.21 * PF_CU

PF_MU = Fixe + (PF_MU_bareme * Puissance)
Conso_MU = (Conso_MU_bareme * Cells(i, 7).Value) / 100
TURPE2_MU = PF_MU + Conso_MU
MOYENNE_MU = TURPE2_MU / (Cells(i, 10).Value / 1000)
CTA_MU = 0.21 * PF_MU

PF_LU = Fixe + (PF_LU_bareme * Puissance)
Conso_LU = (Conso_LU_bareme * Cells(i, 7).Value) / 100
TURPE2_LU = PF_LU + Conso_LU
MOYENNE_LU = TURPE2_LU / (Cells(i, 10).Value / 1000)
CTA_LU = 0.21 * PF_LU

TURPE2_OPTIMISE_BASE = Application.WorksheetFunction.Min(TURPE2_CU + _
CTA_CU, TURPE2_MU + CTA_MU, TURPE2_LU + CTA_LU)
If TURPE2_OPTIMISE_BASE = TURPE2_CU + CTA_CU Then OPTIMISE = "CU"
If TURPE2_OPTIMISE_BASE = TURPE2_MU + CTA_MU Then OPTIMISE = "MU"
If TURPE2_OPTIMISE_BASE = TURPE2_LU + CTA_LU Then OPTIMISE = "LU"
If OPTIMISE = "CU" Then
PF_OPT = PF_CU
Conso_OPT = Conso_CU
TURPE2_OPT = TURPE2_CU
MOYENNE_OPT = MOYENNE_CU
CTA_OPT = CTA_CU
End If
If OPTIMISE = "MU" Then
PF_OPT = PF_MU
Conso_OPT = Conso_MU
TURPE2_OPT = TURPE2_MU
MOYENNE_OPT = MOYENNE_MU
CTA_OPT = CTA_MU
End If
If OPTIMISE = "LU" Then
PF_OPT = PF_LU
Conso_OPT = Conso_LU
TURPE2_OPT = TURPE2_LU
MOYENNE_OPT = MOYENNE_LU
CTA_OPT = CTA_LU
End If
' CU
Cells(i, 16).Value = Round(PF_CU, 2)
Cells(i, 17).Value = Round(Conso_CU, 2)
Cells(i, 18).Value = Round(TURPE2_CU, 2)
Cells(i, 19).Value = Round(MOYENNE_CU, 2)
Cells(i, 20).Value = Round(CTA_CU, 2)
' MU
Cells(i, 22).Value = Round(PF_MU, 2)
Cells(i, 23).Value = Round(Conso_MU, 2)
Cells(i, 24).Value = Round(TURPE2_MU, 2)
Cells(i, 25).Value = Round(MOYENNE_MU, 2)
Cells(i, 26).Value = Round(CTA_MU, 2)
' LU
Cells(i, 28).Value = Round(PF_LU, 2)
Cells(i, 29).Value = Round(Conso_LU, 2)
Cells(i, 30).Value = Round(TURPE2_LU, 2)
Cells(i, 31).Value = Round(MOYENNE_LU, 2)
Cells(i, 32).Value = Round(CTA_LU, 2)
' minimum TURPE2 BASE optimisé
Cells(i, 40).Value = OPTIMISE
Cells(i, 41).Value = Round(PF_OPT, 2)
Cells(i, 42).Value = Round(Conso_OPT, 2)
Cells(i, 43).Value = Round(TURPE2_OPT, 2)
Cells(i, 44).Value = Round(MOYENNE_OPT, 2)
' CTA BASE optimisée
Cells(i, 46).Value = Round(CTA_OPT, 2)
Cells(i, 47).Value = Round(CTA_OPT / (Cells(i,10).Value / 1000), 2)
End If
If Cells(i, 1).Value = "Double" Then
Puissance = Cells(i, 14).Value

lig = [N:N].Find(Puissance, , xlValues).Row 'recherche de la ligne
Fixe = feuil3.Cells(lig, 5)
PF_MUDT_bareme = feuil3.Cells(lig, 6)
ConsoHP_MUDT_bareme = feuil3.Cells(lig, 7)
ConsoHC_MUDT_bareme = feuil3.Cells(lig, 8)

PF_MUDT = Fixe + (PF_MUDT_bareme * Puissance)
ConsoHP_MUDT = (ConsoHP_MUDT_bareme * Cells(i, 7).Value) / 100
ConsoHC_MUDT = (ConsoHC_MUDT_bareme * Cells(i, 8).Value) / 100
TURPE2_MUDT = PF_MUDT + ConsoHP_MUDT + ConsoHC_MUDT
MOYENNE_MUDT = TURPE2_MUDT / (Cells(i, 10).Value / 1000)
CTA_MUDT = 0.21 * PF_MUDT
' MU DT
Cells(i, 34).Value = Round(PF_MUDT, 2)
Cells(i, 35).Value = Round(ConsoHP_MUDT + ConsoHC_MUDT, 2)
Cells(i, 36).Value = Round(TURPE2_MUDT, 2)
Cells(i, 37).Value = Round(MOYENNE_MUDT, 2)
Cells(i, 38).Value = Round(CTA_MUDT, 2)
' TURPE2 DOUBLE (optimisé)
Cells(i, 40).Value = "MU DT"
Cells(i, 41).Value = Round(PF_MUDT, 2)
Cells(i, 42).Value = Round(ConsoHP_MUDT + ConsoHC_MUDT, 2)
Cells(i, 43).Value = Round(TURPE2_MUDT, 2)
Cells(i, 44).Value = Round(MOYENNE_MUDT, 2)
' CTA DOUBLE
Cells(i, 46).Value = Round(CTA_MUDT, 2)
Cells(i, 47).Value = Round(CTA_MUDT / (Cells(i, 10).Value /1000), 2)
End If
Next i

Application.Calculation = xlAutomatic 'on remet calcul auto normal
Application.ScreenUpdating = True ' on remets l'affichage
Avatar
Nicolas
Merci pour tes réponses Youky.
Mais je ne comprends pas pourquoi sur Excel 2003 les temps de réponses sont
environ 10 fois meilleurs pour l'exécution de cette macro que sur Excel 2007
(à PC égal).




En supposant que tes plages

PlageST est sur Feuil2

PlageDT est sur Feuil3

A remplacer en macro selon le codename de la feuille

Il s'agit du nom de gauche en fenêtre projet et pas le nom d'onglet

La macro commence à la ligne de la cellule active

A vérifier si Puissance est bien en colonne N :N

Youky





Application.ScreenUpdating = False
Application.Calculation = xlManual
For i = ActiveCell.Row To NombreLignes - 1
If Cells(i, 1).Value = "Base" Then
Puissance = Cells(i, 14).Value
' remplacer N:N si pas la bonne colonne
'c'est la colonne ou l'on recherche la Puissance
lig = [N:N].Find(Puissance, , xlValues).Row 'recherche de la ligne
Fixe = Cells(lig, 5)
PF_CU_bareme = feuil2.Cells(lig, 6) ' on connait la ligne on y va direct
PF_MU_bareme = feuil2.Cells(lig, 8) ' si PlageST est <>de la page active
PF_LU_bareme = feuil2Cells(lig, 10)
Conso_CU_bareme = feuil2.Cells(lig, 7)
Conso_MU_bareme = feuil2Cells(lig, 9)
Conso_LU_bareme = feuil2Cells(lig, 11)

PF_CU = Fixe + (PF_CU_bareme * Puissance)



Conso_CU = (Conso_CU_bareme * Cells(i, 7).Value) / 100
TURPE2_CU = PF_CU + Conso_CU
MOYENNE_CU = TURPE2_CU / (Cells(i, 10).Value / 1000)
CTA_CU = 0.21 * PF_CU

PF_MU = Fixe + (PF_MU_bareme * Puissance)
Conso_MU = (Conso_MU_bareme * Cells(i, 7).Value) / 100
TURPE2_MU = PF_MU + Conso_MU
MOYENNE_MU = TURPE2_MU / (Cells(i, 10).Value / 1000)
CTA_MU = 0.21 * PF_MU

PF_LU = Fixe + (PF_LU_bareme * Puissance)
Conso_LU = (Conso_LU_bareme * Cells(i, 7).Value) / 100
TURPE2_LU = PF_LU + Conso_LU
MOYENNE_LU = TURPE2_LU / (Cells(i, 10).Value / 1000)
CTA_LU = 0.21 * PF_LU

TURPE2_OPTIMISE_BASE = Application.WorksheetFunction.Min(TURPE2_CU + _
CTA_CU, TURPE2_MU + CTA_MU, TURPE2_LU + CTA_LU)
If TURPE2_OPTIMISE_BASE = TURPE2_CU + CTA_CU Then OPTIMISE = "CU"
If TURPE2_OPTIMISE_BASE = TURPE2_MU + CTA_MU Then OPTIMISE = "MU"
If TURPE2_OPTIMISE_BASE = TURPE2_LU + CTA_LU Then OPTIMISE = "LU"
If OPTIMISE = "CU" Then
PF_OPT = PF_CU
Conso_OPT = Conso_CU
TURPE2_OPT = TURPE2_CU
MOYENNE_OPT = MOYENNE_CU
CTA_OPT = CTA_CU
End If
If OPTIMISE = "MU" Then
PF_OPT = PF_MU
Conso_OPT = Conso_MU
TURPE2_OPT = TURPE2_MU
MOYENNE_OPT = MOYENNE_MU
CTA_OPT = CTA_MU
End If
If OPTIMISE = "LU" Then
PF_OPT = PF_LU
Conso_OPT = Conso_LU
TURPE2_OPT = TURPE2_LU
MOYENNE_OPT = MOYENNE_LU
CTA_OPT = CTA_LU
End If
' CU
Cells(i, 16).Value = Round(PF_CU, 2)
Cells(i, 17).Value = Round(Conso_CU, 2)
Cells(i, 18).Value = Round(TURPE2_CU, 2)
Cells(i, 19).Value = Round(MOYENNE_CU, 2)
Cells(i, 20).Value = Round(CTA_CU, 2)
' MU
Cells(i, 22).Value = Round(PF_MU, 2)
Cells(i, 23).Value = Round(Conso_MU, 2)
Cells(i, 24).Value = Round(TURPE2_MU, 2)
Cells(i, 25).Value = Round(MOYENNE_MU, 2)
Cells(i, 26).Value = Round(CTA_MU, 2)
' LU
Cells(i, 28).Value = Round(PF_LU, 2)
Cells(i, 29).Value = Round(Conso_LU, 2)
Cells(i, 30).Value = Round(TURPE2_LU, 2)
Cells(i, 31).Value = Round(MOYENNE_LU, 2)
Cells(i, 32).Value = Round(CTA_LU, 2)
' minimum TURPE2 BASE optimisé
Cells(i, 40).Value = OPTIMISE
Cells(i, 41).Value = Round(PF_OPT, 2)
Cells(i, 42).Value = Round(Conso_OPT, 2)
Cells(i, 43).Value = Round(TURPE2_OPT, 2)
Cells(i, 44).Value = Round(MOYENNE_OPT, 2)
' CTA BASE optimisée
Cells(i, 46).Value = Round(CTA_OPT, 2)
Cells(i, 47).Value = Round(CTA_OPT / (Cells(i,10).Value / 1000), 2)
End If
If Cells(i, 1).Value = "Double" Then
Puissance = Cells(i, 14).Value

lig = [N:N].Find(Puissance, , xlValues).Row 'recherche de la ligne
Fixe = feuil3.Cells(lig, 5)
PF_MUDT_bareme = feuil3.Cells(lig, 6)
ConsoHP_MUDT_bareme = feuil3.Cells(lig, 7)
ConsoHC_MUDT_bareme = feuil3.Cells(lig, 8)

PF_MUDT = Fixe + (PF_MUDT_bareme * Puissance)
ConsoHP_MUDT = (ConsoHP_MUDT_bareme * Cells(i, 7).Value) / 100
ConsoHC_MUDT = (ConsoHC_MUDT_bareme * Cells(i, 8).Value) / 100
TURPE2_MUDT = PF_MUDT + ConsoHP_MUDT + ConsoHC_MUDT
MOYENNE_MUDT = TURPE2_MUDT / (Cells(i, 10).Value / 1000)
CTA_MUDT = 0.21 * PF_MUDT
' MU DT
Cells(i, 34).Value = Round(PF_MUDT, 2)
Cells(i, 35).Value = Round(ConsoHP_MUDT + ConsoHC_MUDT, 2)
Cells(i, 36).Value = Round(TURPE2_MUDT, 2)
Cells(i, 37).Value = Round(MOYENNE_MUDT, 2)
Cells(i, 38).Value = Round(CTA_MUDT, 2)
' TURPE2 DOUBLE (optimisé)
Cells(i, 40).Value = "MU DT"
Cells(i, 41).Value = Round(PF_MUDT, 2)
Cells(i, 42).Value = Round(ConsoHP_MUDT + ConsoHC_MUDT, 2)
Cells(i, 43).Value = Round(TURPE2_MUDT, 2)
Cells(i, 44).Value = Round(MOYENNE_MUDT, 2)
' CTA DOUBLE
Cells(i, 46).Value = Round(CTA_MUDT, 2)
Cells(i, 47).Value = Round(CTA_MUDT / (Cells(i, 10).Value /1000), 2)
End If
Next i

Application.Calculation = xlAutomatic 'on remet calcul auto normal
Application.ScreenUpdating = True ' on remets l'affichage







Avatar
Youky
Je ne possède pas Excel 2007.
Le 2003 consomme surement moins de ressources que le nouveau
qui possède des tableaux bien plus large.
PS si la macro reste longue tu peux mettre un DoEvents en dessous de For
....
cela redonne la main à windows (il aime bien)
Youky


"Nicolas" a écrit dans le message de
news:
Merci pour tes réponses Youky.
Mais je ne comprends pas pourquoi sur Excel 2003 les temps de réponses
sont
environ 10 fois meilleurs pour l'exécution de cette macro que sur Excel
2007
(à PC égal).




En supposant que tes plages

PlageST est sur Feuil2

PlageDT est sur Feuil3

A remplacer en macro selon le codename de la feuille

Il s'agit du nom de gauche en fenêtre projet et pas le nom d'onglet

La macro commence à la ligne de la cellule active

A vérifier si Puissance est bien en colonne N :N

Youky





Application.ScreenUpdating = False
Application.Calculation = xlManual
For i = ActiveCell.Row To NombreLignes - 1
If Cells(i, 1).Value = "Base" Then
Puissance = Cells(i, 14).Value
' remplacer N:N si pas la bonne colonne
'c'est la colonne ou l'on recherche la Puissance
lig = [N:N].Find(Puissance, , xlValues).Row 'recherche de la ligne
Fixe = Cells(lig, 5)
PF_CU_bareme = feuil2.Cells(lig, 6) ' on connait la ligne on y va
direct
PF_MU_bareme = feuil2.Cells(lig, 8) ' si PlageST est <>de la page
active
PF_LU_bareme = feuil2Cells(lig, 10)
Conso_CU_bareme = feuil2.Cells(lig, 7)
Conso_MU_bareme = feuil2Cells(lig, 9)
Conso_LU_bareme = feuil2Cells(lig, 11)

PF_CU = Fixe + (PF_CU_bareme * Puissance)



Conso_CU = (Conso_CU_bareme * Cells(i, 7).Value) / 100
TURPE2_CU = PF_CU + Conso_CU
MOYENNE_CU = TURPE2_CU / (Cells(i, 10).Value / 1000)
CTA_CU = 0.21 * PF_CU

PF_MU = Fixe + (PF_MU_bareme * Puissance)
Conso_MU = (Conso_MU_bareme * Cells(i, 7).Value) / 100
TURPE2_MU = PF_MU + Conso_MU
MOYENNE_MU = TURPE2_MU / (Cells(i, 10).Value / 1000)
CTA_MU = 0.21 * PF_MU

PF_LU = Fixe + (PF_LU_bareme * Puissance)
Conso_LU = (Conso_LU_bareme * Cells(i, 7).Value) / 100
TURPE2_LU = PF_LU + Conso_LU
MOYENNE_LU = TURPE2_LU / (Cells(i, 10).Value / 1000)
CTA_LU = 0.21 * PF_LU

TURPE2_OPTIMISE_BASE = Application.WorksheetFunction.Min(TURPE2_CU +
_
CTA_CU, TURPE2_MU + CTA_MU, TURPE2_LU + CTA_LU)
If TURPE2_OPTIMISE_BASE = TURPE2_CU + CTA_CU Then OPTIMISE = "CU"
If TURPE2_OPTIMISE_BASE = TURPE2_MU + CTA_MU Then OPTIMISE = "MU"
If TURPE2_OPTIMISE_BASE = TURPE2_LU + CTA_LU Then OPTIMISE = "LU"
If OPTIMISE = "CU" Then
PF_OPT = PF_CU
Conso_OPT = Conso_CU
TURPE2_OPT = TURPE2_CU
MOYENNE_OPT = MOYENNE_CU
CTA_OPT = CTA_CU
End If
If OPTIMISE = "MU" Then
PF_OPT = PF_MU
Conso_OPT = Conso_MU
TURPE2_OPT = TURPE2_MU
MOYENNE_OPT = MOYENNE_MU
CTA_OPT = CTA_MU
End If
If OPTIMISE = "LU" Then
PF_OPT = PF_LU
Conso_OPT = Conso_LU
TURPE2_OPT = TURPE2_LU
MOYENNE_OPT = MOYENNE_LU
CTA_OPT = CTA_LU
End If
' CU
Cells(i, 16).Value = Round(PF_CU, 2)
Cells(i, 17).Value = Round(Conso_CU, 2)
Cells(i, 18).Value = Round(TURPE2_CU, 2)
Cells(i, 19).Value = Round(MOYENNE_CU, 2)
Cells(i, 20).Value = Round(CTA_CU, 2)
' MU
Cells(i, 22).Value = Round(PF_MU, 2)
Cells(i, 23).Value = Round(Conso_MU, 2)
Cells(i, 24).Value = Round(TURPE2_MU, 2)
Cells(i, 25).Value = Round(MOYENNE_MU, 2)
Cells(i, 26).Value = Round(CTA_MU, 2)
' LU
Cells(i, 28).Value = Round(PF_LU, 2)
Cells(i, 29).Value = Round(Conso_LU, 2)
Cells(i, 30).Value = Round(TURPE2_LU, 2)
Cells(i, 31).Value = Round(MOYENNE_LU, 2)
Cells(i, 32).Value = Round(CTA_LU, 2)
' minimum TURPE2 BASE optimisé
Cells(i, 40).Value = OPTIMISE
Cells(i, 41).Value = Round(PF_OPT, 2)
Cells(i, 42).Value = Round(Conso_OPT, 2)
Cells(i, 43).Value = Round(TURPE2_OPT, 2)
Cells(i, 44).Value = Round(MOYENNE_OPT, 2)
' CTA BASE optimisée
Cells(i, 46).Value = Round(CTA_OPT, 2)
Cells(i, 47).Value = Round(CTA_OPT / (Cells(i,10).Value / 1000), 2)
End If
If Cells(i, 1).Value = "Double" Then
Puissance = Cells(i, 14).Value

lig = [N:N].Find(Puissance, , xlValues).Row 'recherche de la ligne
Fixe = feuil3.Cells(lig, 5)
PF_MUDT_bareme = feuil3.Cells(lig, 6)
ConsoHP_MUDT_bareme = feuil3.Cells(lig, 7)
ConsoHC_MUDT_bareme = feuil3.Cells(lig, 8)

PF_MUDT = Fixe + (PF_MUDT_bareme * Puissance)
ConsoHP_MUDT = (ConsoHP_MUDT_bareme * Cells(i, 7).Value) / 100
ConsoHC_MUDT = (ConsoHC_MUDT_bareme * Cells(i, 8).Value) / 100
TURPE2_MUDT = PF_MUDT + ConsoHP_MUDT + ConsoHC_MUDT
MOYENNE_MUDT = TURPE2_MUDT / (Cells(i, 10).Value / 1000)
CTA_MUDT = 0.21 * PF_MUDT
' MU DT
Cells(i, 34).Value = Round(PF_MUDT, 2)
Cells(i, 35).Value = Round(ConsoHP_MUDT + ConsoHC_MUDT, 2)
Cells(i, 36).Value = Round(TURPE2_MUDT, 2)
Cells(i, 37).Value = Round(MOYENNE_MUDT, 2)
Cells(i, 38).Value = Round(CTA_MUDT, 2)
' TURPE2 DOUBLE (optimisé)
Cells(i, 40).Value = "MU DT"
Cells(i, 41).Value = Round(PF_MUDT, 2)
Cells(i, 42).Value = Round(ConsoHP_MUDT + ConsoHC_MUDT, 2)
Cells(i, 43).Value = Round(TURPE2_MUDT, 2)
Cells(i, 44).Value = Round(MOYENNE_MUDT, 2)
' CTA DOUBLE
Cells(i, 46).Value = Round(CTA_MUDT, 2)
Cells(i, 47).Value = Round(CTA_MUDT / (Cells(i, 10).Value /1000), 2)
End If
Next i

Application.Calculation = xlAutomatic 'on remet calcul auto normal
Application.ScreenUpdating = True ' on remets l'affichage