Résolu Vitesse d'execution de macro

  • Auteur de la discussion popeyem
  • Date de début

popeyem

Habitué
Bonjour à tous
voici un nouveau "probleme" de vitesse d'execution de ma macro.

Synopsis: j'ai un classeur (1 seule feuille: ma macro!) qui boucle sur les fichiers xl du dossier pour effectuer du copier coller sous condition.
Sur ma feuille macro j'ai 2 boutons; 1Listbox; 4 checkbox. La macro marche mais elle est assez lente. (1 des causes vient du fait que les fichiers mettent du temps à s'ouvrir). Une bonne âme saura-t-elle déceler les améliorations de mon code à apporter ?
[cpp]Private Sub CommandButton2_Click()

Dim pays_source As Workbook, wb_targetPIE As ...
Dim ws_PIE As Worksheet, ws_OMB As Worksheet, ...
Dim compteur As Long, row_target As Integer
Dim Chemin As String, pays_a_copier As String

Chemin = ActiveWorkbook.Path
pays_a_copier = Dir(Chemin & "\" & "* 3 YP by CBU.xls")
Application.ScreenUpdating = False

''\\ GBU PIE
If CheckBox1 = True Then
If MsgBox("Vous êtes sur le point de charger les données des pays selectionnés sur CONSO PIE. Continuer?", vbYesNo) <> vbYes Then
Exit Sub
End If
Set wb_targetPIE = Workbooks.Open(Chemin & "\" & "CONSO PIE.xls")
Set ws_targetPIE = wb_targetPIE.Worksheets("LC")

For compteur = 0 To Me.ListBox1.ListCount - 1
row_target = ws_targetPIE.Range("A65536").End(xlUp).Row + 2 'aller ligne vide

If Me.ListBox1.Selected(compteur) Then
Set pays_source = Workbooks.Open(Chemin & "\" & pays_a_copier)
Set ws_PIE = pays_source.Worksheets("PIE")

If Application.WorksheetFunction.Sum(ws_PIE.Range("L37,AI37,BF37,CC37")) > 0 Then
ws_targetPIE.Rows(row_target & ":" & row_target + 39).Value = ws_PIE.Rows("11:50").Value
End If
pays_source.Close
End If
pays_a_copier = Dir()
Next
End If[/cpp]
Je n'ai mis qu'une check Box, les 3 autres etant identiques. Je sais y a bcp de If, j'ai trouvé que ça.

Merci bien pour vos conseils!
 

zeb

Modérateur
Tu indentes très mal ton code. C'est difficile à lire. Fais un effort, stp.
Je regarde quand même ;) ...
 

zeb

Modérateur
Meilleure réponse
La ligne 21 est dans la boucle. Pourquoi ?

Tu dois avoir un problème de fonctionnement :
La fonction Dir() est faite pour être imbriquée dans une boucle Do While.
Or tu as une boucle For qui dépend d'une autre liste.
C'est pas clair.

Ligne 27, tu fais des calculs peut être un peu compliqués. J'aurai tendance à écrire :
Code:
ws_PIE.Range("L37").Value + ws_PIE.Range("AI37").Value + ws_PIE.Range("BF37").Value + ws_PIE.Range("CC37").Value
Ligne 28, tu copies beaucoup de chose d'un coup. Ce type de code mérite d'être placé entre ScreenUpdating = False/True.
Au diable les varices, mets-y toute la boucle.
 

popeyem

Habitué
bonjour,

J'ai mis la ligne 21 dans la boucle parce qu'en dehors ça marchait pas, les données étaient copiées les unes au-dessus des autres et non pas à la suite comme voulu.

Si j'enlève le dir(), mes fichiers s'ouvrent mais aucune valeur n'est mise dans mon fichier de destination. du coup jle laisse là où il est !

oui j'avais testé aussi ligne 27 avec les range.value, il me semble que c'est aussi rapide (et plus simple c'est vrai)

Enfin, j'ai rajouté un screenupdating = False pour la boucle.

Total des courses, j'ai pas du gagné grand chose.. Ca doit venir de "l'architecture" de mon code qui est un peu crade, j'avoue.

Mais ça marche, l'essentiel :D
 

popeyem

Habitué
Bon je me fais la conversation tout seul. Bonjour à tous!

J'ai trouvé le "consolidate sources" il y a qqs semaines (dix fois plus rapide et en faisant varier les cellules de destination j'arrive à ce que je veux) mais je ne peux pas l'appliquer à mon code puisque je dois d'abord tester la valeur d'une cellule; Bref comme c'est pas une macro qui va enormement servir, j'arrete le topic.

Merci pour les eclairages apportés!! :hello:
 
Vous devez vous inscrire ou vous connecter pour répondre ici.
Derniers messages publiés
Statistiques globales
Discussions
730 132
Messages
6 718 045
Membres
1 586 389
Dernier membre
ROCKET8
Partager cette page
Haut