Nouvelle feuille avec macro

Risleure

XLDnaute Occasionnel
Bonjour le Forum,

Une question simple dont je ne trouve pas la réponse dans ce forum mais pourtant elle doit y être !!!

J'utilise régulièrement la combinaison Ctrl+n pour créer un nouveau classeur mais voila je souhaite que ce nouveau classeur contienne systématiquement deux petites macro dans ThisWorkbook.

On peut le faire par le menu [Fichier][Nouveau][D'après un modèle] mais moi je le veux avec la combinaison Ctrl+n.

Je n'ai pas trouvé de classeur .xlt pouvant correspondre au classeur par défaut d'Excel donc je ne sais où enregistrer mes 2 petites macro. :(

Merci pour vos lumières
 

Risleure

XLDnaute Occasionnel
Re : Nouvelle feuille avec macro

Re,
Merci JNP mais ce n'est pas tout à fait cela... ou alors je n'ai pas bien lu.

Je ne veux pas avoir une macro disponible à tout moment donc à mettre dans PERSO.xls mais une macro écrite dans le ThisWorkbook du nouveau classeur donc visible dans le VBAProject dudit nouveau classeur et donc liée à ce classeur même si il se déplace ce qui n'est pas le cas si on utilise une macro de PERSO.xls qui reste sur le poste où est l'XL considéré.

Merci
 

JNP

XLDnaute Barbatruc
Re : Nouvelle feuille avec macro

Re :),
Je pensais que le XLT de Chris dans XLSTART pouvait fonctionner. Sinon, il doit être possible d'écrire la macro dans le nouveau fichier à l'ouverture avec PERSO.XLS, non ?
Bon courage :cool:
 

Risleure

XLDnaute Occasionnel
Re : Nouvelle feuille avec macro

Bonjour le Forum

comme le suggérais JNP
...il doit être possible d'écrire la macro dans le nouveau fichier à l'ouverture avec PERSO.XLS, non ?
Mais la solution n'est pas triviale.
Et comme j'ai reçu une réponse pour incorporer une macro dans tous les nouveaux classeurs créés sans passer par XlStart ou un .xlt et comme elle me semble exceptionnellement astucieuse, je vous en fait profiter.
Pour mémoire, il n'y a pas de module de code pour l'application Excel. Il y en a un pour chaque classeur ("ThisWorkbook") Il y en a un pour chaque feuille ("Feuil1", "Feuil2" ...) Et on peut en créer à loisir ("Module1", "Module2" ...) Or un nouveau classeur est un événement de niveau "Application". Il faut donc, pour l'intercepter, deux choses : L'objet Application Excel et un module permettant d'y placer une procédure événementielle permettant d'intercepter cet événement. Il faut un peu tricher... l'idée est d'initialiser une variable avec une référence sur l'objet application Excel, puis d'intercepter les événements de niveau application via cette variable. Il faut donc, pour l'intercepter, deux choses : L'objet Application Excel et un module permettant d'y placer une procédure événementielle permettant d'intercepter cet événement. Il faut un peu tricher...

Ci dessous le code complet à mettre dans [highlight]ThisWorkbook de Perso.xls[/code]. Lors de la création d'un nouveau classeur, pour l'exemple (et en réponse à ma question) une macro permettant d'imprimer le chemin et le nom du fichier en pied de page y est systématiquement incorporée.

Code:
'Ligne nécessaire à l'ajout systématique d'une macro lors de la création d'un nouveau classeur
Private WithEvents mobjApplicationExcel As Excel.Application 'Objet Application Excel courante

Private Sub Workbook_Open() ' Procédure appelée lorsque le classeur est ouvert
'Ligne nécessaire à l'ajout systématique d'une macro lors de la création d'un nouveau classeur
    Set mobjApplicationExcel = Me.Application ' On initialise la référence sur l'application Excel courante
End Sub

Private Sub mobjApplicationExcel_NewWorkbook(ByVal Wb As Workbook) ' Procédure appelée à chaque création d'un classeur
'Ligne nécessaire à l'ajout systématique d'une macro lors de la création d'un nouveau classeur
    Dim strMacro As String 'Texte VBA de la macro à ajouter
    
    ' On initalise le texte de la macro
            strMacro = "'---------- Macro ajoutée automatiquement à la création du classeur ----------" & vbCrLf & _
            "'Permet d'insérer le chemin dans le bas de la page" & vbCrLf & _
            "Private Sub Workbook_BeforePrint(Cancel As Boolean)" & vbCrLf & _
            "Dim ThisWBPath  " & vbCrLf & _
            "Dim NomDeLaFeuille " & vbCrLf & _
            "NomDeLaFeuille = ActiveSheet.Name" & vbCrLf & _
            "ThisWBPath = ActiveWorkbook.Path & ""\"" & ActiveWorkbook.Name" & vbCrLf & _
            "Sheets(NomDeLaFeuille).PageSetup.LeftFooter = ThisWBPath " & vbCrLf & _
            "End Sub"

' Que l'on insère dans le module de code de "ThisWorkbook", à la suite des lignes déjà existantes au cas où !!!(lignes "OPTION ...")
    With Wb.VBProject.VBComponents.Item("ThisWorkbook").CodeModule
        Call .InsertLines(.CountOfLines + 1, strMacro)
    End With
End Sub

Private Sub Workbook_BeforeClose(Cancel As Boolean)
    
    Set mobjApplicationExcel = Nothing ' On libère la référence sur l'application Excel courante

End Sub
Dernière étape : Sous Excel, dans le menu "Outils", commande "Macro", sous-commande "Sécurité". Puis dans l'onglet "Editeurs approuvés", cocher la case "Faire confiance au projet Visual Basic" Sinon, il y aura une erreur 1024 à l'éxecution de la macro.

Croyez bien que cette solution n'est pas de moi mais je l'utilise :D
 

Discussions similaires

Statistiques des forums

Discussions
312 360
Messages
2 087 598
Membres
103 604
dernier inscrit
CAROETALEX59