• Initiateur de la discussion Initiateur de la discussion JDACM
  • Date de début Date de début

Boostez vos compétences Excel avec notre communauté !

Rejoignez Excel Downloads, le rendez-vous des passionnés où l'entraide fait la force. Apprenez, échangez, progressez – et tout ça gratuitement ! 👉 Inscrivez-vous maintenant !

JDACM

XLDnaute Nouveau
Bonjour a tous les fidèles de ce forum


C'est la première fois que je pose un problème.

J'ai un classeur (dont je protège le code VBA); je désire faire la copie d'un onglet de ce classeur chaque jour.

Dans cet onglet il y a des formules en code VBA

Je voudrais transférer le code d'un module (Formules) vers la copie du nouveau classeur créé.

Quand j'enlève la protection VBA le code ci-dessous fonctionne très bien. Une erreur est produite si la protection est active.

Erreur 50289 (Impossible d'effectuer cette opération tant que le projet est protégé.

Est-ce qu'il y a moyen d'enlever la protection VBA par macro?

Qui peut m'aider?

Code:
Sub TransfertModule(NomModule As String, NomClasseur As String)

      Dim LignesCode As String

      Dim Wbk As Workbook

      With ThisWorkbook.VBProject.VBComponents(NomModule).CodeModule

      LignesCode = .Lines(1, .CountOfLines)

      End With

      LignesCode = Replace(LignesCode, "Option Explicit", "") 'On supprime "Option Explicit" car on risque un conflit si l'option "Déclaration des variables obligatoire" est en vigueur

      Workbooks(NomClasseur).VBProject.VBComponents.Add(1).Name = NomModule

      With Workbooks(NomClasseur).VBProject.VBComponents(NomModule).CodeModule

      .AddFromString LignesCode

      End With

End Sub
 
Dernière édition:
Re : Transfert de module

Bonjour,

Une piste avec la démarche suivante

1) Créez un classeur et copiez le code suivant dans un module standard

Code:
'### Constantes à adapter ###
Const MOT_PASSE As String = "zaza"
Const MODULE_EXPORT As String = "Module2"
'############################

Sub TransfertModule(NomModule As String, NomClasseur As String)
Dim LignesCode As String
Dim Wbk As Workbook
With thisworkbook.VBProject.VBComponents(NomModule).CodeModule
  LignesCode = .Lines(1, .CountOfLines)
End With
LignesCode = Replace(LignesCode, "Option Explicit", "")
With Workbooks(NomClasseur).VBProject
  .VBComponents.Add(1).Name = NomModule
  .VBComponents(NomModule).CodeModule.AddFromString LignesCode
End With
End Sub

Private Sub VBEUnprotect(ByVal WB As Workbook, ByVal MotPasse As String)
On Error GoTo Erreur
If WB.VBProject.Protection = 0 Then Exit Sub
Set Application.VBE.ActiveVBProject = WB.VBProject
SendKeys "{ENTER}" & MotPasse & "{ENTER}{ESC}", True
Erreur:
End Sub

Sub ExporterModule()
Dim i&
Dim Nom$
If Application.Workbooks.Count <> 2 Then
  MsgBox "Les classeurs ouverts doivent être au nombre de 2 pour que l'import-export du module puisse s'effectuer."
  Exit Sub
End If
For i& = 1 To 2
  If Workbooks(i&).Name <> thisworkbook.Name Then _
    Nom$ = Workbooks(i&).Name
Next i&
Application.VBE.MainWindow.Visible = True
Call VBEUnprotect(thisworkbook, MOT_PASSE)
Call TransfertModule(MODULE_EXPORT, Nom$)
Application.VBE.MainWindow.Visible = False
End Sub

2) Ajoutez un autre module standard (Module2) et copiez le code suivant

Code:
Sub zzz_CodeAexporter_zzz()
MsgBox "coucou"
End Sub

3) Protégez le projet avec le mot de passe "zaza" et enregistrez le classeur sous le nom de votre choix. Fermez le classeur.
4) Ouvrez à nouveau le classeur (le projet VBA doit être protégé).
5) Ouvrez un nouveau classeur dans lequel va être importer le Module2
6) Lancez la macro ExporterModule.

Cordialement.

PMO
Patrick Morange
 
Re : Transfert de module

Merci pour ce code Patrick,
Je l'ai essayé sur Excel 2002, Il fonctionne très bien.
La protection VBA est bien désactivée et le transfert du module est effectué.
Malheureusement la protection VBA reste désactivée et le code peut-être modifié après le transfert.
Est-ce qu'il y a moyen d'interdire l'affichage du projet par macro?
Salutations
 
Re : Transfert de module

Merci à Pyrof,
Ton idée est excellente, et c'est la première solution que j'ai essayé.
Quand je mets la fonction utilisée dans l'onglet, cela génère une erreur (#NOM?).
La fonction n'est pas reconnue.
Par contre si je la déplace vers un module classique ça fonctionne parfaitement! D'où ma question sur le transfert d'un module avec la protection VBA active.

Si quelqu'un trouve le moyen d'insérer la formule directement dans le code de l'onglet se serait parfait.
Merci à tous pour votre aide
 

Pièces jointes

Re : Transfert de module

Bonjour,

Merci pour ce code Patrick,
Je l'ai essayé sur Excel 2002, Il fonctionne très bien.
La protection VBA est bien désactivée et le transfert du module est effectué.
Malheureusement la protection VBA reste désactivée et le code peut-être modifié après le transfert.
Est-ce qu'il y a moyen d'interdire l'affichage du projet par macro?

Voici une nouvelle version prenant en compte la protection du VBA.

Je ne m'étends pas en explication, vous trouverez la nouvelle programmation dans la pièce jointe.

Cordialement.

PMO
Patrick Morange
 
Re : Transfert de module

Merci encore Patrick,
Je salut la performance d'envoyer dans la procédure du classeur créé le code servant à rouvrir le classeur qui vient d'être fermé.
Mon fichier est de grande taille 3Mo et doit évoluer encore. Il met 10 à 30 secondes pour s'ouvrir.
Grâce à ton exemple j'ai construit une procédure pour lire le code à partir d'un onglet du classeur source et l'installer vers le nouveau classeur. Pour ceci nul besoin d'enlever la protection du code VBA.
Ci-joint exemple.
Merci encore d'avoir été une aide pour moi.
Merci au forum pour le bel esprit manifesté.
Salutations

Code:
Sub CréerModule()
    Dim I&
    Dim Nom$
    Dim LigneCode
    
    For I& = 1 To 2
        If Workbooks(I&).Name <> ThisWorkbook.Name Then Nom$ = Workbooks(I&).Name
    Next I&
    
    For I = 1 To 19
        LigneCode = LigneCode & ThisWorkbook.Worksheets("CODE_A_EXPORTER").Cells(I, 1) & Chr(13)
    Next I
    
    With Workbooks(Nom$).VBProject
        .VBComponents.Add(1).Name = "Formule"
        .VBComponents("Formule").CodeModule.AddFromString LigneCode
    End With
End Sub
 

Pièces jointes

- Navigue sans publicité
- Accède à Cléa, notre assistante IA experte Excel... et pas que...
- Profite de fonctionnalités exclusives
Ton soutien permet à Excel Downloads de rester 100% gratuit et de continuer à rassembler les passionnés d'Excel.
Je deviens Supporter XLD

Discussions similaires

Réponses
3
Affichages
538
Réponses
2
Affichages
719
Retour