Optimisation de code VBA pour réduire le temps d'exécution | ||
---|---|---|
Inscription: 20/07/2009
Messages:
9
Système d'exploitation: PC Version Excel utilisée: 2007 |
Posté le : 25-03-2011 15h14
Bonjour le forum,
j'ai construit un fichier excel avec macros pour mon boulot qui permet de suivre l'évolution de chaque dossier en cours. Après beacoup de temps passé dessus, les macros fonctionnent mais avec l'ajout de nouveaux dossier, le temps d'attente est maintenant rédhibitoire ! Pouvez-vous me donner des conseils pour optimiser mon code qui est très lourd ? Je pense qu'il faut que je vous dise ce que j'attends de ce fichier pour que vous compreniez plus rapidement ce que j'ai fait : à partir d'un seul point d'entrée (premier onglet "Suivi sur 10j") où chaque utilisateur rentre les informations, les macros permettent pour la colonne D : - de répercuter cette information dans les autres onglets ("Clients" pour les infos actives, c'est à dire avec *, en fonctions des clients ; "Aujoud'hui" pour les infos du jour ou non réalisée en fonction des collaborateurs ; "Clients historique" pour déplacer les infos non actives de plus de 10j) - de mettre en forme cette information suivant un code couleur et suivant ce que le texte mentionne, - de créer des feuilles imprimables avec les informations lorsque l'on clique sur le bouton "Impression" (le bouton "Tri des dates" n'est pas fonctionnel) - de gérer le nombre de lignes visibles par client (chaque client dispose de 15 lignes mais seule une ligne vide apparaît pour prendre moins de place et les autres sont masquées automatiquement) Pour les autres colonnes, il s'agt d'un simple copier/coller. N'hésitez pas à me dire si je ne suis pas assez clair :) Aïe ! il y a un problème : je n'arrive pas à réduire assez la taille du fichier pour le joindre (220ko min). Est-ce que je peux laisser une adresse mail pour que les personnes souhaitant m'aider me demande le fichier ? Merci par avance GGlyon |
|
![]() |
![]() ![]() |
Re: Optimisation de code VBA pour réduire le temps d'exécution | ||
---|---|---|
Inscription: 09/01/2008
De Montréal, Québec
Messages:
463
Système d'exploitation: PC Version Excel utilisée: 97 à 2016 |
Posté le : 25-03-2011 21h03
Bonjour GGlyon,
Hmmm... présenté ainsi la chose risque fort d'effrayer tout codeur bénévole. Tu écris Citation : j'ai construit un fichier excel avec macros Aussi le mot "Boulot" peut, lui aussi, porter à la méfiance. Après tout. Ensuite ton classeur fait plus de 200 Ko! Es-tu sûr de n'avoir laissé que l'essentiel? Par exemple il n'est nul besoin de laisser 50 345 lignes dans 10 feuilles de calcul. Quelques lignes seulement peuvent suffire. Et les images, notes texte et autres trucs, en as-tu débarrassé le classeur? À tout hasard et sans promesse de résultat tu peux laisser ton classeur en pièce jointe à mon adresse publique sur ce site. Je sortirai mon couperet ou ma hache pour voir si une cure minceur ne peut être appliquée à ce boulimique et laisserai l'amaigri en pièce jointe ici. Le tout, je répète, sans promesse de résultat. Cordialement, Guy |
|
![]() |
![]() ![]() |
Re: Optimisation de code VBA pour réduire le temps d'exécution | ||
---|---|---|
Inscription: 20/07/2009
Messages:
9
Système d'exploitation: PC Version Excel utilisée: 2007 |
Posté le : 28-03-2011 10h19
Bonjour Guy,
merci d'avoir donné suite à mon post. Pour ce qui est de mon expérience en vba, elle est plutôt limitée. J'ai organisé mon code et mis des commentaires au fur et à mesure donc ce ne devrait pas être trop la jungle ! Pour ce qui est de la taille, je ne sais pas ce qui prend autant de place car à part les macros, il n'y a que 5 onglets avec au plus 100 lignes pour 14 colonnes de textes... Merci en tout cas pour la proposition d'aide, je t'envoie de ce pas mon classeur. Cordialement, GGlyon |
|
![]() |
![]() ![]() |
Re: Optimisation de code VBA pour réduire le temps d'exécution | ||
---|---|---|
Inscription: 09/01/2008
De Montréal, Québec
Messages:
463
Système d'exploitation: PC Version Excel utilisée: 97 à 2016 |
Posté le : 28-03-2011 18h47
Bonjour GGlyon,
Suite à une petite fouille sur les objets Shape de ton classeur il apparaît, entre autres, qu'il y a pléthore. Petit résumé de la fouille. Nombre de boutons dans le classeur pour chaque feuille concernée. Suivi sur 10j 2 Save1 258 Save2 256 Save3 258 Save4 258 Save5 198 Total 1230 boutons dans le classeur Le petit classeur joint porte un aperçu plus complet. On remarquera que la plupart des boutons sont superposés. Voir les coordonnées des boutons en colonnes respectives. Un petit ménage s'impose je crois. Je te laisse la chose à méditer et la tâche d'éliminer les très nombreux boutons redondants. Cela fera sans doute un peu de place. Je poursuis le régime minceur de ton classeur puisque quelques indices m'indiquent qu'il y a autre chose d'inutilement gargantuesque sous les fagots. Cordialement, Guy |
|
![]() |
![]() ![]() |
Re: Optimisation de code VBA pour réduire le temps d'exécution | ||
---|---|---|
Inscription: 20/07/2009
Messages:
9
Système d'exploitation: PC Version Excel utilisée: 2007 |
Posté le : 29-03-2011 10h17
Bonjour Guy,
effectivement, j'avais complètement oublié les feuilles cachées de sauvegarde et je ne savais pas que les boutons se copiaient à l'infini !! En enlevant tout ça, j'arrive à un fichier de 97ko, merci. Ces sauvegardes permettent de revenir sur les 5 dernières opérations vue que les macros empêchent le classique "retour en arrière" (ctrl+Z). J'espère que tu trouveras encore quelques éléments à éliminer pour arriver aux 80ko :) Cordialement, GGlyon |
|
![]() |
![]() ![]() |
Re: Optimisation de code VBA pour réduire le temps d'exécution | ||
---|---|---|
Inscription: 09/01/2008
De Montréal, Québec
Messages:
463
Système d'exploitation: PC Version Excel utilisée: 97 à 2016 |
Posté le : 29-03-2011 10h46
Bonjour GGlyon,
Mon couperet est émoussé et ma hache a le manche fendu. Bref je ne suis pas parvenu à réduire convenablement la taille du fichier Suivi des missions 2010_anonyme.xlsm au dessous des 80 Ko. Faute de mieux j'ai converti la chose au format Excel 97-2003 et zippé le tout pour un abordable 49 Ko. Le point principal de ta question était d'optimiser la procédure Worksheet_SelectionChange() où le traitement est effectué. VBAProject (Suivi des missions 2010_anonyme.xlsm) Je n'ai pas analysé le code en profondeur mais je subodore qu'une méthode plus expéditive de traitement est tout à fait possible. Pour ce faire pourrais-tu indiquer ce que tu désires faire de ces données, quelle en est la nature et le pourquoi de ces manipulations dans la procédure citée. À noter que j'ai arraché tous les boutons des feuilles cachés et que j'ai sans doute dénaturé un peu les données. Le fichier joint permettra au moins de donner à mordre aux nombreux experts* qui rôdent dans le coin. Cordialement, Guy * Dans le présent document, les termes employés pour désigner des personnes sont pris au sens générique; ils ont à la fois valeur d’un féminin et d’un masculin. Édition : ...le classique "retour en arrière" (ctrl+Z) est possible. Un peu compliqué mais possible. À suivre... Pièce jointe:
![]() |
|
![]() |
![]() ![]() |
Re: Optimisation de code VBA pour réduire le temps d'exécution | ||
---|---|---|
Inscription: 20/07/2009
Messages:
9
Système d'exploitation: PC Version Excel utilisée: 2007 |
Posté le : 29-03-2011 14h23
Merci beaucoup pour l'aide sur la publication du fichier.
En ce qui concerne ce que je veux faire avec ces données : tout d'abord, les données sont toujours entrées dans le premier onglet sous la forme "date : (nom) infos". Si cette info est une action à réaliser, on ajoute une asterisque * à la fin pour qu'elle soit reconnu comme "active" A partir de là, je veux pouvoir annuler l'action s'il y a une erreur d'où les premières lignes de code qui copie toute la feuille sur une des feuilles cachées. Ensuite, si la modification de la première feuille concerne les colonnes 5 à 15, il suffit de copier ces mêmes colonnes dans le 2ème onglet. Cela correspond à la première boucle qui copie chaque première ligne de chaque dossier car il s'agit de 15 lignes fusionnées par dossier. J'ai mis en place 2 boucles : o = 5 to 15 et i = 2 to 452 (que je devrai d'ailleurs remplacer par i = 2 to Lig je pense). Ensuite, s la modification concerne la colonne 4, il faut gérer les lignes visibles et invisibles. C'est le seul moyen que j'ai trouvé pour ne pas avoir trop de lignes vides affichées et pour permettre l'ajout d'infos sur chaque dossier. La boucle principale (i = 2 to Lig où Lig est le nombre de lignes total variable en fonction de l'ajout de dossiers) permet de ne garder qu'une ligne vide par dossier. La boucle j = 2 to 100 me permet de faire la correspondance du nom de dossier entre les onglets 3 à 6 (une seule ligne par dossier) et le premier onglet (15 lignes par dossier). La boucle suivante k=0 to 14 permet de récupérer pour un dossier donné du premier onglet les infos de plus de 10j qui doivent allées dans l'onglet "Historique" Ensuite, les infos actives (donc avec *) datées de la date du jour ou antérieures sont copiées dans la feuille aujourd'hui dans la colonne de la personne devant réaliser l'action. Ensuite, toutes les infos actives sont copiées dans la feuille "Client" Ensuite, les textes sont mis en forme suivant un code que j'ai choisi (infos actives en rouge par exemple). La dernière boucle i=2 to Lig2 permet la même mise en forme uniquement sur les onglets 2 et 3. Il s'agit principalement d'éliminer les retour à la ligne (vblf) inutiles. J'espère que c'est assez clair, sinon n'hésitez pas à me poser des questions. Cordialement,GGlyon |
|
![]() |
![]() ![]() |
Re: Optimisation de code VBA pour réduire le temps d'exécution | ||
---|---|---|
Inscription: 09/01/2008
De Montréal, Québec
Messages:
463
Système d'exploitation: PC Version Excel utilisée: 97 à 2016 |
Posté le : 29-03-2011 15h25
Bonjour GGlyon,
Lorsque je t'ai demandé des explications sur les données je ne voulais pas dire de traduire en mots ce que ton code doit faire, je peux très bien lire le code et y retrouver le cahier des charges et les attentes clients mais cela est fastidieux et très long. Donc pourrais-tu, en oubliant le code, indiquer la structure des données puis l'articulation du traitement que tu comptes y opérer. On ne réfléchi pas en codant mais avant. Donc : Des données, leur représentation, les buts du traitements ensuite et seulement ensuite les moyens d'effectuer ce traitement. Les données se présentent sous la forme date : (nom) infossuivi ou pas par *. Bien. Il peut y avoir erreur de saisie? Bien. Pourquoi ne pas empêcher les erreurs de saisie? Comment? On y verra. Ensuite que peut bien vouloir dire Citation : si la modification de la première feuille concerne les colonnes 5 à 15 Comment fait-on pour savoir si ceci concerne cela? Citation : si la modification concerne la colonne 4 Idem. Qu'est-ce qui peut bien concerner la colonne 4? Qu'y a-t-il derrière ces si? Que cherches-tu à faire? Comment sont saisies les données? Bref, retour au début de mon petit laïus. Cordialement, Guy |
|
![]() |
![]() ![]() |
Re: Optimisation de code VBA pour réduire le temps d'exécution | ||
---|---|---|
Inscription: 20/07/2009
Messages:
9
Système d'exploitation: PC Version Excel utilisée: 2007 |
Posté le : 29-03-2011 17h07
@ Guy : désolé pour la mauvaise compréhension de la question et merci pour ta patience...
Le fichier doit permettre de réaliser le suivi de chaque "client/dossier" avec différentes présentations suivant l'information recherchée. Par exemple si je veux savoir ce que moi j'ai à faire aujourd'hui pour un dossier, je vais voir un onglet spécifique. Si je veux voir pour un client/dossier donné ce qu'il y a à faire, je vais voir un autre onglet... Les seules données devant être rentrées par l'utilisateur (je n'ai pas envisagé d'empêcher les erreurs de saisie), à un seul endroit pour plus de facilité, sont : - soit du type date : (nom) info suivi ou pas de * pour le suivi variable. Si aucune date précise ne peut être entrée, elle est de la forme XX/mois/année et doit pouvoir être gérée - soit une couleur de fond de cellule (vert, orange ou rouge) et parfois un peu de texte (par exemple xx %) dans 11 colonnes qui correspondent à 11 étapes de suivi fixes Actuellement, les infos sont entrées sur une ligne vierge d'un client/dossier (15 lignes réservées pour chaque client/dossier) ou alors modifiées sur une ligne déjà écrites. Une fois rentré, l'information doit être traitée sans action supplémentaire de la part de l'utilisateur. Ce traitement comprend la mise en forme pour en faciliter la lecture (dates en gras, infos active en rouge, retour d'information en vert, etc.). L'information doit aussi être répercutée sur les autres modes de vue qui sont : - vue à 10j par client/dossier (actuel onglet permettant l'entrée des données) : présente les infos de 10j ou moins en fonction du client/dossier et les étapes fixes avec les couleurs (vert = OK, orange = en cours, rouge = manque info). Cette vue doit être facilement imprimable pour la partie infos variables. Cette vue doit être mise en forme - vue "active" par client/dossier : présente les infos actives en fonction du client/dossier et les étapes fixes avec les couleurs (vert = OK, orange = en cours, rouge = manque info), mise en forme - vue par utilisateur au quotidien : présente les infos actives du jour et antérieures à la date actuelle (par exemple je devais passer un coup de téléphone hier et je ne l'ai pas fait, l'info n'a pas été inactivée donc elle apparaît) en fonction des uilisateurs et des clients, mise en forme - l'historique de chaque client/dossier : cumule les infos non actives de plus de 10j, pas de mise en forme Voilà pour les spécifications qui j'espère répondent en grande partie aux questions. Pour l'histoire des colonnes : dans mon fichier, l'info variable est en colonne 4 et les 11 infos fixes de la colonne 5 à 15 dans l'onglet de saisie. Cordialement, GGlyon |
|
![]() |
![]() ![]() |
Vous pouvez voir les sujets.
Vous ne pouvez pas débuter de nouveaux sujets.
Vous ne pouvez pas répondre aux contributions.
Vous ne pouvez pas éditer vos contributions.
Vous ne pouvez pas effacez vos contributions.
Vous ne pouvez pas ajouter de nouveaux sondages.
Vous ne pouvez pas voter en sondage.
Vous ne pouvez pas attacher des fichiers à vos contributions.
Vous ne pouvez pas poster sans approbation.
Qui consulte actuellement ce sujet ?