Se connecter avec
S'enregistrer | Connectez-vous

Vitesse d'execution de macro

Dernière réponse : dans Programmation

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 ?
  1. Private Sub CommandButton2_Click()
  2.  
  3. Dim pays_source As Workbook, wb_targetPIE As ...
  4. Dim ws_PIE As Worksheet, ws_OMB As Worksheet, ...
  5. Dim compteur As Long, row_target As Integer
  6. Dim Chemin As String, pays_a_copier As String
  7.  
  8. Chemin = ActiveWorkbook.Path
  9. pays_a_copier = Dir(Chemin & "\" & "* 3 YP by CBU.xls")
  10. Application.ScreenUpdating = False
  11.  
  12. ''\\ GBU PIE
  13. If CheckBox1 = True Then
  14. If MsgBox("Vous êtes sur le point de charger les données des pays selectionnés sur CONSO PIE. Continuer?", vbYesNo) <> vbYes Then
  15. Exit Sub
  16. End If
  17. Set wb_targetPIE = Workbooks.Open(Chemin & "\" & "CONSO PIE.xls")
  18. Set ws_targetPIE = wb_targetPIE.Worksheets("LC")
  19.  
  20. For compteur = 0 To Me.ListBox1.ListCount - 1
  21. row_target = ws_targetPIE.Range("A65536").End(xlUp).Row + 2 'aller ligne vide
  22.  
  23. If Me.ListBox1.Selected(compteur) Then
  24. Set pays_source = Workbooks.Open(Chemin & "\" & pays_a_copier)
  25. Set ws_PIE = pays_source.Worksheets("PIE")
  26.  
  27. If Application.WorksheetFunction.Sum(ws_PIE.Range("L37,AI37,BF37,CC37")) > 0 Then
  28. ws_targetPIE.Rows(row_target & ":" & row_target + 39).Value = ws_PIE.Rows("11:50").Value
  29. End If
  30. pays_source.Close
  31. End If
  32. pays_a_copier = Dir()
  33. Next
  34. End If

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!

Autres pages sur : vitesse execution macro

Lassé par la pub ? Créez un compte

Meilleure solution

Expert Programmation

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 :
  1. 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.

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 

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: 
Lassé par la pub ? Créez un compte