Aide pour copier d'une feuille à une autre avec conditions

Bonjour à toutes et à tous,

Je ne suis pas un expert Excel et je remercie par avance tous ceux qui pourront m’apporter un soutien.

Lorsque j’en saurai un peu plus alors je pourrais à mon tour transmettre aux autres.

Mon problème et le suivant /
J’ai une feuille excel avec des datas qui débutent en A7 et qui vont jusqu’en AU 115.

Toutes les lignes ne sont pas renseignées, mais devraient l’être plus tard.

Ma première feuille qui porte le nom de 2020 contient des données que je vais devoir copier sur une autre feuille nommée 2021 une autre 2022 …

J’ai besoin d’une macro qui va intégrer d’abord de 2020 a7:au115 à 2021 puis de 2021 à 2022… tout ça automatiquement avec plusieurs critères :
Ma cellule 2020 g7 contient une date qui devra être strictement supérieur à la date contenue dans la cellule $L$3 de 2021 OU que la cellule 2020 k7 est aussi strictement > $L$3 pour copier la ligne dans 2021

Pour la feuille 2022 on fait la même chose mais avec les cellule 2021 vers 2022.

Jai commencé un VBA mais il ne fonctionne qu’à moité, il recopie bien mais sur les cellules à partir de a1 sur 2021.

Sub copie_2021()
Dim plage As Range, cel As Range, derlig, derlig1

'fige ecran
Application.ScreenUpdating = False
With Worksheets("2020")
'derniere cellule non vide colonne A
derlig = .Range("A7" & Rows.Count).End(xlUp).Row
'mise en memoire plage donnees
Set plage = .Range("g7" & derlig)
'boucle test cellule Gx > $L3
For Each cel In plage
If cel > "$l3" Then
'premiere cellule vide colonne A
'derlig1 = Worksheets("2021").Range("A" & Rows.Count).End(xlUp).Row + 1
'copy donnees
.Range("A7" & cel.Row & ":AU" & cel.Row).Copy Worksheets("2021").Range("A" & derlig1 & ":AU" & derlig1)
End If
Next cel
End With
Application.ScreenUpdating = True
End Sub

SI une petite main peut me venir en aide ce serait top.

Merci par avance

Portez vous bien

François :)

Boujour
Déjà cette ligne de code est incorrect :

.Range(« A7 » & cel.Row & « :AU » & cel.Row).Copy

Si tu mets A7 que vient faire le cel.row qui suit ?
C’est ou « A7 » ou « A » & cel.row mais certainement pas « A7 » & cel.Row
Cel.row est l’instruction qui détermine l’indice à associer à A si celui-ci est déjà associer à 7 le Cel.row est en trop

Maintenant je ne sait si cela va résoudre ta problématique n’ayant pas ton fichier pour tester

Essaies

Merci à toi pour ta réponse.

Je te joins le fichier pour que tu comprennes mieux ma demande.

Merci pour ton aide

FrançoisTest.xlsm (182,4 Ko)

Bonjour

J’ai adapté ton code
Tout d’abord les seules cellules à recopier sont les cellules des colonne A à K
Celles des colonnes L à AU sont automatiquement alimentées par des formules donc ne doivent pas être incluses dans la recopie
Pour déterminer la 1° ligne disponible dans l’onglet de destination tu utilises cette ligne :

derlig1 = Worksheets(« 2021 »).Range(« A » & Rows.Count).End(xlUp).Row + 1

qui serait parfaite si en colonne A à partir de la ligne 125 onglet par exemple 2021 il n’y avait pas de données
Cette ligne de code fonctionne dans une colonne qui n’a pas d’autre données que celles à recopier dans les lignes qui suivent sinon elle ne peut être utilisée
Dans ton fichier il faut démarrer la recopie à partir de la ligne 7 or quelques lignes à partir de la ligne 125 en colonne A sont occupée
Pour donc utiliser cet instruction il faudrait libérer la colonne A à partir de la ligne 7

Ne sachant pas si je pouvais le faire j’ai opté pour une variable derlig1 fixe à la valeur 7 initiale que je fais évoluer à chaque recopie par une ligne de code rajoutée :

derlig1 = derlig1 + 1

A toi de voir si l’on maintien cette solution ou si tu nettoies la colonne A pour reprendre la ligne de code mis en place au départ (se nettoyage doit être réalisé sur tout les onglets cible)

J’ai apporté une évolution dans ton traitement qui effectue l’ensemble des recopies de tous les onglets concernés avec cette macro unique que j’ai renommé en conséquence de « copie_2020 » à « copie »
Tous les onglets « 2020 » « 2021 » « 2022 » sont ainsi alimentés
Si tu rajoutes des onglets « 2023 » « 2024 » « 2025 » etc.… il faut adapter la ligne de code en début suivante :

listeonglets = « 2021/2022 »

et mettre :
listeonglets = « 2021/2022/2023/2024/2025 »

Je n’ai pas mis d’instruction pour vider chaque onglet cible si le traitement devait être rejoué
Maintenant il redémarrera à partir de la ligne 7 de chacun et donc remplacera les données existantes mais n’effacera pas celles qui seraient en trop si moins de ligne à recopier

A toi de me dire ce que tu souhaites à ce niveau

Ci-joint ton fichier adapté dans cet esprit

Fais des essais et dis moi

Test.xlsm (169,2 Ko)

Merci, tu as fait un super boulot.

En fait tu ré-écrit sur les cellules déjà existantes quand on lance à nouveau la macro ?

Mais ça me va.

Comment mettre un bouton « actualiser » dans le menu qui lance la macro ?

Comment aussi choisir en fait dans la recopie que les cellules a,b,c,d,e,h,i,j de façon à laisser les calculs se faire.

Merci

Amicalement

François

« En fait tu ré-écrit sur les cellules déjà existantes quand on lance à nouveau la macro ? »
Je remplis les cellules de l annee cible des donnees de l année source si la condition date est valide ni plus ni moins

« Comment mettre un bouton « actualiser » dans le menu qui lance la macro ? »

Menu devellopeur icône insérer

Désolé j ai envoyé avant d avoir terminé

Donc Menu devellopeur icône insérer
Choisir le premier bouton dans les propositions
Cliquer à l endroit où il doit se trouver
Relier le bouton à la macro
Puis saisir un nom
Ajuster sa mise en place
Cliquer sur n importe quelle cellule pour le rendre opérationnel

« Comment aussi choisir en fait dans la recopie que les cellules a,b,c,d,e,h,i,j de façon à laisser les calculs se faire. »

J avoue ne pas comprendre ta demande
Merci de préciser
Peut être à l appui d un exemple
Dans l attente

Merci bien

Ce que je souhaite recopier dans la feuille 2021 ce sont les valeurs de A, B,C,D,E, H,I et J à partir de la feuille 2020 et pas toutes les cellule de A à K.

J’essaye de décrypter ta macro pour la comprendre et voir comment la modifier et c’est pas simple pour moi…

En tout cas merci pour ton support

François

Je te transmets ton fichier modifié dans cet esprit
Je t’ai rajouté le bouton dans l’onglet 2020
La ligne qui recopie dans les onglets cible les données source c’est celle-ci :

Worksheets(ongletcible).Range(« A » & derlig1 & « :J » & derlig1).Value = Worksheets(ongletsource).Range(« A » & cel.Row & « :J » & cel.Row).Value

ces 2 parties sont concernées :

Range(« A » & derlig1 & « :J » & derlig1)
Range(« A » & cel.Row & « :J » & cel.Row)

des 2 côtés de l’égalité

toutes les cellules des colonnes A à J

Je me suis aperçu que je l’avait mal paramétré au lieu des colonnes A à K (les autres étant dotées de formules donc non concernées par la recopie et ce dans tous les onglets AAAA) j’avais mis des colonnes A à AK j’ai omis d’enlever le A de AK
Petite coquille

J’ai récupéré à nouveau ton fichier car toutes les formules dans le premier récupéré ont disparu et pour cause
Et oui malgré toutes ses années de programmation les erreurs me tiennent toujours compagnie

Si tu souhaites d’autres explications dans le code n’hésites pas je me ferai un plaisir
Tu peux supprimer à ta convenance les lignes vertes dont tu n’as besoin ces lignes sont au stade commentaire donc inactives

Ton fichier corrigé avec bouton et toutes les formules
A ta dispo

Test.xlsm (190,5 Ko)

Un grand merci à toi pour ton aide.

En fait j’avais corrigé par moi-même l’erreur de « AK ».
Pour copier les autres cellules en fait j’ai dupliqué ta formule de copie et j’ai changé les cellules concernées et ça semble marcher.
EN fait je vais être amené à faire un bouton par feuille car je souhaite que la macro n’agisse que sur le passage de 2020 à 2021 au autre bouton pour 2021 à 2022…

Je n’ai encore bien compris comment faire plusieurs macro et mettre un bouton sur chaques feuilles. Je vais voir ce que tu as fait pour comprendre.

Je te tiens au courant de mon avancement.

Bonne soirée et sans doute à demain.

Porte toi bien

Amicalement,

François

Bonjour
Je pense qu une seule macro peut répondre à ton attente
Juste à modifier cette ligne :

listeonglets = « 2021/2022 »

Mettre à la place :

listeonglets = « Activesheet.name/Activesheet.Name+1 »

Dans cette perspective il est indispensable de déclencher le traitement à partir de l onglet source et que l onglet cible soit existant
Les 2 onglets doivent être nommés sous cette forme :
Onglet source 2020
Onglet cible 2021
Que des chiffres et rien d’autre sinon Bug au niveau de la nouvelle ligne de code qui comporte une addition
Si on active le traitement à partir de boutons correctement mis en place avec des onglets bien nommés tout devrait bien se passer

Je te laisse faire
N hésites pas si souci

Hello,

La ligne listeonglets = « Activesheet.name/Activesheet.Name+1 »

Ne foctionne pas. Il y a une erreur de syntaxe.

Je mettrai un bouton sur les feuille qui feront appel à cette fonction comme ça je pourrais mettre à jour au fur et à mesure.

Peux tu aussi me dire comment on fait pour mettre plussieurs macro sur un même classeur ?

Un grand merci

François

Retape au clavier les guillemets en les accolant à la donnée :

« et »

ce ne sont pas ceux valide pour le VBA

Pour ajouter une macro à la suite de la mienne tu tapes cette ligne de code :

Sub lenomdelamacro ()
ou
Sub le_nom_de_la_macro

Puis entrée
une ligne de ce type se mettra automatiquement après :

End Sub
Puis entre ces 2 lignes tu mets ton code

Mettre un bouton sur feuille nommée strictement 2020 par exemple sans espace avant et aprés et surtout prévoir la feuille 2021 prête avant toute utilisation du bouton sinon Bug en perspective

A ta disposition si besoin

Bonjour

Sauf que

listeonglets = "Activesheet.name/Activesheet.Name+1"

affichera Activesheet.name/Activesheet.Name+1

Alors que

listeonglets = Activesheet.name & "/" & Activesheet.Name+1

affichera 2020/2021

Heureusement que tu veilles
Chapeau bas
Je m’incline
Effectivement grosses erreur de ma part
Je l’ai fais sur ma tablette sans tester et voilà la bourde
Cela m’apprendra à être plus prudent

Donc Mimimathy a parfaitement raison mets comme il ou elle le propose cela devrait le faire

listeonglets = Activesheet.name & « / » & Activesheet.Name+1

Très grand merci à toi Mimimathy

Attention toute fois au guillemets :

« / »

Je te transmet un nouveau fichier adapté
Fort de ma terrible mésaventure pour ne pas faire d’autre imper j’ai adapté et testé ce nouveau traitement
Pour m’apercevoir aussi que ton bouton doit impérativement être mis en place dans l’onglet cible à alimenter
Ce fichier ci-joint adapté dans cette esprit avec une 2° macro (j’ai laissé la 1°) appelé Copie2 et un bouton « Copie2 » dans l’onglet cible « 2021 »
En cliquant dessus tu remplis les colonne A à J de cette onglet à partir des données sources de l’onglet 2020 même colonnes et tenant compte des conditions de date
Tu pourras installer un bouton en onglet cible « 2022 » sur cette macro Copie2 pour réaliser la même opération avec l’onglet source « 2021 »

A ta disposition et encore mille excuses pour mes étourderies
Heureusement que j’ai un Ange gardien qui a des doigts magiques

Test.xlsm (191,2 Ko)

Je vous remercie tous pour votre contribution.

Après quelques soirée à comprendre votre génie, je viens de finaliser ma feuille excel et ça fonctionne.

Merci à vous deux et particulièrement à FFO pour m’avoir assisté.

Je vous souhaite de bien vous porter

A bientôt pour de nouvelles feuilles excel à venir.

Amitiés

François