VBA Coller uniquement les formules
RésoluNai Messages postés 714 Date d'inscription Statut Membre Dernière intervention -
Bonjour à toutes et tous :)
J'utilise un fichier pour la gestion des vacances d'été (animation) qui répond de mieux en mieux à mes besoins.
Je suis contronté à un petit problème de lourdeur du fichier.
Dans les plannings (voir fichier joint) j'utilise une macro pour insérer des lignes par jour de fonctionnement pour ajouter des agents. Malheureusement cette macro copie et colle la ligne du dessus (mais cette copie concerne également les MFC).
Je me retrouve, petit à petit, avec des centaines de MFC à mesure que j'ajoute des agents.
Comment puis-je modifier la macro ci-dessous pour que la copie ne concerne que les valeurs ?
Sub InsertRow() Dim r As Long If MsgBox("Etes-vous certain de vouloir ajouter une ligne au dessus de la ligne sélectionnée ?" & Chr(10) & Chr(10) & "Cette action est irréversible !", vbYesNo + vbCritical + vbDefaultButton2, "Demande de confirmation") = vbYes Then ActiveSheet.Unprotect Application.ScreenUpdating = False r = Selection.Row With Rows(r) .Copy .Insert Shift:=xlDown End With Application.CutCopyMode = False Range("H" & r + 1).ClearContents Range("I" & r + 1).ClearContents Range("J" & r + 1).ClearContents Range("BF" & r + 1).ClearContents Range("I" & r + 1).Select ActiveSheet.Protect End If End Sub
Toutes les propositions sont les bienvenues ! :)
Merci à vous !
pj: https://www.cjoint.com/c/OAxkSMjmhiS
- VBA Coller uniquement les formules
- Toutes les formules mathématiques pdf - Télécharger - Études & Formations
- Historique copier coller - Guide
- Copier-coller - Accueil - Informatique
- Copier coller pdf - Guide
- Formules excel de base - Guide
5 réponses
Bonjour,
Essaie :
Sub InsertRow() Dim r As Long If MsgBox("Etes-vous certain de vouloir ajouter une ligne au dessus de la ligne sélectionnée ?" & Chr(10) & Chr(10) & "Cette action est irréversible !", vbYesNo + vbCritical + vbDefaultButton2, "Demande de confirmation") = vbYes Then ActiveSheet.Unprotect Application.ScreenUpdating = False r = Selection.Row Rows(r + 1).Insert Rows(r + 1).ClearFormats Rows(r).Copy Rows(r + 1).PasteSpecial xlValues Application.CutCopyMode = False Range("H" & r + 1).ClearContents Range("I" & r + 1).ClearContents Range("J" & r + 1).ClearContents Range("BF" & r + 1).ClearContents Range("I" & r + 1).Select ActiveSheet.Protect End If End Sub
Daniel
Oui, c'est le clearformats. Comme son nom l'indique, il efface tous les formats. Quand on insère une ligne, les formats sont reproduits y compris les MFC. Il faut donc les effacer SAUF les fusions de cellules. Ta macro ne permet pas de savoir où tu insères les lignes. Elle se base sur "Selection". Indique les formats à effacer.
Daniel
PS. J'ai toujours été partisan de fusiller ceux qui se servent de cellules fusionnées, surtout avec VBA ;-)))
Merci pour ta réponse, ça me rassure de savoir que j'ai pas totalement tapé à côté ^^
Je me suis en effet souvent arraché des cheveux avec le VBA et les cellules fusionnées, je comprends. Mais avant d'envisager le fusil, c'est la seule solution lisible pour mes collègues que j'ai trouvé. Peut-être y en a-t-il une sans cellule fusionnée ?
- Ta macro ne permet pas de savoir où tu insères les lignes
Dans la feuille PLS1 (PLanning Semaine 1), j'ai une semaine découpée en 5 jours découpés en 4 groupes (Direction, ados, primaires et maternelles).
Si je souhaite ajouter une ligne (pour ajouter un agent), je sélectionne la ligne où l'agent doit être ajouté (le bon jour et dans le bon groupe) et j'execute la macro.
- Il faut donc les effacer SAUF les fusions de cellules
Oui et non. La ligne ajoutée ne doit pas copier les MFC (la ligne est nécessairement comprise dans les MFC de base ($A$1:$A$82).
Bonjour,
Je ne suis pas sûr de bien comprendre ce que vous voulez faire, et surtout où : votre fichier est plutôt riche !
Avez-vous pensé à utiliser l'enregistreur de macro pour insérer votre ligne et copier juste les infos dont vous avez besoin ? Cela vous permettrait de voir quelles "commandes" reprendre.
Bonjour et merci pour la réponse :)
J'ai beaucoup fonctionné de cette manière et en m'appuyant sur l'aide apportée sur le forum.
Le problème ici c'est que copier a pour effet de copier également les MFC (et, avec l'usage, le fichier comporte de plus en plus de MFC en double).
Ma demande concerne l'onglet PLS1, en selectionnant la cellule I9 et en executant la macro, je souhaite ajouter une ligne sans copier les MFC.
Essaie :
Sub InsertRow() Dim r As Long If MsgBox("Etes-vous certain de vouloir ajouter une ligne au dessus de la ligne sélectionnée ?" & Chr(10) & Chr(10) & "Cette action est irréversible !", vbYesNo + vbCritical + vbDefaultButton2, "Demande de confirmation") = vbYes Then ActiveSheet.Unprotect Application.ScreenUpdating = False r = Selection.Row Rows(r + 1).Insert Rows(r + 1).FormatConditions.Delete Cells(r + 1, 7).Formula = Cells(r, 7).Formula Cells(r + 1, "BG").Formula = Cells(r, "BG").Formula Application.CutCopyMode = False Range("H" & r + 1).ClearContents Range("I" & r + 1).ClearContents Range("J" & r + 1).ClearContents Range("BF" & r + 1).ClearContents Range("I" & r + 1).Select ActiveSheet.Protect End If End Sub
Daniel
boonjour,
Il n'est pas toujours facile de deviner l'objectif d'une macro à partir de son code.
Que doit précisément réaliser cette macro?
Comment la déclenches-tu? Dans quelle feuille?
Si tu veux supprimer les MFC de la ligne insérée:
Rows(r).FormatConditions.Delete
Bonjour et merci pour la réponse :)
- Il n'est pas toujours facile de deviner l'objectif d'une macro à partir de son code.
J'ai manqué de précision. Je suis vigilant à ce propos d'habitude. Désolé :)
La macro doit insérer une ligne sous la cellule sélectionnée, sans défusionner les cellules et sans copier les MFC (qui existe déjà donc).
Je corrige mon message initial pour être plus précis.
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre questionJe ne peux pas éditer mon premier message, voici ci-dessous le détail :
le fichier : https://www.cjoint.com/c/OAymnzVyqES
Dans l'onglet PLS1, je souhaite que Jean ne soit pas seul avec le groupe des ados le 7 juillet : Je sélectionne Jean, je clique sur le "tableau Plus" (image) qui exécute la macro InsertRow.
En l'état, tout fonctionne. Une ligne supplémentaire est bien insérée, les valeurs sont supprimées mais pas les formules et je peux poursuivre mon planning.
Le problème c'est que lorsque j'exécute la macro, les MFC sont également copiées et alourdissent le fichier petit à petit.
L'onglet PLS1 comporte 31 MFC. Lorsque j'insère une ligne à l'aide de cette macro, la ligne insérée est forcément comprise dans les plages existante de MFC mais elles sont copiées quand même. Petit à petit, je me retrouve avec des centaines de MFC par onglet de PL.
Excusez mon message initial, je n'ai pas été précis :)
- Quand j'exécute la macro, puis que je déprotège la feuille, je ne vois pas de MFC supplémentaire. je ne vois toujours que 31 MFC pour la feuille PLS1.
Heu... moi aussi :-O
Je ne comprends pas... Je dois envisager l'intervention d'un tiers dans le fichier qui copie/colle/coupe. *je me soupçonne moi-même*
Je me sens bête :-( Peut-être ceci se produit dans un cas de figure que je n'ai pas reproduis en formulant ma demande :/
Je vous remercie pour le temps accordé. Je reviendrais si je trouve le cas concerné par la duplication des MFC.
Bonjour et merci pour cette réponse rapide :)
Malheureusement ça ne produit pas le résultat attendu.
En effet, les cellules fusionnées se défusionnent, les formules ne sont pas copiées et les MFC sont copiées :)
Je ne sais pas pourquoi (si ce n'est le ClearFormats?)
J'ai tenté :
Mais ça ne fonctionne pas :(