Macro qui duplique des lignes (déjà prête, à améliorer)
Bonjour,
Je vous laisse le fichier test ci-joint qui vous illustrera mieux ma demande.
Dans une feuille Excel "Base", j'ai une liste de métiers (médecin, consultant, directeur...), avec le nombre de personnes demandé par jour travaillé (colonnes avec dates sur l'année 2020). Ces métiers sont dispatchés par projet.
Dans l'objectif d'optimiser une saisie sur un logiciel, j'ai une macro qui me réalise une duplication de lignes de métiers sur une autre feuille « Duplication », en fonction du maximum de personnes à affecter dans l'année. Exemple, dans une seule ligne de la feuille "Base", j'ai :
- Colonne Projet = France,
- Colonne Métier = Médecin,
- Colonne Calendrier 04/01/2020 : J'ai "2" qui travaillent le 04/01/2020,
- Colonne Calendrier 11/01/2020 : J'ai "4" qui travaillent le 11/01/2020,
La Macro est déjà inclus dans le fichier. Là, il s'agit uniquement d'un fichier simplifié, mais mon vrai fichier contient plus de lignes que ça (allant jusqu'à 500 lignes des fois). Quand je lance la Macro, elle m'affiche le process à l'écran, et elle prend plus de temps quand il s'agit d'un gros document.
Peut-on l'optimiser s'il vous plaît ?
Je vous remercie.
Bonne journée.
Aydounette.
- Messages
- 1'025
- Excel
- 2016 FR // 365
- Inscrit
- 19/04/2019
- Emploi
- Étudiant en 5e année d'école d'Ingénieur
Salut Aydounette,
Voici un lien pour t'aider à rendre l'exécution de ta macro plus rapide !
Dans la partie Mettre à Off tout ce qui peut être mis à Off! je te conseil simplement de mettre dans ton cas :
Application.ScreenUpdating = False
Au début de ton code.
Ensuite, qui n'est pas précisé dans le lien, je te déconseille fortement d'utiliser des copié/collé en VBA. Cela ralentit énormément l'exécution de ta macro ! Alors oui c'est pratique car cela copie également la mise en forme, mais je te conseille plutôt de faire comme cela pour copier tes données :
Dim CopyRange As Range
Dim PasteRange As Range
Set CopyRange = ThisWorkbook.Worksheets("TA_FEUILLE").Range("TA_PLAGE") 'La plage de données que tu veux copier
Set PasteRange = ThisWorkbook.Worksheets("TA_FEUILLE").Range("TA_PLAGE") 'La plage de cellules où tu veux coller
PasteRange.Value2 = CopyRange.Value2 'Copie /colle les données
Set CopyRange = Nothing 'Vide la variable - À mettre à la fin de ta macro
Set PasteRange = Nothing 'Vide la variable - À mettre à la fin de ta macro
Et ensuite tu réalises ta mise en forme en VBA. Cela sera bien plus efficace et propre.
Bonne chance !
Bonne journée,
Baboutz
Bonjour Baboutz,
Je vous remercie pour avoir pris le temps de consulter ma Macro.
Je vous avoue que je ne suis pas du tout experte en VBA. Le code que j'ai utilisé, je l'ai trouvé, un peu compris et l'ai modifié pour qu'il s'adapte à mon fichier.
Sinon (honte à moi
J'ai mis ça comme ça mais ça n'a pas marché
Sub CopieEnDuplication26()
Dim CopyRange As Range
Dim PasteRange As Range
Set CopyRange = ThisWorkbook.Worksheets("Base").Range([B6], [E6]) 'La plage de données que tu veux copier
Set PasteRange = ThisWorkbook.Worksheets("Duplication").Range([A6], [D6]) 'La plage de cellules où tu veux coller
PasteRange.Value2 = CopyRange.Value2 'Copie /colle les données
Set CopyRange = Nothing 'Vide la variable - À mettre à la fin de ta macro
Set PasteRange = Nothing 'Vide la variable - À mettre à la fin de ta macro
End Sub
Au secours !
Merci
- Messages
- 1'025
- Excel
- 2016 FR // 365
- Inscrit
- 19/04/2019
- Emploi
- Étudiant en 5e année d'école d'Ingénieur
Re,
C'est pour ça qu'il vaut mieux essayer de coder soit même sa macro en cherchant les fonctions sur internet que de copier/coller un pavé de code qu'on bidouille en priant pour qu'il marche
Voici ton fichier en pièce jointe, dis moi si ça te convient.
Avec un code beaucoup beaucoup plus simple, on obtient un meilleur résultat !
Bonne journée,
Baboutz
Rebonjour,
Encore merci pour votre retour.
C'est pour ça qu'il vaut mieux essayer de coder soit même sa macro en cherchant les fonctions sur internet que de copier/coller un pavé de code qu'on bidouille en priant pour qu'il marche
Vous avez tout à fait raison. Il faut juste réserver du temps pour ça et un peu de volonté. Malheureusement, le besoin est toujours dans l'urgence au boulot
Voici ton fichier en pièce jointe, dis moi si ça te convient.
Je suis vraiment désolée de vous importuner encore une fois, mais au fait le résultat à l'écran de ma Macro initiale me convenait bien, je m'explique :
- Lorsque dans la feuille "Base" j'ai par exemple le nombre "7" dans la colonne "MAX", ligne 8, je veux que la Macro me mette effectivement 7 lignes de Médecins dans la feuille "Duplication".
- Je ne souhaite pas non plus avoir une ligne Projet qui délimite mes lignes métiers dans ma feuille "Duplication". Je souhaiterai que cette ligne projet se répète sur toutes les lignes des métiers concernés (voir image ci-dessous), sinon, ce n'est pas grave : soit enlever la colonne Projet dans la feuille "Duplication", soit la laisser vide s'il n'y pas de solution.
Ecran Idéal :
Ma Macro au fait me donnait le résultat souhaité (sauf pour la colonne projet), c'est juste que le temps que ça prenait pour mouliner était lent, j'avais également l'affichage du processus sur mon écran Excel, et je souhaitais voir s'il était possible de l'optimiser.
Je tiens à m'excuser de ne pas avoir été peut être plus explicite sur ce point. Est-ce possible de prendre cela en compte svp ?
Avec un code beaucoup beaucoup plus simple, on obtient un meilleur résultat !
J'en suis tout à fait certaine
Merci infiniment pour votre aide.
Bonne journée.
- Messages
- 1'025
- Excel
- 2016 FR // 365
- Inscrit
- 19/04/2019
- Emploi
- Étudiant en 5e année d'école d'Ingénieur
Re Aydounette,
En effet c'est de ma faute ! Je suis allé trop vite.
Je t'ai fait une macro propre qui normalement répond à ta demande. J'avoue que celle-ci est un peu plus compliqué que ce qui aurait pu être fait mais elle est propre et rapide
Cette proposition te convient mieux ?
J'ai commenté mon code pour t'aider à comprendre, mais je pense qu'il faudra que tu te renseignes un peu à côté pour bien le comprendre.
Bonne journée,
Baboutz
Baboutz,
Je vous remercie encore une fois pour votre aide.
La Macro marche parfaitement bien et correspond exactement à ce que je souhaitais avoir comme résultat.
Pas de soucis, je ferai en sorte de me renseigner de mon côté afin de mieux comprendre
Merci encore une fois pour votre temps et votre patience, c'est vraiment gentil.
Bonne année et meilleurs voeux !
Aydounette!
- Messages
- 1'025
- Excel
- 2016 FR // 365
- Inscrit
- 19/04/2019
- Emploi
- Étudiant en 5e année d'école d'Ingénieur
Avec plaisir Aydounette !
En espérant que cela se greffe bien avec votre précédente demande.
Bonne fête et mes meilleurs vœux également !
Bonne journée,
Baboutz