Votre regard et avis/amélioration sur un code

Bonjour à tous,

Voilà déjà plusieurs heures que je passe sur un code me permettant de couper les enregistrements correspondants à un critère(date < 2009) de la feuille D vers la feuille SD, puis "remonter" les enregistrements restants de la feuille D en A6.

A force d'être la-dessus, j'ai des doutes et me demande malgré plusieurs tests si je n'ai pas adapté mes compteurs pour que çà fonctionne ou si vraiment le tout est exact.

Ensuite, ayant utilisé macro, nouvelle macro pour avoir les codes pour la recopie de formule et de liste, je me retrouve avec une instruction

ActiveWindow.SmallScroll Down

Une fois je l'ai enlevée une autre fois je l'ai laissée. Je pense qu'elle n'est pas utile, si vous pouviez me le confirmer.

Enfin, il faut sans doute dans mon code introduire plusieurs cas :

1) pas d'enregistrement du tout

2) uniquement des enregistrements < 2009

3) uniquement des enregistrements => 2009

Je serais grandement aidé si vous pouviez vous penchez sur mon code.

Vous en remerciant.

Cordialement

Joseph

Voici le fichier (code en module 3) https://www.excel-pratique.com/~files/doc2/Archivage4Deplacements97_2003.xls

Bonjour,

ça me semble correct.

D'une manière générale toutes les instructions de déplacement (dont les Scrolll) sont inutiles donc tu peux supprimer.

Pour le reste, difficile de travailler sur ce code. Yfaudrait optimiser un peu tous ces select...

Ce qui me gène le plus ce n'est pas tant le code mais la conception des feuilles de calcul :

Trois feuilles identiques avec les mêmes formules et les mêmes listes de validation est à mon avis une erreur de conception qui accroit grandement les risques d'erreur.

Au pire les feuilles identiques devraient se déduire de la feuille de saisie par Copier / Collage Spécial Valeur.

Mébon, peu importe la recette du moment que la soupe est bonne... Hein !

Pour info la manière dont je traiterais le problème. Remarquer la manière de traiter les formules complexes...

La démo.

A+

Bonjour,

Merci de ta réponse.

Le fichier envoyé n'étant qu'un exemple simplifié de ma base excel, seule en fait existe la feuille D (Deplacements). Dans l'exemple DT ne sert qu'à copier les données dans la feuille D sans avoir à les réécrire à chaque test, et SD (SwitchDeplacements) se trouve dans le dossier Deplacements du répertoire de mon application.

Venons en à ton code.....

Heureusement que j'étais assis, et encore, j'ai bien failli tomber de ma chaise.

Pour de l'optimisation, c'est de l'optimisation!!!!!

Pour un peu j'avais honte que tu aies vu la façon dont je programme, mais bon, je me dis que mon niveau ne peut que se réhausser.

Ca décoiffe. Par chance, je suis déjà pratiquement chauve!!!!

Plus sérieusement, j'ai analysé ton code (par bonheur tu as mis des explications ce qui m'a beaucoup aidé), et j'ai quelques questions.

1) Je vais devoir archiver pour trois feuilles différentes (dont la feuille D). Faut-il réinitialiser le compteur à chaque fois. (Je pense que oui)

2)Pour le NOActif que je vois dans la colonne A, je suppose que tu as défini le nom et associé la formule correspondante à la ligne concernée.

Je n'ai pas compris pourquoi, mais il n'y a pas de bug quand il n'y a aucun enregistrement < à 2009 ou carrément aucun enregistrement du tout. (J'aime bien comprendre).

Sinon, merci infiniment.

Je suis vraiment époustouflé.....

En attendant de te lire

Amicalement

Joseph

PS :

Mébon, peu importe la recette du moment que la soupe est bonne... Hein !

Cà tombe bien, la saison recommence.

Re PS : tu ne passes pas dans le Bas-rhin ces temps-ci ?

Si oui, je sens que mon application sera prête beaucoup plus vite que prévu!

Bonjour,

Tu confirmes un peu ce que j'imaginais...

Pour ce qui est d'archivages multiples je ne peux pas me prononcer... YFO voir !

Pour le NOActif, tu supposes bien...

Une fois que tu as résolu une formule complexe kivaBien sur la première ligne et qui s'incrémente correctement sur les lignes suivantes, yapuka "encapsuler" la formule de ta première cellule dans un nom défini et le tour est joué.

C'est quand même moins barbare que ces formules à rallonge qui vous tiennent 4 lignes dans la barre de formule... De plus au niveau VBA c'est nettement plus cool.

Attention cependant : Au moment de la création de cette formule nommée, la CelluleActive doit être celle dont tu as récupéré la fameuse formule (kivaBien)

Pourquoi il n'y a pas de bug ? Oh en cherchant bien on arriverait surement à planter le machin car j'ai fait au plus simple, c'est à dire que j'ai repris ton code !

Avec :

LastRow = Sheets("D").Range("A6").End(xlDown).Row

LastRow est toujours 50 qu'il y ait ou pas d'enregistrement !

Probablement que tu devras revoir cette ligne si tu adoptes ce code...

Cette autre ligne est certainement meilleure (on ne parcourt que les enregistrements qui existent réellement) :

LastRow = Sheets("D").Range("C65536").End(xlUp).Row

Le code étant ce qu'il est, dans un premier temps la boucle parcourt des cellules vides :

La fonction Year pour ces cellules vides renvoie 1899. VBA en déduit qu'il faut copier toutes les cellules vides et insère des lignes blanches dans la feuille SD jusqu'a ce qu'il rencontre de vraies dates avec de vraies données à copier et là ilinsère des lignes pleines et les lignes vides sont repoussées vers le bas...

Ok ?

Bon, sinon pour le bas-rhin j'ai rien contre... Mais ça va te revenir nettement plus cher

A+

Bonsoir,

Désolé pour la réponse tardive, mais j'étais de service toute la journée aujourd'hui. Et comme la prochaine commence à 3h30......

LastRow = Sheets("D").Range("A6").End(xlDown).Row

LastRow est toujours 50 qu'il y ait ou pas d'enregistrement !

Probablement que tu devras revoir cette ligne si tu adoptes ce code... Cette autre ligne est certainement meilleure (on ne parcourt que les enregistrements qui existent réellement) :

Code:

LastRow = Sheets("D").Range("C65536").End(xlUp).Row

Pourquoi Range C ?

Je suis sous Excel 2007. Range c'est combien maintenant ? 1 million sans dire de bêtises? Ca fait pas énorme de parcourir de 1 million jusqu'à A6 ?

Maintenant, pour l'application réelle, la feuille D va comporter environ 3000 lignes sur 4 ans. (Tous les ans j'archive l'année N-4). Et comme il faut bien qu'elle soit prête avec formules et tout pour les utilisateurs, je n'ai pas d'autre choix à ma connaissance que de la préparer. Donc dans ce cas, LastRow sera toujours à 3000.

Le code étant ce qu'il est, dans un premier temps la boucle parcourt des cellules vides :

La fonction Year pour ces cellules vides renvoie 1899. VBA en déduit qu'il faut copier toutes les cellules vides et insère des lignes blanches dans la feuille SD jusqu'a ce qu'il rencontre de vraies dates avec de vraies données à copier et là ilinsère des lignes pleines et les lignes vides sont repoussées vers le bas...

Ca me rappelle une question. Comment fait on quand en référence à une cellule dont le format est date on souhaite avoir vide et non pas 01/01/1900 quand on dit :

If (valeurcellule= " ";" ";valeurcellule)

Ok ?

Oui, je pense avoir a peu près compris le fonctionnement. En tout cas, j'y travaille.

Bon, sinon pour le bas-rhin j'ai rien contre... Mais ça va te revenir nettement plus cher

C'est pas que le coeur n'y est pas, mais comme je fais dans le 100% bénévole, ça va être plutôt difficile. Et comme là où je travaille, le PDG, comment dire, eh ben c'est pas moi ! je crois que je vais devoir me contenter de ton aide via le forum.

Encore une petite question si ça va : y a t-il moyen par VBA de vider le presse-papier.

En effet, quand on fait des copier/coller, à un moment ou un autre une fenêtre s'ouvre en disant le presse-papier contient un grand nombre de, et patati, et patata.....

En tout cas, un grand merci pour ton aide ainsi que pour cet échange sympathique!

Amicalement

Joseph

Bonsoir,

Pourquoi range C plutot que A ? car la colonne A contient une formule (au moins dans ma démo...). C'est pourquoi End(xlUp) renvoie toujours 50 tandis que la colonne C renvoie des enregistrements effectifs...

Ne t'inquiète pas 65536 ou 3000 YAPA de différence. Ce n'est pas une boucle mais probablement une fonction interne : VBA est capable de trouver directement la ligne concernée. On utilise donc directement cette notation comme une routine standart.

01/01/1900 c'est 1 donc si tu veux tester la date de A1 tu écriras :

=SI(A1>1;A1;"")

Le presse-papier n'est pas un objet Excel mais Windows. Au fil des versions successives d'Excel, il est devenu de plus en plus difficile d'y accéder.

Je fais dans le 100% bénévole

T'inquiète pas : Moi aussi et comme mon asso est déjà bien assez lourde à gérer, je ne suis même pas certain d'avoir réellement beaucoup de temps à consacrer à d'autres projets.

Mais on me trouve encore un peu en ligne ici ou là...

Au plaisir !

Merci !

Rechercher des sujets similaires à "regard avis amelioration code"