Améliorer rapidité execution macro excel

Fermé
necro27 Messages postés 160 Date d'inscription jeudi 28 mai 2009 Statut Membre Dernière intervention 11 février 2011 - 11 juin 2009 à 14:22
gbinforme Messages postés 14946 Date d'inscription lundi 18 octobre 2004 Statut Contributeur Dernière intervention 24 juin 2020 - 12 juin 2009 à 21:43
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

A voir également:

5 réponses

gbinforme Messages postés 14946 Date d'inscription lundi 18 octobre 2004 Statut Contributeur Dernière intervention 24 juin 2020 4 718
11 juin 2009 à 23:17
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.
0
necro27 Messages postés 160 Date d'inscription jeudi 28 mai 2009 Statut Membre Dernière intervention 11 février 2011 8
12 juin 2009 à 09:40
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
0
gbinforme Messages postés 14946 Date d'inscription lundi 18 octobre 2004 Statut Contributeur Dernière intervention 24 juin 2020 4 718
12 juin 2009 à 09:51
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
0
necro27 Messages postés 160 Date d'inscription jeudi 28 mai 2009 Statut Membre Dernière intervention 11 février 2011 8
12 juin 2009 à 12:25
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 :)
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
gbinforme Messages postés 14946 Date d'inscription lundi 18 octobre 2004 Statut Contributeur Dernière intervention 24 juin 2020 4 718
12 juin 2009 à 21:43
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
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.
0