Feuille modèle

Résolu
Bonjour à toute la communauté.

J'ai ma crise Excel en ce moment, et j'ai besoin d'un coup de main de votre part pour ce que je ne parviens pas à faire.

Je ne sais trop comment m'y prendre, mais j'aimerai créer un fichier client dont toutes les feuilles (existantes et nouvellement créées) aient pour modèle une feuille nommée "Masque".

Si un changement est effectué sur la feuille "Masque" (ajout colonne, ligne, mise en gras par exemple), ce changement se répercuterait sur toutes les feuilles clients basées sur ce modèle "Masque".

Pour plus de facilité, voici un fichier exemple :

https://www.cjoint.com/?CIojuotkcal

Merci d'avance pour vos idées constructives !

16 réponses

Résumé de la discussion

L'objectif est que toutes les feuilles d'un fichier client Excel s'inspirent d'un modèle nommé Masque et se mettent à jour lorsque Masque évolue. Des solutions passent par des formules comme DECALER et des macros qui copient les formats et largeurs du Masque sur chaque feuille. Les échanges montrent que les listes déroulantes et certaines limites du copier-coller exigent des ajustements, notamment sur la gestion des données et l'activation des feuilles. D'autres interventions proposent d'étendre le mécanisme à la copie du texte des colonnes A et de la ligne 24 vers toutes les feuilles concernées, en ajustant les événements.

Bobot (l’IA à votre service)
  1. Bonjour,

    Avant tout, tu peux te demander si tu utilises la bonne manière pour obtenir le résultat recherché. Il vaudrait peut-être mieux que tu disposes d'un masque pour l'affichage des données et d'une base de données.
    https://www.cjoint.com/?CIoj1G7MmvN
    A+
    0
    1. Merci Gyrus pour ton travail.

      En réalité, c'est assez éloigné de l'objectif.
      Je ne cherche pas à récupérer des données dans plusieurs feuilles, mais à appliquer une mise en forme particulière à ma feuille Masque, avec répercussion immédiate sur toutes les feuilles basées sur Modèle.

      Exemple dans une macro qui ressemblerait à ça :

      Feuille "Chris ANTHEM" : masque="Modèle"
      Feuille "Marc EURITHE" : masque="Modèle"
      Feuille "Anne HEMMONNE" : masque="Modèle"
      Si : Insertion Ligne entre L5 et L6 sur Modèle
      Alors : Insertion Ligne entre L5 et L6 sur toutes les feuilles ayant pour masque "Modèle".
      Si : Caractère gras en E18 sur Modèle
      Alors : Caractère gras en E18 sur toutes les feuilles ayant pour masque "Modèle".

      Est-ce faisable ?
      Merci d'avance !
      0
      1. Contributeur
        Bonjour,

        à tester :
        Sub formaterFeuille()
        Dim sh As Worksheet
        For Each sh In Worksheets
        If InStr("Accueil,Masque", sh.Name) = 0 Then
        Worksheets("Masque").Cells.Copy
        sh.[A1].PasteSpecial Paste:=xlPasteFormats
        sh.[A1].PasteSpecial Paste:=xlPasteColumnWidths
        End If
        Next sh
        End Sub
        eric
        0
        1. Bonjour Eric !

          Les meilleurs s'y mettent ...

          Malheureusement aucun effet sur mes feuilles.

          J'essaie de comprendre le code (que j'ai collé dans ThisWorkBook) :

          Sub formaterFeuille() 'nom de la macro
          Dim sh As Worksheet 'sélection des feuilles
          For Each sh In Worksheets 'pour toutes les feuilles contenant "sh"
          If InStr("Masque", sh.Name) = 0 Then 'si on fait des modifs dans Masque
          Worksheets("Masque").Cells.Copy 'on copie Masque dans le Presse-papiers
          sh.[A1].PasteSpecial Paste:=xlPasteFormats 'on colle les formats dans les feuilles contenant "sh"
          sh.[A1].PasteSpecial Paste:=xlPasteColumnWidths 'on colle la même largeur de colonne dans les feuilles contenant "sh"
          End If
          Next sh
          End Sub

          C'est plutôt bien parti pourtant. où ça cloche ? Merci d'avance !
          0
          1. En fait je viens de voir que ça fonctionne partiellement :
            Mais je dois faire Alt+F8 et exécuter la macro qui est dans ThisWorkBook.

            Comment automatiser la tâche dès qu'il y a une modif dans Masque ?

            Merci !
            0
            1. Contributeur
              En fait je viens de voir que ça fonctionne partiellement :
              Mais je dois faire Alt+F8 et exécuter la macro qui est dans ThisWorkBook.
              Comment automatiser la tâche dès qu'il y a une modif dans Masque ?

              Pourquoi la mettre dans Thisworkbook ? Pas d'intérêt.
              Sinon un changement de format n'est pas un évènement, il faudra toujours la lancer. Tu peux toujours mettre un bouton sur la feuille.

              eric
              0
              1. Bonjour Eric et les autres

                J'ai passé pas mal de temps sur ta macro, Eric.
                C'est tout à fait ce que je voulais et me fera gagner beaucoup de temps.

                Par contre j'ai un petit bug noté "Erreur d'exécution '1004' : "La méthode Activate de la classe Range a échoué".

                Il semble qu'il y ait une incompatibilité entre 2 macros du classeur : la tienne et :

                Option Explicit
                Private Sub Workbook_Open() ' ouverture du fichier sur le 1er onglet
                Sheets(1).Activate
                [A1].Activate
                End Sub
                Private Sub Workbook_SheetActivate(ByVal sh As Object) 'ouverture de chaque feuille en A1
                sh.[A1].Activate
                End Sub

                Le bug concerne l'ouverture de chaque feuille en A1.

                Puis-je vous demander s'il y a une solution ?

                Merci d'avance et bon dimanche !
                0
                1. Contributeur
                  Bonjour,

                  sans fichier impossible de tester...
                  Sinon ce n'est pas plutôt sh.[A1].select que tu veux ?
                  eric
                  0
              2. Voici le fichier exemple :

                https://www.cjoint.com/?CIpjTVq2Y1X

                Une pression sur le bouton Formater selon Masque fait apparaître le bug.

                une question d'ordre d'exécution des macros ?

                Merci !!!
                0
                1. Contributeur
                  Bizarrement le pastespecial provoque l'évènement sheetActivate mais sans activer la feuille.
                  Remplace par :
                  Private Sub Workbook_SheetActivate(ByVal sh As Object) 'ouverture de chaque feuille en A1
                  If ActiveSheet.Name = sh.Name Then sh.[A1].Select
                  End Sub
                  Et tant qu'on y est allège un peu ma macro, on ne va copier les formats que sur la plage utilisée :
                  Sub formaterFeuille()
                  Dim sh As Worksheet
                  For Each sh In Worksheets
                  If InStr("Accueil,Masque,Anne HEMMONNE", sh.Name) = 0 Then
                  With Worksheets("Masque")
                  .Range("A1", .Cells.SpecialCells(xlCellTypeLastCell)).Copy
                  End With
                  sh.[A1].PasteSpecial Paste:=xlPasteFormats
                  sh.[A1].PasteSpecial Paste:=xlPasteColumnWidths
                  End If
                  Next sh
                  Application.CutCopyMode = False
                  End Sub
                  eric
                  0
              3. En effet, adaptée à mon classeur, tes macros fonctionnent au poil !

                Pour comprendre :
                - "on ne va copier les formats que sur la plage utilisée" : qu'est-ce que ça signifie ?

                - "For Each sh In Worksheets" : qu'est-ce que désigne le "sh" ? Pourquoi on l'utilise ?

                Pardon pour ces questions mais j'aimerai vraiment piger un tout petit peu ... :)
                0
                1. Contributeur
                  - "on ne va copier les formats que sur la plage utilisée" : qu'est-ce que ça signifie ?
                  avant je faisais :
                  .cells.copy : toute la feuille
                  après:
                  .Range("A1", .Cells.SpecialCells(xlCellTypeLastCell)).Copy : que la zone utilisée

                  - "For Each sh In Worksheets" : qu'est-ce que désigne le "sh" ? Pourquoi on l'utilise ?
                  Worksheets est la collection de toutes les feuilles du classeur.
                  Littéralement :
                  pour toutes les feuilles du classeur
                  si le nom est différent de ...
                  feuille suivante

                  eric
                  0
              4. C'est très clair à présent.

                J'ai encore d'autres idées pour optimiser la fonction, mais je vais essayer seul.

                Un grand merci Eric pour ton travail désintéressé.
                Toute la communauté te doit beaucoup.
                0
                1. Contributeur
                  De rien, n'oublie pas de mettre en résolu le moment venu.
                  eric
                  0
              5. Bonjour à tous.

                Je reviens vers vous à propos de la macro d'Eriic qui fonctionne exactement comme je le souhaitais.

                J'ai une demande supplémentaire, complétant cette macro doit je rappelle le code :
                ----------------------------------------
                Sub FormaterSelonMasque()
                Dim sh As Worksheet
                For Each sh In Worksheets
                If InStr("2013,2012,Labos,Listes,Stats,Essais,Graphique,Masque", sh.Name) = 0 Then
                With Worksheets("Masque")
                .Range("A1", .Cells.SpecialCells(xlCellTypeLastCell)).Copy
                End With
                sh.[A1].PasteSpecial Paste:=xlPasteFormats
                sh.[A1].PasteSpecial Paste:=xlPasteColumnWidths
                End If
                Next sh
                Application.CutCopyMode = False
                End Sub
                ----------------------------------------

                J'aimerais ajouter :
                - copier contenu texte de la colonne A sur toutes les feuilles concernées et :
                - copier contenu texte de la ligne 24 sur toutes les feuilles concernées.

                J'ai bien trouvé la fonction .PasteSpecial xlPasteValues mais en essayant j'ai fait planter Excel ... champion !

                Merci d'avance pour votre aide qui m'est si précieuse !
                0
                1. Contributeur
                  Bonsoir,

                  si tu n'as pas de formules en colonne A et en ligne 24, ceci devrait suffire :
                  Sub FormaterSelonMasque()
                  Dim sh As Worksheet
                  For Each sh In Worksheets
                  If InStr("2013,2012,Labos,Listes,Stats,Essais,Graphique,Masque", sh.Name) = 0 Then
                  With Worksheets("Masque")
                  .Columns(1).Copy sh.Columns(1)
                  .Rows(24).Copy sh.Rows(24)
                  .Range("A1", .Cells.SpecialCells(xlCellTypeLastCell)).Copy
                  sh.[A1].PasteSpecial Paste:=xlPasteFormats
                  sh.[A1].PasteSpecial Paste:=xlPasteColumnWidths
                  End With
                  End If
                  Next sh
                  Application.CutCopyMode = False
                  End Sub
                  eric
                  0
                  1. Bonsoir Eriic

                    Sympa de t'y remettre !

                    En effet ça va comme prévu.
                    Par contre y a-t-il moyen de créer des zones à copier ?
                    Un peu comme .(A1:A24).Copy sh.(A1:A24)

                    Je complique encore une dernière fois un petit peu :
                    Il y a, sur certaines cellules de la feuille Masque, des listes déroulantes que je ne retrouve pas sur les autres feuilles.
                    Par contre, les formules se recopient bien.

                    Est-ce possible ?

                    Merci encore, c'est fort appréciable d'être aidé.
                    0
                    1. Bon, en fait , en tapant :
                      .Range("A1:A24").Copy sh.Range("A1:A24")
                      .Range("A36:A60").Copy sh.Range("A36:A60")
                      J'arrive à ne copier que certaines cellules (ça c'est fait ...)
                      Il ne reste que les listes déroulantes à récupérer ...
                      A plus si il te reste du courage pour moi !
                      0
                    2. Contributeur
                      Peut-être qu'avec un fichier de travail on pourra regarder...
                      eric
                      0
                  2. Bonjour Eriic

                    J'ai recréé les conditions de mon fichier original dans :
                    https://www.cjoint.com/?CIvjpUnvcov
                    J'ai noté les problèmes rencontrés en rouge.

                    Merci d'avance j'avance !
                    0
                    1. Contributeur
                      Bonjour,

                                  With Worksheets("Masque")
                      ...
                      sh.[E12:G12] = .[E12:G12]
                      End With
                      eric
                      0
                    2. J'ai essayé, j'ai toujours l'erreur 400, tu ne l'as pas ?
                      Appliqué à mon fichier originel, dans les cellules où il y a des listes déroulantes, la liste ne change pas selon celle du Masque, et les cellules concernées affichent #VALEUR.
                      Please help !
                      BJ
                      0
                    3. Contributeur
                      j'ai toujours l'erreur 400
                      Et si tu disais en quelle ligne ??
                      Non, mais j'ai une erreur 1004 due à tes cellules fusionnées A11:B11.
                      Fuir la fusion de cellule et utiliser 'centrer sur plusieurs colonnes' dans Format de cellule.

                      Appliqué à mon fichier originel, dans les cellules où il y a des listes déroulantes, la liste ne change pas selon celle du Masque, et les cellules concernées affichent #VALEUR.
                      Ca marche bien sur l'exemple.

                      eric
                      0
                    4. Suis vraiment désolé mais je ne me débarrasse pas de l'erreur 400.
                      C'est juste une boîte de dialogue à valider qui ne me montre pas la ligne en cause dans VB.
                      Je remets mon fichier exemple (créé en XLS sous Excel 2010).
                      J'y ai scindé A11 et B11.

                      https://www.cjoint.com/?CIvlDgVU1Wr

                      Je sais que c'est lourd et je m'en excuse, mais j'y tiens vraiment, mes listes déroulantes changent souvent.
                      Un grand merci d'avance Eriic.
                      0
                    5. Contributeur
                      Si tu le fais en pas à pas avec F8 tu plantes toujours sur .Range("A1:A24").Copy sh.Range("A1:A24").
                      Il faut défusionner sur toutes les feuilles.
                      Clic sur la 1ère feuille, Shift+clic sur la dernière pour faire une sélection multiple et défusionner.
                      Sélectionner une feuille pour enlever la sélection multiple.

                      eric
                      0
                  3. Contributeur
                    ok,

                    Déjà supprime les lignes et colonnes vides qui ne servent à rien dans ta feuille Listes et utilise des noms dynamique :
                    Préférence: =DECALER(Listes!$A$2;;;NBVAL(Listes!$A:$A)-1;)

                    Pareil pour les autres et tu n'as plus à t'en préoccuper. Elles s'adapteront automatiquement.

                    eric
                    0
                    1. Bonsoir Eric et les autres ...

                      J'ai pu appliquer avec succès tes conseils et la formule DECALER.
                      C'est vrai que ça m'a considérablement simplifié la life.

                      J'ai repris une à une toutes mes fiches clients et appliqué des listes déroulantes du type "=Fonctions" à toutes les fiches.

                      Les listes déroulantes ne se recopient pas avec la macro, mais ce n'est pas bien grave puisque les nouvelles fiches seront issues d'une copie du masque.

                      Un grand merci pour ta patience, sujet doublement résolu !

                      Bonne soirée
                      0