Nettoyage macro

Bonjour,

Pouvez vous nettoyer en me précisant ce que qui a été enlevé et qui ne sert pas (pas l'améliorer car je risque de ne plus la comprendre), je vous joins le fichier,

Merci d'avance,

Cordialement,

massari59264, le forum,

Pour commencer, tu pourrais appliquer ce type de changement ...

Au lieu d'écrire :

 ...  
    Range("N1").Select
    ActiveCell.FormulaR1C1 = "ENCADRANTS A CONVERTIR"
    Range("I2").Select
    ActiveCell.FormulaR1C1 = "=LEN(RC[-4])-LEN(SUBSTITUTE(RC[-4],"","",""""))"
  ... 

Tu pourrais écrire :

 ...  
    Range("N1").FormulaR1C1 = "ENCADRANTS A CONVERTIR"
    Range("I2").FormulaR1C1 = "=LEN(RC[-4])-LEN(SUBSTITUTE(RC[-4],"","",""""))"
  ... 

Tu sauverais plusieurs lignes.

Puis, si tu as des doutes sur l'efficacité d'un changement, tu peux utiliser la touche F8 pour exécuter la macro en pas-à-pas.

LaCéline

Bonsoir,

Pour améliorer, tu pourrais commencer par supprimer 10 modules sur les 11 que tu as accumulé (dont 10 sont vides). Un seul suffit et suffira amplement pour toutes les procédures que tu auras à réaliser (sauf cas particulier de code demandant à être isolé du reste).

Ensuite comme LaCéline te l'a déjà suggéré, éliminer la tarte à la crème du code enregistré en faisant disparaître tous les Select, Selection, ActiveCell, etc. Cela conduit à requalifier les objets, soit à remplacer les Selection ou ActiveCell par les objets préalablement sélectionné, à faire en un seul temps ce qui l'était en 2 ou 3...

Dans la foulée, supprimer, sans même prendre la peine de réfléchir tous les : Application.CutCopyMode = False ! Partout où tu trouveras cette commande mise par l'enregistreur, c'est que tu n'en as pas besoin, donc la supprimer. Si jamais tu en avais besoin quelque part, c'est forcément à un emplacement où l'enregistreur ne l'a pas mise, et uniquement à la fin avant de rendre la main à l'utilisateur...

A ce stade, tu devrais avoir réduit de moitié le volume de code...

La phase suivante pour se déshabituer de l'influence de l'enregistreur consiste à effectuer quelques remplacements utiles : éliminer l'objet Window fréquemment utilisé avec des Select pour y substituer les objets Workbook ou Worksheet sur lesquels se déroule l'action (dès lors qu'il ne s'agit pas de manipulations concernant exclusivement l'affichage).

Autre expression à substituer : FormulaR1C1 (l'enregistrement ne connait que ça) : utiliser Value lorsqu'on affecte une valeur, et Formula s'il s'agit d'une formule (la formule étant à mettre en style A1), car sauf à être un des rares utilisateurs à n'utiliser que le style L1C1, si l'on utilise le style A1 sur le tableur il n'y a pas de raison de faire autrement en VBA. On ne pourra que s'y retrouver plus facilement.

Egalement, ça j'aurais dû le placer plus haut car c'est une priorité ! Mettre systématiquement toutes ses déclarations de variables en tête de procédure. Cela fait partie des règles conventionnelles, qui permettent certes de toujours savoir où trouver les déclarations, mais pas seulement, lorsqu'il rencontre une déclaration VBA réserve l'espace mémoire qui lui est dévolu et il y a tout intérêt à ce que cette opération soit concentrée au démarrage de la procédure...

L'étape ultérieure consistera à analyser les arguments (ou paramètres) des méthodes ou propriétés utilisées. L'enregistreur a la facheuse tendance à reprendre tous les paramètres que tu modifies ou non leur valeur par défaut. Il s'ensuit que tu définis ainsi de nombreux paramètres à la valeur qu'ils ont déjà, ce qui est généralement parfaitement inutile ! Il y a juste quelques cas auxquels il faut veiller, là où cela modifie des paramètres de fonctionnalités Excel qui demeurent à la valeur modifiée durant la session (cela ne vaut pour ces cas que pour les paramètres les moins courant dans le cas où tu les utilises effectivement).

C'est également l'occasion de s'habituer à passer les arguments par position (l'enregistreur ne connait que le passage par noms). Le passage par position fait toujours gagner une place conséquente, le passage par noms n'offre d'intérêt que dans quelques cas relativement particuliers...

Et là on va peut-être se trouver avec des énumérations répétitives, on a intérêt à les éliminer par des blocs With (instruction qui fait toujours gagner de la place, et surtout de la rapidité !) et des boucles...

Les 3/4 du volume de code actuel auront été éliminés !

Il ne restera plus qu'à se pencher sur les copier-coller : s'il s'agit de valeurs, abandonner le copier-coller au profit d'affectations directes de valeurs, ou éventuellement par l'intermédiaire de tableaux. Et voir ce qui peut être optimisé par l'usage de tableaux ou autres techniques propres à VBA.

Cordialement.

Bonjour,

Merci beaucoup pour votre retour, j'ai réalisé ce que j'ai pu car je ne maitrise pas du tout les macros :

  • pour supprimer les modules, je n'ai pas su faire mieux que de créer un nouveau classeur lol
  • j'ai supprimer les select que j'ai pu et remplacer formula R1C1 par Value ou formula

Pour les variables, je les déclare au fur et à mesure pour pouvoir me resservir du code quand j'en aurai l'occasion sur un autre travail, est ce vraiment nécessaire de les déclarer en haut?et est ce que la déclaration de variable au début va s'appliquer sur toutes les feuilles de mon fichier?

La macro ralentit au moment ou elle supprimer mes colonnes M et N de l'onglet TB ACTIVITE

Je joins le fichier excel et word de ma macro si vous avez d'autres solution pour raccourcir.

Merci d'avance

17classeur-1.xlsm (36.35 Ko)
10sub-activite.docx (15.96 Ko)

Je ne vois guère de différences, toujours autant d'éléments parasites, et tu as ajouté quelques anomalies...

A suivre. Bonne journée.

Ce serait bien de me dire ou sont les anomalies?

Cordialement,

Par exemple : tu substitues Formula à FormulaR1C1, mais tu ne changes pas le style de la formule qui reste formulée en style L1C1...

Tu places un With mais les plages qui suivent dans le bloc ne se réfèrent pas à la feuille sous bloc With (pas de point devant les Range...). Il me semble aussi qu'il manque un End With, mais l'indentation n'étant pas systématique et vu la longueur on ne voit pas du premier coup...)

"Par exemple : tu substitues Formula à FormulaR1C1, mais tu ne changes pas le style de la formule qui reste formulée en style L1C1..."

Comment fait on pour changer le style de la formule? est ce que ça va changer mes résultats?

"Tu places un With mais les plages qui suivent dans le bloc ne se réfèrent pas à la feuille sous bloc With (pas de point devant les Range...). Il me semble aussi qu'il manque un End With, mais l'indentation n'étant pas systématique et vu la longueur on ne voit pas du premier coup...)"

Que dois je faire car c'est un cumul de macro que j'ai trouvé sur le net ...

Désolé je suis mauvais dans le domaine vba

Merci pour ton retour

Plus tard ! Je n'ai pas le temps dans l'immédiat.

Pas de soucis, merci déja de me répondre et reviens quand tu pourras car je n'y arriverais pas seul

Bonne journée,

Cordialement,

Ça va avancer lentement ! Ton bloc With au départ (qui n'a pas l'air d'avoir été fermé) à l'intérieur duquel des opérations toujours sous Select complique quelque peu et laisse planer des doutes sur certaines opérations. Ainsi :

La feuille USAGERS a été effacée au départ.

On a mis des formules de I à N sur TB ACTIVITE, que l'on a étendues, puis écrasées par copie valeur.

On copie la colonne M de TB ACTIVITE, que l'on va coller en A sur USAGERS.

On inscrit "USAGERS" en B1 ! Pourquoi donc ? La colonne B est vide et le restera puisqu'onva tout effacer...

On affecte la colonne A que l'on vient de coller à un tableau (tablo), puis l'on efface la feuille !!

A quoi ça rime ? Nul besoin de copier M ailleurs pour l'affecter et effacer la copie. On pouvait affecter directement la colonne m à tablo !

On est dans l'absurde !!!

Rien de tel pour ne plus absolument savoir ce qui doit être fait !

Es-tu en mesure de faire un descriptif précis de ce que doit faire la macro ? En partant de la description de ce qui doit être fait pour aboutir au résultat, on pourra l'écrire et on gagnera du temps ! Je ne peux pas interpréter le n'importe quoi que fait ce code en l'état.

Il faut que la description soit précise, pas tant sur la façon dont toi tu l'as faite dans la macro, mais sur sa signification et le résultat à obtenir (exemple : tu mets une série de formules, que tu étends pour les écraser par copie, la formule ne m'intéresse pas, ce qu'il faut c'est ce que doit contenir la colonne et la source des données, et je pourrai alors la remplir directement sans utiliser de formule ! )

Cordialement.

Bonjour, merci pour ton retour.

"On inscrit "USAGERS" en B1 ! Pourquoi donc ? La colonne B est vide et le restera puisqu'on va tout effacer..."

En afit je copie la colonne B de l'onglet USAGERS pour la placer en colonne M dans l'onglet TB ACTIVITE.

En début de macro j'efface ce qui a dans les onglets USAGERS E et ENCADRANTS car je vais chaque mois importer un onglet excel que je renommerai TB activité .(la longueur du tableau TB activité sera différente d'un mois à l'autre)

Le résultat que je souhaite :

1) supprimer la ligne 2 de mon TB activité

2)Nommer i1 j1 k1 l1 m1 n1 et mettre les formules décrites en i2 j2 k2 l2 m2 n2 que je descend jusqu'à ce que la colonne A soit non vide.

je copie les formules et le colles en valeurs, puis j'ai besoin de la colonne M et N.

3)Je commence par M que je colle dans (USAGERS) colonne A et le code me permet de trier par ordre alphabétique les noms lignes par ligne et les placer les uns en dessous des autres dans la colonne B (j'ai donc plus de lignes ds colonne B que dans la A)

4)Je selectionne la colonne N que je colle dans (encadrants) colonne A et le code me permet de trier sans ordre alphabétique les noms lignes par ligne et les placer les uns en dessous des autres dans la colonne B (j'ai donc plus de lignes ds colonne B que dans la A)

5) une fois mes données des colonnes M & N TB activité dans usagers et encadrants je n'en ai plus besoin et donc je les supprime, et la macro lance des insertions lignes en fonction du nombre inscrit dans le colonne J.

6) je colle la colonne B USAGERS & encadrants dans mon tableau TB activité. et je termine par le reste des formules.

Voila le raisonnement, dans le résultat obtenu c'est ce que je souhaitais !

Merci de me donner ton point de vue...

Je reprends :

Tu reçois TB ACTIVITE,

1) Tu supprimes la ligne 2 : OK j'ai vu ça !

2) Tu mets des en-têtes en I à N : Ok !

et formules en ligne 2, extension, copie, collage-valeurs : OK, c'est ce que tu fais !

Tu ne m'explicites pas le contenu des colonnes concernées, ainsi que je le demandais, mais pas de problème jusqu'ici, j'ai analysé ces formules et vu ce qu'elle faisaient (pour pouvoir remplacer ça ! ), bien que le résultat me paraisse un peu curieux et j'aurais aimé un explication sur le sens des duplications ou non qui sont faites...

Tu dis que tu as besoin de M et N (pour l'instant, je n'ai vu que M ?)

3) Tu colles M dans USAGERS colonne A : Ok !

Mais cela ne m'explique pas pourquoi tu mets "USAGERS" en B1 pour effacer le tout après affectation de la colonne A à tablo !

Ni pourquoi on n'a pas affecté la colonne M à tablo (sans passer par la copie sur USAGERS) puisqu'on aurait eu strictement le même résultat avec un certain de nombre de manipulations (tout à fait gratuites donc !) en moins !!!

Tu dis que le code te permet alors de trier les noms ligne par ligne et les placer en B. Il y parvient laborieusement avec quelques détours : on trie en incluant une ligne ou deux en plus, et on colle en B avec une ligne en plus si plus d'un nom... C'est plutôt amateur tout ça !

4) Je le verrai plus tard (ENCADRANTS) mais le principe doit être le même, tri excepté...

5) Tu supprimes M et N dans TB ACTIVITE : Ok, je le vois !

Et tu lances des insertions selon nombre inscrit en J : je verrai ça !

Après insertion, tu sers (par collage) M et N avec les colonnes B des deux autres feuilles... Arrêtons-nous là !

Il serait préférable de m'indiquer, comme je le demandais, ce qui conditionne tes insertions de lignes, sur quel critère tu calcules J et fais tes duplications de noms..., de façon que je puisse comprendre la motivation de l'opération, et la réaliser sans erreur en éliminant tout ce cinéma...

Cordialement.

Merci pour le temps apssé a essayer de comprendre

1) OK

2)La colonne N je l'utilise par la suite pour l'intégrer dans "ENCADRANTS"

3)"Mais cela ne m'explique pas pourquoi tu mets "USAGERS" en B1 pour effacer le tout après affectation de la colonne A à tablo !

Ni pourquoi on n'a pas affecté la colonne M à tablo (sans passer par la copie sur USAGERS) puisqu'on aurait eu strictement le même résultat avec un certain de nombre de manipulations (tout à fait gratuites donc !) en moins !!!"

Je vais tenter d’être plus clair lol car je ne le suis pas du tout.

Si je ne passe par la copie de la colonne M sur USAGERS au moment ou la macro va insérer des lignes cette colonne sera fausse dans l'utilisation des noms usagers.

Le nombre de lignes a intégrer en J est : si le nombre d'encadrants (F2) =0 et que le nombre d'usagers est >1(I2);alors nombre d'usagers (i2);.sinon NB USAGERS*NB ENCADRANTS(I2*F2)

La colonne M fait si le nombre d'encadrant est = 0, alors indique la celulle E2(nom des usagers), sinon repéte (e2) par le nombre d'encadrant.

C compliqué a expliquer mais je pense que si je ne passe par un onglet usager et encadrant, je ne pourrais pas faire le résultat que je veux

Merci pour ta réponse

Je ne sais pas si c'est possible de la faire sans passer par l'onglet usagers ?

Le tri ligne par ligne par ordre alphabétique m'a été filé sur ce site et je l'ai appliqué sans forcément tout comprendre !

https://forum.excel-pratique.com/excel/vba-tri-ligne-par-ligne-tranpose-horizontal-en-vertical-t92622.html

c'est le code qu'on m'a filé pour obtenir le tri ligne par ligne par ordre alphabétique , et comme cela fonctionné !

Si je ne passe par la copie de la colonne M sur USAGERS au moment ou la macro va insérer des lignes cette colonne sera fausse dans l'utilisation des noms usagers.

Je ne vois pas en quoi, c'est tablo que tu utilises et non la colonne A, reproduction de M. Donc affecter tablo à partir de M ou de A est strictement identique, l'affecter à partir de M fait l'économie d'une opération.

Pour ce qui est du traitement de tablo, le concepteur utilise j qui vient d'être utilisé comme compteur de boucle, en pensant visiblement que j conserve sa dernière valeur utile dans la boucle. Ce n'est pas le cas : si tu fais une boucle de j = 0 à 4, à la sortie de la boucle j sera égal à 5 ! D'où ces lignes en plus qui heureusement sont vides...

Il pouvait d'autre part opérer ce tri sans matérialiser sur la feuille et sans utiliser de copier-coller, donc au moins jusqu'au stade du déroulement de la macro : insertions lignes et service de M et N, on peut a-priori opérer ligne par ligne sur TB ACTIVITE pour parvenir au même résultat...

Ok j'ai compris, il m'en a fallu du temps lol

"Je ne vois pas en quoi, c'est tablo que tu utilises et non la colonne A, reproduction de M. Donc affecter tablo à partir de M ou de A est strictement identique, l'affecter à partir de M fait l'économie d'une opération"

Je n'ai donc pas besoin de copier M et N dans l'onglet usagers et encadrant mais je ne serais pas l'écrire en vba !

Le souci c'est que je n'avais pas donné le fichier complet et c'est pour cela que j'ai extrait son code et que je l'ai mis dans ma macro.

"Pour ce qui est du traitement de tablo, le concepteur utilise j qui vient d'être utilisé comme compteur de boucle, en pensant visiblement que j conserve sa dernière valeur utile dans la boucle. Ce n'est pas le cas : si tu fais une boucle de j = 0 à 4, à la sortie de la boucle j sera égal à 5 ! D'où ces lignes en plus qui heureusement sont vides..."

La désolé je ne comprends pas car je ne comprends pas déjà pas ce qu'il a fait , tu penses pouvoir faire autrement? sans erreur?

Peux tu essayer de me le faire car je ne comprends pas comment arriver au résultat que je souhaite sans passer par les onglets usagers et encadrants !

Pour m'assurer que j'ai bien compris ton histoire d'insertions de ligne :

-s'il n'y a qu'1 usager et pas d'encadrant, rien ne bouge (et rien en M et N)

-s'il y a plusieurs usagers et pas d'encadrant, on ajoute autant de lignes que d'usagers (les noms des usagers se retrouveront dans les nouvelles lignes en M, rien en N)

-s'il y a 1 ou plusieurs usagers et 1 ou plusieurs encadrants, autant de lignes ajoutées que de couples possibles usager-encadrant (les couples sont listés en M (usager) et N (encadrant) sur les lignes ajoutées)

Corrdialement.

Oui c'est ca


Et pour faire correspondre les couples, je trie par ordre alphabétique les usagers et pas les encadrants( lors du code que j'ai copié sur le lien que je t'ai donné)

"s'il n'y a qu'1 usager et pas d'encadrant, rien ne bouge (et rien en M et N)"

En fait si : en M il y aura le nom de l'usager, et en N rien ! par contre on insérera pas de ligne car j'ai un seul usager

Merci d'avance

Rechercher des sujets similaires à "nettoyage macro"