Lenteurs de macros VBA sous Excel 2007 vs Excel 2003
4 réponses
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.
Cette action est irreversible, confirmez la suppression du commentaire ?
Signaler le commentaire
Veuillez sélectionner un problème
Nudité
Violence
Harcèlement
Fraude
Vente illégale
Discours haineux
Terrorisme
Autre
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
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
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
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)
Application.Calculation = xlAutomatic 'on remet calcul auto normal Application.ScreenUpdating = True ' on remets l'affichage
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)
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)
Application.Calculation = xlAutomatic 'on remet calcul auto normal Application.ScreenUpdating = True ' on remets l'affichage
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)
Application.Calculation = xlAutomatic 'on remet calcul auto normal Application.ScreenUpdating = True ' on remets l'affichage
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)
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)
Application.Calculation = xlAutomatic 'on remet calcul auto normal Application.ScreenUpdating = True ' on remets l'affichage
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)
Application.Calculation = xlAutomatic 'on remet calcul auto normal Application.ScreenUpdating = True ' on remets l'affichage
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" <Nicolas@discussions.microsoft.com> a écrit dans le message de
news: 722FC06D-E5E9-4B11-8FE2-94E797643C6C@microsoft.com...
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)
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)