Améliorer rapidité execution macro excel
necro27
Messages postés
175
Statut
Membre
-
gbinforme Messages postés 15481 Date d'inscription Statut Contributeur Dernière intervention -
gbinforme Messages postés 15481 Date d'inscription Statut Contributeur Dernière intervention -
Bonjour à tous !!
Je présente mon problème :
J'ai une macro situé dans le workbook_open, qui s'exécute on va dire avec beaucoup de temps...
En effet je 'concatène' 2 fichiers vers un 3ème contenant des informations concernant des articles, possèdent, par exemple 5 000 lignes. Donc j'ouvre fichier 1, je prend la valeur en A1 et je la met en fichier 3, j'ouvre fichier 2 je copie B1 en feuille 3, j'ouvre fichier 1 je copie A2 en feuill 3 etc...
Le temps d'exécution de la macro diffère selon les postes, et par conséquent mets entre 3 et 10 minutes puor s'exécuter et renvoyer le résultat attendu.
J'ai masqué chaque page qui concerne le traitement (réduction fenêtre) puis ré-agrandissement en fin de programme qui réduit déja de beaucoup le temps de traitement, mais il existerai un moyen d'effectuer ce traitement grâce à un compteur situé dans la bordure bas du tableur (en dessou du nom des feuilles) mais je ne sais pas comment faire et l'exemple que l'on m'a montré est protégé par un mot de passe, ainsi ne pui-je pas aller voir le code..
Si vous avez besoin de clarté, n'hésitez pas
Merci beaucoup d'avance
Necro 27
Je présente mon problème :
J'ai une macro situé dans le workbook_open, qui s'exécute on va dire avec beaucoup de temps...
En effet je 'concatène' 2 fichiers vers un 3ème contenant des informations concernant des articles, possèdent, par exemple 5 000 lignes. Donc j'ouvre fichier 1, je prend la valeur en A1 et je la met en fichier 3, j'ouvre fichier 2 je copie B1 en feuille 3, j'ouvre fichier 1 je copie A2 en feuill 3 etc...
Le temps d'exécution de la macro diffère selon les postes, et par conséquent mets entre 3 et 10 minutes puor s'exécuter et renvoyer le résultat attendu.
J'ai masqué chaque page qui concerne le traitement (réduction fenêtre) puis ré-agrandissement en fin de programme qui réduit déja de beaucoup le temps de traitement, mais il existerai un moyen d'effectuer ce traitement grâce à un compteur situé dans la bordure bas du tableur (en dessou du nom des feuilles) mais je ne sais pas comment faire et l'exemple que l'on m'a montré est protégé par un mot de passe, ainsi ne pui-je pas aller voir le code..
Si vous avez besoin de clarté, n'hésitez pas
Merci beaucoup d'avance
Necro 27
A voir également:
- Améliorer rapidité execution macro excel
- Telecharger macro convertir chiffre en lettre excel - Télécharger - Tableur
- Liste déroulante excel - Guide
- Word et excel gratuit - Guide
- Si ou excel - Guide
- Déplacer colonne excel - Guide
5 réponses
bonjour
Tu n'as pas besoin d'ouvrir chaque fichier pour chaque cellule.
Si tu qualifies chaque fichier pour récupérer les données cela ne devrait pas durer mais ce n'est pas simple de savoir exactement ton fonctionnement.
Tu n'as pas besoin d'ouvrir chaque fichier pour chaque cellule.
Si tu qualifies chaque fichier pour récupérer les données cela ne devrait pas durer mais ce n'est pas simple de savoir exactement ton fonctionnement.
bonjour,
je me suis mal exprimé, en faite je n'ouvre pas chaque classeur, j'active chaque classeur..
mais le souci est que pendant le traitement, l'affichage des 2 fenêtres actives brillent en permanence à tour de rôle, lors de la copie des données.
Mais je me suis aperçu qu'en ce qui concerne le compteur dont je parlais, il ne diminue pas le temps de traitement, mais par contre pour des soucis d'aparance, je le trouve plus esthétique..saurais tu commet il faut faire?
En faite il s'agit d'un petit compteur qui s'affiche dans la barre grise du classeur excel, juste en dessous de la dénomination des feuilles, et qui affiche en faite le nombre de lignes traitées sur le nombre de ligne total..
merci d'avance :)
Necro27
je me suis mal exprimé, en faite je n'ouvre pas chaque classeur, j'active chaque classeur..
mais le souci est que pendant le traitement, l'affichage des 2 fenêtres actives brillent en permanence à tour de rôle, lors de la copie des données.
Mais je me suis aperçu qu'en ce qui concerne le compteur dont je parlais, il ne diminue pas le temps de traitement, mais par contre pour des soucis d'aparance, je le trouve plus esthétique..saurais tu commet il faut faire?
En faite il s'agit d'un petit compteur qui s'affiche dans la barre grise du classeur excel, juste en dessous de la dénomination des feuilles, et qui affiche en faite le nombre de lignes traitées sur le nombre de ligne total..
merci d'avance :)
Necro27
bonjour
j'active chaque classeur..
C'est bien là que tu peux gagner du temps car tu n'as pas besoin d'activer les classeurs.
tu fais :
dim w1 as Workbook
dim w2 as Workbook
set w1 = Workbook("fichier1")
set w2 = Workbook("fichier2")
fichier 3.range("A1") = w1.range("A1")
fichier 3.range("B1") = w2.range("B1")
Bien entendu la syntaxe du fichier 3 est à adapter à ta syntaxe.
Tu mets en début la ligne suivante pour éviter le scintillement.
Application.screenupdating = false
j'active chaque classeur..
C'est bien là que tu peux gagner du temps car tu n'as pas besoin d'activer les classeurs.
tu fais :
dim w1 as Workbook
dim w2 as Workbook
set w1 = Workbook("fichier1")
set w2 = Workbook("fichier2")
fichier 3.range("A1") = w1.range("A1")
fichier 3.range("B1") = w2.range("B1")
Bien entendu la syntaxe du fichier 3 est à adapter à ta syntaxe.
Tu mets en début la ligne suivante pour éviter le scintillement.
Application.screenupdating = false
désolé je ne pouvais pa répondre plus tot
Voici un exemple bateau avec lequel je test ton code, mais cela ne marche pas
Ce code est contenu dans le workbook_open
Private Sub Workbook_Open()
Dim ad1 As String, ad2 As String, ad3 As String, _
var1 As String, var2 As String, var3 As String
Dim w1 As Workbook, w2 As Workbook
var1 = Application.GetOpenFilename
Workbooks.Open (var1)
ad1 = ActiveWorkbook.Name
Set w1 = Workbooks(ad1)
var2 = Application.GetOpenFilename
Workbooks.Open (var2)
ad2 = ActiveWorkbook.Name
Set w2 = Workbooks(ad2)
var3 = Application.GetOpenFilename
Workbooks.Open (var3)
ad3 = ActiveWorkbook.Name
Workbooks(ad3).Range("A1") = w1.Range("A1")
Workbooks(ad3).Range("B1") = w2.Range("B1")
End Sub
Je sais où est l'erreur, en faite il faut :
private sub workbook_open()
test
end sub
puis dans un module
sub test ()
[...]
end sub
Dans le premier cas, cela me renvoi une erreur sans ligne qui me dit que 'propriété ou objet non géré par cet éta'
et l'autre l'erreur est que la ligne
Set w1 = Workbook(ad1) me renvoi le message sub ou fonction non définie..
as-tu une idée?
merci et désolé pour le retard de la réponse, mais étant stagiaire, l'on m'avait attribué une autre tâche entre temps..bref merci :)
Voici un exemple bateau avec lequel je test ton code, mais cela ne marche pas
Ce code est contenu dans le workbook_open
Private Sub Workbook_Open()
Dim ad1 As String, ad2 As String, ad3 As String, _
var1 As String, var2 As String, var3 As String
Dim w1 As Workbook, w2 As Workbook
var1 = Application.GetOpenFilename
Workbooks.Open (var1)
ad1 = ActiveWorkbook.Name
Set w1 = Workbooks(ad1)
var2 = Application.GetOpenFilename
Workbooks.Open (var2)
ad2 = ActiveWorkbook.Name
Set w2 = Workbooks(ad2)
var3 = Application.GetOpenFilename
Workbooks.Open (var3)
ad3 = ActiveWorkbook.Name
Workbooks(ad3).Range("A1") = w1.Range("A1")
Workbooks(ad3).Range("B1") = w2.Range("B1")
End Sub
Je sais où est l'erreur, en faite il faut :
private sub workbook_open()
test
end sub
puis dans un module
sub test ()
[...]
end sub
Dans le premier cas, cela me renvoi une erreur sans ligne qui me dit que 'propriété ou objet non géré par cet éta'
et l'autre l'erreur est que la ligne
Set w1 = Workbook(ad1) me renvoi le message sub ou fonction non définie..
as-tu une idée?
merci et désolé pour le retard de la réponse, mais étant stagiaire, l'on m'avait attribué une autre tâche entre temps..bref merci :)
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
bonjour
Non ta macro fonctionne très bien mais je t'avais dis d'adapter la syntaxe que je n'avais pas testée et si tu mets ceci, cela fonctionne très bien
Cela évite l'activation des classeurs et permet un déroulement rapide avec bien sûr une boucle sur les infos à récupérer.
Non ta macro fonctionne très bien mais je t'avais dis d'adapter la syntaxe que je n'avais pas testée et si tu mets ceci, cela fonctionne très bien
Workbooks(ad3).ActiveSheet.Range("A1") = w1.ActiveSheet.Range("A1")
Workbooks(ad3).ActiveSheet.Range("B1") = w2.ActiveSheet.Range("B1")
Cela évite l'activation des classeurs et permet un déroulement rapide avec bien sûr une boucle sur les infos à récupérer.