VBA Coller uniquement les formules

Résolu
Nai Messages postés 714 Date d'inscription   Statut Membre Dernière intervention   -  
Nai 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


A voir également:

5 réponses

danielc0 Messages postés 1866 Date d'inscription   Statut Membre Dernière intervention   232
 

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


0
Nai Messages postés 714 Date d'inscription   Statut Membre Dernière intervention   55
 

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é :

Rows(r + 1).PasteSpecial xlPasteFormulas

Mais ça ne fonctionne pas :(

0
danielc0 Messages postés 1866 Date d'inscription   Statut Membre Dernière intervention   232
 

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 ;-)))


0
Nai Messages postés 714 Date d'inscription   Statut Membre Dernière intervention   55
 

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).

0
TonyLucky
 

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.

0
Nai Messages postés 714 Date d'inscription   Statut Membre Dernière intervention   55
 

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.

0
danielc0 Messages postés 1866 Date d'inscription   Statut Membre Dernière intervention   232 > Nai Messages postés 714 Date d'inscription   Statut Membre Dernière intervention  
 

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

0
yg_be Messages postés 23541 Date d'inscription   Statut Contributeur Dernière intervention   Ambassadeur 1 584
 

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
0
Nai Messages postés 714 Date d'inscription   Statut Membre Dernière intervention   55
 

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.

0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Nai Messages postés 714 Date d'inscription   Statut Membre Dernière intervention   55
 

Je 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 :)


0
yg_be Messages postés 23541 Date d'inscription   Statut Contributeur Dernière intervention   1 584
 

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.

Quelle MFC supplémentaire vois-tu apparaître?  Cette MFC s'applique à quel ensemble d'adresses?

0
Nai Messages postés 714 Date d'inscription   Statut Membre Dernière intervention   55 > yg_be Messages postés 23541 Date d'inscription   Statut Contributeur Dernière intervention  
 

- 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.

0