Accélérer macro
Bonjour le forum,
J'ai réalisé récemment une macro sous excel au format VBA qui compile l'intégralité des données de fichier présent dans un dossier
(dossier composé d'environ 1000 fichier).
Mon problème est que l'analyse de ces fichiers est un peux longue environ 7 à 8 minute pour l'ensemble des fichiers (Ce qui est déjà bien plus rapide que la méthode à l'ancienne
Je pense que le code est optimisable mais j'ai beau chercher je ne trouve pas comment bien modifier mon fichier
(J'ai pour moi trop de .Select .Copy .Activate et 6 fois une répétition des étapes mais sur des onglets différent ce qui ajoute énormément de ligne)
ci-joint le fichier récap avec la macro (macro complet à prendre en compte) et un fichier données (Il y a seulement 1 onglet sur les 6 de base du fichier)
Merci d'avance pour le temps consacré
Bonjour,
J'ai l'impression que tu manipules beaucoup d'objets alors que ce que tu devrais manipuler plutôt c'est de la donnée.
En gros, au lieu de faire des Copy Paste de Cells, tu gagnerais pas mal de temps à récupérer les informations que tu veux dans un Array, et ensuite insérer les valeurs de ton Array dans ta destination.
En espérant que cette première piste t'aide.
Bonjour,
J'avais pensé à l'utilisation de la fonction Array et de virer les copy paste qui me bouffe du temps mais je n'ai pas réussi à l'utiliser malgré plusieurs essais
Faut-il faire un Array de tous mes onglets d'un coup ou 1 à 1 comme ma macro actuellement ?
Merci
Bonjour Tofover,
Je viens de me replonger un peu dans ton code et je dois avouer que malgré un code assez bien commenté il reste difficile à comprendre car il demande des aller-retour entre la feuille Excel (pour comprendre quel objet tu manipules) et le code.
Perso je n'utilise pas la fonction Array même si je pense qu'elle serait plus propre, cependant j'aurais tendance à tester de remplacer le code suivant:
Set DEST = OD.Cells(Application.Rows.Count, "B").End(xlUp).Offset(1, 0)
OS.Range("A6:Q34").Copy DEST 'copie la plage A6:Q34 de l'onglet source et la colle dans DESTPar:
Dim TableauACopier()
TableauACopier=Range("A6:Q34") 'Si on reprend le range fixe que tu as défini
Set DEST = OD.Range("B4:R36") 'Pour "copier" sous cette forme, il faut que la destination soit de la même dimension, du coup j'ai mis ici une plage fixe correspondante démarrant en B4
DEST.Select 'A vérifier s'il faut Select la Worksheets(1) si elle n'est pas la sheet active à ce moment là
Selection=TableauACopierAprès pour l'ensemble de tes Modules, je pense qu'ils peuvent être rentrés en un seul avec comme facteur l'ActiveWorksheet.
Sinon tu fais un UserForm en début de macro, tu mets une comboBox et tu sélectionnes la fonction que tu veux lancer (en paramétrant selon le choix sélectionné ton OD)
Et pour la synthèse complète tu fais une boucle For en tête de ta macro, par contre il faudra certainement rendre ta macro initiale publique pour que ça marche