VBA Coller uniquement les formules

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


Bien à vous,
Naï
ps: je surveille tous mes sujets non résolus, si solution vous avez, je la lirais à coup sûr :)

5 réponses

  1. danielc0 Messages postés 2210 Date d'inscription   Statut Membre Dernière intervention   293
     

    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
    1. Nai Messages postés 718 Date d'inscription   Statut Membre Dernière intervention   57
       

      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
  2. danielc0 Messages postés 2210 Date d'inscription   Statut Membre Dernière intervention   293
     

    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
    1. Nai Messages postés 718 Date d'inscription   Statut Membre Dernière intervention   57
       

      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
  3. 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
    1. Nai Messages postés 718 Date d'inscription   Statut Membre Dernière intervention   57
       

      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
      1. danielc0 Messages postés 2210 Date d'inscription   Statut Membre Dernière intervention   293 > Nai Messages postés 718 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
  4. yg_be Messages postés 23437 Date d'inscription   Statut Contributeur Dernière intervention   Ambassadeur 1 588
     

    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
    1. Nai Messages postés 718 Date d'inscription   Statut Membre Dernière intervention   57
       

      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
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. Nai Messages postés 718 Date d'inscription   Statut Membre Dernière intervention   57
     

    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
    1. yg_be Messages postés 23437 Date d'inscription   Statut Contributeur Dernière intervention   1 588
       

      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
      1. Nai Messages postés 718 Date d'inscription   Statut Membre Dernière intervention   57 > yg_be Messages postés 23437 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