Affecter automatiquement une maccro

Résolu
bonjour,
j'ai une maccro qui permet créer une nouvelle feuille automatiquement lorsque je complete la cellule B1 :
------------------------------------------------------------------------------------
Sub Nouveau_Mois()

Application.ScreenUpdating = False

'confirmer sélection feuille / copier

Sheets("Base de données").Select
Cells.Select
Selection.Copy

'créer une nouvelle feuille / coller le type mois base

Sheets.Add after:=ActiveSheet
Cells.Select
Selection.PasteSpecial Paste:=xlPasteAll, Operation:=xlNone, SkipBlanks:= _
False, Transpose:=False
Application.CutCopyMode = False

'nommer la feuille

ActiveSheet.Name = Range("B1").Value

'ajouter dans le sommaire

Range("B1").Copy Destination:=Sheets("Sommaire").Range("B1").End(xlDown).Offset(1, 0)

'effacer le'entrée dans mois base de données

Sheets("Base de données").Activate

'retour au sommaire
Sheets("Sommaire").Select

Application.ScreenUpdating = True

End Sub
--------------------------------------

J'aurais aimé que quand cette maccro est executée, et donc qu'une nouvelle feuille est crée, elle soit codée par ca automatiquement (de la meme maniere que si j'avais fait onglet > visualiser le code > coller) :
-------------------------------
Private Sub Worksheet_BeforeDoubleClick(ByVal Target _
As Range, Cancel As Boolean)
If Not Intersect(Target, Range("a1")) Is Nothing Then
Call Reset_C
End If
If Not Intersect(Target, Range("b1")) Is Nothing Then
Call Reset_AF
End If
End Sub
----------------------------------

Merci à vous d'avance, LeoTaba.

24 réponses

Résumé de la discussion

La discussion porte sur l'automatisation d'une nouvelle feuille Excel créée par une macro VBA lorsque l'utilisateur saisit une valeur dans une cellule et sur l'ajout automatique d'un comportement dans cette feuille. Des propositions suggèrent d'utiliser un classeur modèle ou de copier la feuille afin que le code ainsi que les éléments associés soient répliqués sans réécriture manuelle. D'autres échanges évoquent l'insertion dynamique du code VBA dans le module de chaque nouvelle feuille, parfois via des composants VBProject et des méthodes d'insertion de lignes. Une nuance importante concerne les risques d'exécution involontaire du code lors de la création de feuilles et les contraintes liées à la sécurité des projets VB, qui limitent l'accès au modèle.

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

    Les re-up et ce genre de post n'incite vraiment pas à te répondre.
    Il faut te rappeler que nous sommes tous bénévoles!

    https://forums.commentcamarche.net/forum/affich-34200040-creer-un-nouveau-fichier

    Je vais quand même te donner un code qu'il te faudra adapter:

    'creer macro "retour Feuille1" dans la nouvelle feuille
    Sub creer_macro()
    Dim Code$, NextLine&
    Sheets.Add.Move After:=Sheets(Sheets.Count) 'ajoute une feuille en dernier
    On Error Resume Next
    ' Comment ajouter le code.
        Code = "Private Sub Worksheet_SelectionChange(ByVal Target As Range)" & vbCrLf
        Code = Code & "If Not Application.Intersect(Target, Range(""H1"")) Is Nothing Then" & vbCrLf
        Code = Code & "Feuil1.Activate" & vbCrLf
        Code = Code & "End If" & vbCrLf
        Code = Code & "End Sub"
    '   Ecriture du code dans le module de la feuille (fs)
    With ActiveWorkbook.VBProject.VBComponents(Sheets(Sheets.Count).CodeName).CodeModule
           NextLine = .CountOfLines + 1
          .InsertLines NextLine, Code
    End With
    ActiveSheet.Range("H1").Value = "Retour" ' on saisi Retour dans la nouvelle feuille
    End Sub
    
    1. Ouais j'sais bien mais si j'attends sans re-up le message sera moins visible et donc y a moins de chance qu'on me réponde. Bon j'essaie avec ton code, merci de ton aide je te tiens au courant cs_Le Pivert !
      1. Ok j'suis bien trop nul pour incrémenter ton code dans le mien je désespère
        1. Contributeur
          Quand je vois ce post,

          https://forums.commentcamarche.net/forum/affich-34368214-copier-des-formes

          il faut suivre les conseils de Vaucluse que je salue. Voici un modèle de classeur qui t'évite de passer par la création d'une macro. quand tu copies ta feuille la macro est copiée aussi, ainsi que tout ce qui est présent sur ta feuille Modèle a adapter:

          http://www.cjoint.com/c/GBripdXL1FQ
          1. Merci Le Pivert c'est super sympa mais bon tu vas trouver desesperant, j'ai pas le niveau pour l'adapter a mon fichier. Pourtant je vois bien que c'est hyper claire et tout mais sans qqn a coté de moi pour me guider ... c'est comme si je te disais de faire une chasse aux trésors près de ravins dans une foret hantée : c'est possible d'y arriver mais on angoisse devant la difficulté.
            En tout cas, résolut (car j'ai essayé ton fichier et c'est clairement ce que je voulais).
        2. Bon prenons le probleme autrement. Ce code la me semble tout a fait correspondre a ce que je veux :

          Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)

          If Not Application.Intersect(Target, Range("A1")) Is Nothing Then

          'macro à mettre (Reset_C pour mois)

          End If

          End Sub

          Ce code permet d'effectuer une maccro que j'ai créée (Reset_C) lorsqu'on clique sur la cellule A1.

          Le problème c'est que je ne sais pas OU le rajouter dans le code qui gère la création d'une nouvelle feuille, j'pense pas que quand on s'y connaisse ce soit dur a intégrer alors si quelqu'un pouvait me le faire ca m'aiderait vraiment, c'est mon dernier soucis après 6semaines (entieres de 35h) a charbonner ce classeur excel.

          Sub Nouveau_Mois()

          Application.ScreenUpdating = False

          'confirmer sélection feuille / copier

          Sheets("Base de données").Select
          Cells.Select
          Selection.Copy

          'créer une nouvelle feuille / coller le type mois base

          Sheets.Add After:=ActiveSheet
          Cells.Select
          Selection.PasteSpecial Paste:=xlPasteAll, Operation:=xlNone, SkipBlanks:= _
          False, Transpose:=False
          Application.CutCopyMode = False

          'nommer la feuille

          ActiveSheet.Name = Range("B1").Value

          'ajouter dans le sommaire

          Range("B1").Copy Destination:=Sheets("Sommaire").Range("B1").End(xlDown).Offset(1, 0)

          'effacer le'entrée dans mois base


          Sheets("Base de données").Activate
          Range("B1").ClearContents
          Range("C5:an5").ClearContents
          Range("C7:an7").ClearContents
          Range("C9:an9").ClearContents
          Range("C11:an11").ClearContents
          Range("C13:an13").ClearContents
          Range("C15:an15").ClearContents
          Range("C17:an17").ClearContents
          Range("C19:an19").ClearContents
          Range("C21:an21").ClearContents
          Range("C23:an23").ClearContents
          Range("C25:an25").ClearContents
          Range("C27:an27").ClearContents
          Range("C29:an29").ClearContents
          Range("C31:an31").ClearContents
          Range("C33:an33").ClearContents
          Range("C35:an35").ClearContents
          Range("C37:an37").ClearContents
          Range("C39:an39").ClearContents
          Range("C41:an41").ClearContents
          Range("C43:an43").ClearContents
          Range("C45:an45").ClearContents
          Range("C47:an47").ClearContents
          Range("C49:an49").ClearContents
          Range("C51:An51").ClearContents
          Range("C53:An53").ClearContents
          Range("C55:An55").ClearContents
          Range("C57:An57").ClearContents
          Range("C59:An59").ClearContents
          Range("C61:An61").ClearContents
          Range("C63:An63").ClearContents
          Range("C65:An65").ClearContents
          Range("C67:An67").ClearContents
          Range("C69:an69").ClearContents
          Range("C71:an71").ClearContents
          Range("C73:an73").ClearContents
          Range("C75:an75").ClearContents
          Range("C77:An77").ClearContents
          Range("C79:An79").ClearContents
          Range("C81:An81").ClearContents
          Range("C83:An83").ClearContents
          Range("C85:An87").ClearContents
          Range("C89:An91").ClearContents
          Range("C93:An94").ClearContents
          Range("C96:an99").ClearContents
          Range("C101:an101").ClearContents
          Range("C103:an103").ClearContents
          Range("C105:An105").ClearContents
          Range("C107:An107").ClearContents
          Range("C109:An110").ClearContents
          Range("C112:An114").ClearContents
          Range("C115:G118").ClearContents
          Range("j115:n118").ClearContents
          Range("q115:u118").ClearContents
          Range("x115:ab118").ClearContents
          Range("ae115:ai118").ClearContents
          Range("al115:an118").ClearContents
          Range("C119:AN139").ClearContents
          Range("C141:An143").ClearContents
          Range("C119:An125").ClearContents
          Range("C145:An148").ClearContents
          Range("C150:An166").ClearContents
          Range("C174:AN176").ClearContents

          'retour au sommaire
          Sheets("Sommaire").Select

          Application.ScreenUpdating = True

          End Sub

          En gros ce code permet de créer une nouvelle feuille X basée sur une autre feuille Y (ca fait un copié-collé), effacer le contenu des cellules de l'ancienne feuille Y, et ajouter le nom de cette feuille X au sommaire. Mais dans la nouvelle feuille X créée, il me FAUT la maccro permettant de Reset_C quand on clique sur A1 (ou double clique je sais plus).
          Il ne faut pas avoir a rajouter le code a chaque fois dans la nouvelle feuille X, il faudrait que ca se fasse AUTOMATIQUEMENT.

          Ce code m'a été donné par Vaucluse, un membre qui m'a permi de garder mes cheveux 10ans de plus ;)

          Merci a celui qui pourra m'aider,
          cordialement, je-ne-peux-pas-signer-car-c'est-bloqué-par-le-filtre-anti-language-sms
          1. Contributeur
            Tu n'as pas besoin de recréer un code dans les feuilles ajoutées. Le code est solidaire de la feuille ainsi que toutes les données lors de la copie. Je te l'ai déjà dit!

            Voici un autre exemple plus compréhensible en prenant ton exemple:

            http://www.cjoint.com/c/GBvpqBVysnQ
            1. Bah je suis désolé mais j'ai beau lire de long en large les codes, je comprends pas comment tu as fait pour que le code
              Option Explicit
              Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
              If Not Intersect(Target, Range("A1")) Is Nothing Then
              Reset_C
              End If
              If Not Intersect(Target, Range("B1")) Is Nothing Then
              Reset_AF
              End If
              End Sub

              s'implente automatiquement dans toutes les feuilles que l'ont crée.
              Pourrais tu m'expliquer ? Ou as tu écrit ce code a la base pour qu'il s'inscrive sur les feuilles que l'ont crée ?
              Merci, je-ne-peux-pas-signer-car-c'est-bloqué-par-le-filtre-anti-language-sms
              1. Contributeur
                Le code est solidaire de la feuille ainsi que toutes les données lors de la copie
            2. Ha mais parce que toi ton code n'est pas un module et que tu copie carrément la feuille Bdd. Tandis que moi, je copie les CELLULES de la Bdd. Du coup je suis obligé de tout refaire et utiliser tes codes ? Ou c'est possible de les adapter ?
              1. Parce que la copie des cellules de la base de donnée est régie par le fait qu'on selectionne DANS la cellule B1 de la BDD une date (exzemple mai2011) et si je copie la BDD elle même plutôt que les cellules, bah les nouvelles feuilles pourront elles memes créeer d'autres feuilles si on met qq chose dans leur cellule B1.
                Et ca pourrait être désastreux dans les mains des personnes que je cotoie.
                Cdlmt.
                1. Contributeur
                  voilà ton code:

                  Sub creer_macro()
                  Dim Code$, NextLine&
                  Sheets.Add.Move After:=Sheets(Sheets.Count) 'ajoute une feuille en dernier
                  On Error Resume Next
                  ' Comment ajouter le code.
                      Code = "Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)" & vbCrLf
                      Code = Code & "If Not Intersect(Target, Range(""a1"")) Is Nothing Then" & vbCrLf
                      Code = Code & "Call Reset_C" & vbCrLf
                      Code = Code & "End If" & vbCrLf
                     Code = Code & "If Not Intersect(Target, Range(""b1"")) Is Nothing Then" & vbCrLf
                      Code = Code & "Call Reset_AF" & vbCrLf
                      Code = Code & "End If" & vbCrLf
                      Code = Code & "End Sub"
                  '   Ecriture du code dans le module de la feuille (fs)
                  With ActiveWorkbook.VBProject.VBComponents(Sheets(Sheets.Count).CodeName).CodeModule
                         NextLine = .CountOfLines + 1
                        .InsertLines NextLine, Code
                  End With
                  End Sub
                  

                  1. Ok et ce code la il va sur ma feuille BDD ? ou sur le sommaire ? ou bien c'est un module ... :x ?
                    1. Peut etre que si vous pouvez acceder au fichier, ce sera plus simple (je suis un peu neuneu) : http://www.cjoint.com/c/GBxgRxKC0NU

                      Le plus simple c'est de faire comme je voulais,
                      ou bien serait il préférable de :

                      1- Adapter le code de la BDD pour le mettre sur la page sommaire, qui aurait donc 2 codes : -un pour un renvoie par double clic (colonne A) -un pour lancer la création d'une feuille (copie de la BDD)
                      2-Coder la BDD avec les maccro Reset (les codes dont je parlais au tout début)
                      3-Changer le module de création de feuilles (Nouveau_Mois) pour copier coller la BDD (comme votre fichier) plutôt que de copier les cellules.

                      Merci u_u
                      1. Contributeur
                        Voilà le nouveau code à changer, c'est tout

                        Sub Nouveau_Mois()
                        Dim Code$, NextLine&
                        Application.ScreenUpdating = False
                        'confirmer sélection feuille / copier
                        Sheets("Base de données").Select
                        Cells.Select
                        Selection.Copy
                        'créer une nouvelle feuille / coller le type mois base
                        Sheets.Add After:=ActiveSheet
                        On Error Resume Next
                        ' Comment ajouter le code.
                            Code = "Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)" & vbCrLf
                            Code = Code & "If Not Intersect(Target, Range(""a1"")) Is Nothing Then" & vbCrLf
                            Code = Code & "Call Reset_C" & vbCrLf
                            Code = Code & "End If" & vbCrLf
                           Code = Code & "If Not Intersect(Target, Range(""b1"")) Is Nothing Then" & vbCrLf
                            Code = Code & "Call Reset_AF" & vbCrLf
                            Code = Code & "End If" & vbCrLf
                            Code = Code & "End Sub"
                        '   Ecriture du code dans le module de la feuille (fs)
                        With ActiveWorkbook.VBProject.VBComponents(Sheets(Sheets.Count).CodeName).CodeModule
                               NextLine = .CountOfLines + 1
                              .InsertLines NextLine, Code
                        End With
                            Cells.Select
                            Selection.PasteSpecial Paste:=xlPasteAll, Operation:=xlNone, SkipBlanks:= _
                                False, Transpose:=False
                            Application.CutCopyMode = False
                        
                         'nommer la feuille
                         
                            ActiveSheet.Name = Range("B1").Value
                            
                        'ajouter dans le sommaire
                        
                        Range("B1").Copy Destination:=Sheets("Sommaire").Range("B1").End(xlDown).Offset(1, 0)
                        
                        'effacer le'entrée dans mois base
                        
                        Sheets("Base de données").Activate
                        Range("B1").ClearContents
                        Range("C5:an5").ClearContents
                        Range("C7:an7").ClearContents
                        Range("C9:an9").ClearContents
                        Range("C11:an11").ClearContents
                        Range("C13:an13").ClearContents
                        Range("C15:an15").ClearContents
                        Range("C17:an17").ClearContents
                        Range("C19:an19").ClearContents
                        Range("C21:an21").ClearContents
                        Range("C23:an23").ClearContents
                        Range("C25:an25").ClearContents
                        Range("C27:an27").ClearContents
                        Range("C29:an29").ClearContents
                        Range("C31:an31").ClearContents
                        Range("C33:an33").ClearContents
                        Range("C35:an35").ClearContents
                        Range("C37:an37").ClearContents
                        Range("C39:an39").ClearContents
                        Range("C41:an41").ClearContents
                        Range("C43:an43").ClearContents
                        Range("C45:an45").ClearContents
                        Range("C47:an47").ClearContents
                        Range("C49:an49").ClearContents
                        Range("C51:An51").ClearContents
                        Range("C53:An53").ClearContents
                        Range("C55:An55").ClearContents
                        Range("C57:An57").ClearContents
                        Range("C59:An59").ClearContents
                        Range("C61:An61").ClearContents
                        Range("C63:An63").ClearContents
                        Range("C65:An65").ClearContents
                        Range("C67:An67").ClearContents
                        Range("C69:an69").ClearContents
                        Range("C71:an71").ClearContents
                        Range("C73:an73").ClearContents
                        Range("C75:an75").ClearContents
                        Range("C77:An77").ClearContents
                        Range("C79:An79").ClearContents
                        Range("C81:An81").ClearContents
                        Range("C83:An85").ClearContents
                        Range("C87:An87").ClearContents
                        Range("C89:An90").ClearContents
                        Range("C92:An92").ClearContents
                        Range("C94:An94").ClearContents
                        Range("C96:AN96").ClearContents
                        Range("C98:An98").ClearContents
                        Range("C100:An101").ClearContents
                        Range("C103:an104").ClearContents
                        Range("C106:an108").ClearContents
                        Range("C110:An147").ClearContents
                        Range("C149:An151").ClearContents
                        Range("C153:An156").ClearContents
                        Range("C158:An173").ClearContents
                        Range("C180:AN184").ClearContents
                        'retour au sommaire
                        Sheets("Sommaire").Select
                        Application.ScreenUpdating = True
                        End Sub
                        
                        

                        1. Mhh ton code semble pertinent mais pourtant quand une nouvelle feuille est crée, elle n'est pas codé par
                              On Error Resume Next
                          ' Comment ajouter le code
                          Code = "Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)" & vbCrLf
                          Code = Code & "If Not Intersect(Target, Range(""c1"")) Is Nothing Then" & vbCrLf
                          Code = Code & "Call Reset_C" & vbCrLf
                          Code = Code & "End If" & vbCrLf
                          Code = Code & "If Not Intersect(Target, Range(""d1"")) Is Nothing Then" & vbCrLf
                          Code = Code & "Call Reset_AF" & vbCrLf
                          Code = Code & "End If" & vbCrLf
                          Code = Code & "End Sub"


                          Et la maccro s'exécute sans poser de problèmes, donc j'en déduis que tu n'as pas fais de faute dans le code ... je ne vois pas d'où peut venir le probleme.
                          Tiens si tu veux jeter un coup d'œil (j'ai modif les cellule a1 et b1 par c1 et d1 (y a des trucs écrits en a1 et b1))
                          Peut être que ce n'est pas "Call Reset_C" que je devais mettre ? Ou peut être le "On Error Resume Next" ? Parce que si je l'enleve le fichier bloque a cette ligne
                          With ActiveWorkbook.VBProject.VBComponents(Sheets(Sheets.Count).CodeName).CodeModule
                          donc peut etre que le On Error Resume Next permet simplement de passer outre le probleme rencontré, et donc que le probleme vient de cette ligne.
                          Merci de tous tes efforts j'attends ta réponse impatiemment,
                          Leo

                          http://www.cjoint.com/c/GBxm1eiDrHl
                          1. Contributeur
                            N'inversons pas les rôles, pour l'instant c'est toi qu'il faut aider!
                            Personnellement je n'ai aucun problème avec mes macros!

                            Voilà une autre manière de faire, il faudra t'en contenter:

                            http://www.cjoint.com/c/GBxosXQ5qfQ

                            Bonne continuation
                            1. Je pense que la façon la plus simple d'expliquer mon probleme c'est :
                              Quand je lance la maccro inscrite dans BASE DE DOINNEES
                              le module créer_mois se lance
                              Copie toutes les cellules de la base de données dans une nouvelle feuille, lui donne un nom, l'ajoute dans le sommaire, clean certaines cellules.

                              Ce qu'il me faudrait c'est que dans créer_mois, des lignes de codes insèrent dans les nouvelles feuilles créées le code permettant de lancer Reset_C.

                              Or votre solution en gros revient à copier juste toute la feuille Base de données (et donc les codes qui sont dedans) plutôt qu'insérer le code grace a la maccro Nouveau_Mois. Or moi c'est ca qu'il m'aurait fallu, vous n'avez vraiment pas d'idées comment faire :s ?
                              (encore) Merci, Leo.

                              PS: et je crois vraiment que je tenais un truc avec le on error resume next. Ne pensez pas que mon message pour vous aiguiller etait une facon de souligner votre incompétence, je suis là pour me faire aider pas donner des leçons.
                              1. Contributeur
                                Bonjour,

                                une autre façon de faire, à mettre dans ThisWorkbook :
                                Private Sub Workbook_SheetBeforeDoubleClick(ByVal Sh As Object, ByVal Target As Range, Cancel As Boolean)
                                    Const feuillesNon As String = ",Accueil,toto,"    ' liste des feuilles non concernées
                                    If InStr(feuillesNon, "," & Sh.Name & ",") = 0 Then
                                        If Not Intersect(Target, Range("a1")) Is Nothing Then
                                            Call Reset_C: Cancel = True
                                        End If
                                        If Not Intersect(Target, Range("b1")) Is Nothing Then
                                            Call Reset_AF: Cancel = True
                                        End If
                                    End If
                                End Sub

                                Mais comme te dit Le pivert, si tu as un code dans une feuille il est copié en même temps que la feuille.
                                eric

                                En essayant continuellement, on finit par réussir. 
                                Donc plus ça rate, plus on a de chances que ça marche.(les Shadoks)
                                En plus du merci (si si, ça se fait !!!), penser à mettre en résolu. Merci
                                • 1
                                • 2