[VBA] Déprotéger un projet VBA à partir d'une macro

Le
HD
Bonjour,

Je cherche à déprotéger des projets VBA via une macro VBA. Sur le net, j'ai
trouvé un code mais qui semble s'appliquer aux anciennes versions d'Excel.
Je suis sous Excel 2007.

Sub CopieCodeModule()
Dim S As String, Wbk As Workbook
'module à copier
With ActiveWorkbook.VBProject.VBComponents("Module1").CodeModule
S = .Lines(1, .CountOfLines)
End With
Set Wbk = Workbooks("Perso.xls")
UnprotectVBProject Wbk, "MotDePasse"
'détruire le module à mettre à jour s'il existe
On Error Resume Next
With Wbk.VBProject.VBComponents
.Remove .Item("MonModule")
End With
On Error GoTo 0
'ajouter un nouveau module et copier le code
Wbk.VBProject.VBComponents.Add(1).Name = "MonModule"
With Wbk.VBProject.VBComponents("MonModule").CodeModule
.AddFromString S
End With
End Sub

Sub UnprotectVBProject(WB As Workbook, ByVal Password As String)
Dim vbProj As Object
Set vbProj = WB.VBProject
If vbProj.Protection 1 Then Exit Sub
Set Application.VBE.ActiveVBProject = vbProj
SendKeys Password & "~~~"
Application.VBE.CommandBars(1).FindControl(ID:%78,
recursive:=True).Execute
End Sub

Auriez vous une méthode pour déprotéger un projet VBA à partir du VBA avec
Excel 2007 ? J'ai put adapter un code pour simuler les combinaisons de
touche :
Sub DeprotVBA()
Application.SendKeys ("%{F11}")
Application.SendKeys ("%o")
Application.SendKeys ("e")
Application.SendKeys ("mon_mot_de_passe{ENTER}")
Application.SendKeys ("{ENTER}")
End Sub

mais elle ne fonctionne que si le lance seul dès que je tente de le
lancer à partir d'une macro comportant d'autres lignes de codes alors je
tombe sur la boîte de dialogue me demandant le mot de passe bien entendu
si j'essai d'adapter en ajouter
Application.SendKeys ("mon_mot_de_passe{ENTER}")
Application.SendKeys ("{ENTER}")
cela ne change rien

--
@+
HD
Vidéos High-Tech et Jeu Vidéo
Téléchargements
Vos réponses
Gagnez chaque mois un abonnement Premium avec GNT : Inscrivez-vous !
Trier par : date / pertinence
HD
Le #23467961
J'ai réussi à adapter une procédure... pour info:

Sub TestunProtect()
UnProtectVBProject Workbooks("monclasseur.xls"), "monmotdepasse"
End Sub


Sub ProtectVBProject(WB As Workbook, ByVal Password As String)
Dim vbProj As Object
Set vbProj = WB.VBProject
If vbProj.Protection = 1 Then Exit Sub
Set Application.VBE.ActiveVBProject = vbProj
Application.VBE.CommandBars(1).FindControl(ID:%78,
recursive:=True).Execute
SendKeys "+{TAB}{RIGHT}%V{+}{TAB}" & Password & "{TAB}" & Password & "~",
True
'WB.Save
'WB.Close
End Sub

Sub UnProtectVBProject(WB As Workbook, ByVal Password As String)
Dim vbProj As Object
Set vbProj = WB.VBProject
If vbProj.Protection <> 1 Then Exit Sub
Set Application.VBE.ActiveVBProject = vbProj
Application.VBE.CommandBars(1).FindControl(ID:%78,
recursive:=True).Execute
SendKeys Password & "~"
SendKeys "~"
'WB.Save
'WB.Close
End Sub



--
@+
HD
MichD
Le #23467951
Bnnjour,

Essaie comme ceci :

Tu insères un module standard et tu y copies le code suivant:
Tu lances la procédure : "OterProtectionPRojetVBA"
La macro doit être lancée à partir de l'interface de la feuille de calcul et
non directement à partir de la fenêtre de l'éditeur de code.

Quelques variables à renseigner : "MotDePasse" , Nom du classeur : "perso.xls"
et nom du module à supprimer et à ajouter dans la procédure : "CopieCodeModule"

'-----------------------------------------------
Sub OterProtectionPRojetVBA()
'mot de passe : "denis" pour déprotéger le classer
UnprotectVBProject Workbooks("Perso.xls"), "MotDePasse"
End Sub
'-----------------------------------------------
Sub UnprotectVBProject(WB As Workbook, ByVal Password As String)
Dim vbProj As Object

Set vbProj = WB.VBProject

'Ne peut procéder si le projet est non-protégé.
If vbProj.Protection <> 1 Then Exit Sub

Set Application.VBE.ActiveVBProject = vbProj

'Utilisation de "SendKeys" Pour envoyer le mot de passe.

SendKeys Password & "~~"
'MsgBox "Après Mot de passe"
Application.VBE.CommandBars(1).FindControl(ID:%78, recursive:=True).Execute
Application.Wait (Now + TimeValue("0:00:1"))
CopieCodeModule
End Sub
'-----------------------------------------------
Sub CopieCodeModule()
Dim S As String, Wbk As Workbook
'module à copier
With ActiveWorkbook.VBProject.VBComponents("Module1").CodeModule
S = .Lines(1, .CountOfLines)
End With
Set Wbk = Workbooks("Perso.xls")
'détruire le module à mettre à jour s'il existe
On Error Resume Next
With Wbk.VBProject.VBComponents
.Remove .Item("MonModule")
End With
On Error GoTo 0
'ajouter un nouveau module et copier le code
Wbk.VBProject.VBComponents.Add(1).Name = "MonModule"
With Wbk.VBProject.VBComponents("MonModule").CodeModule
.AddFromString S
End With
End Sub
'-----------------------------------------------

MichD
--------------------------------------------
"HD" a écrit dans le message de groupe de discussion : itcsa2$1nts$

Bonjour,

Je cherche à déprotéger des projets VBA via une macro VBA. Sur le net, j'ai
trouvé un code mais qui semble s'appliquer aux anciennes versions d'Excel.
Je suis sous Excel 2007.

Sub CopieCodeModule()
Dim S As String, Wbk As Workbook
'module à copier
With ActiveWorkbook.VBProject.VBComponents("Module1").CodeModule
S = .Lines(1, .CountOfLines)
End With
Set Wbk = Workbooks("Perso.xls")
UnprotectVBProject Wbk, "MotDePasse"
'détruire le module à mettre à jour s'il existe
On Error Resume Next
With Wbk.VBProject.VBComponents
.Remove .Item("MonModule")
End With
On Error GoTo 0
'ajouter un nouveau module et copier le code
Wbk.VBProject.VBComponents.Add(1).Name = "MonModule"
With Wbk.VBProject.VBComponents("MonModule").CodeModule
.AddFromString S
End With
End Sub

Sub UnprotectVBProject(WB As Workbook, ByVal Password As String)
Dim vbProj As Object
Set vbProj = WB.VBProject
If vbProj.Protection 1 Then Exit Sub
Set Application.VBE.ActiveVBProject = vbProj
SendKeys Password & "~~~"
Application.VBE.CommandBars(1).FindControl(ID:%78,
recursive:=True).Execute
End Sub

Auriez vous une méthode pour déprotéger un projet VBA à partir du VBA avec
Excel 2007 ? J'ai put adapter un code pour simuler les combinaisons de
touche :
Sub DeprotVBA()
Application.SendKeys ("%{F11}")
Application.SendKeys ("%o")
Application.SendKeys ("e")
Application.SendKeys ("mon_mot_de_passe{ENTER}")
Application.SendKeys ("{ENTER}")
End Sub

mais elle ne fonctionne que si le lance seul... dès que je tente de le
lancer à partir d'une macro comportant d'autres lignes de codes alors je
tombe sur la boîte de dialogue me demandant le mot de passe... bien entendu
si j'essai d'adapter en ajouter
Application.SendKeys ("mon_mot_de_passe{ENTER}")
Application.SendKeys ("{ENTER}")
cela ne change rien...

--
@+
HD
HD
Le #23468201
Un grand MERCI à toi !!! ça fonctionne
(ma macro précédente avait des soucis dû au Wait de 1 seconde qui me
manquait...)

--
@+
HD
HD
Le #23468511
SendKeys Password & "~~"


Petite question à propos du sendkeys... il me semble que si je lance des
macros en rafale utilisant cette procédure il est alors déconseillé
d'utiliser d'autres programmes vu que j'aurais le clavier à utiliser...

--
@+
HD
MichD
Le #23468781
Bonjour,

Quand il y a moyen de se passer de "Sendkeys" et qu'on peut la remplacer par une autre commande, il ne faut pas hésiter
à cause du caractère même de cette commande. Cela étant dit, dans ton cas, cette commande est nécessaire et il n'existe
pas une manière de contourner sont utilisation. Teste la macro dans l'environnement qu'elle sera employée, si elle
fonctionne, d'où émane cette préoccupation ?



MichD
--------------------------------------------
"HD" a écrit dans le message de groupe de discussion : itd6ht$25mv$

SendKeys Password & "~~"


Petite question à propos du sendkeys... il me semble que si je lance des
macros en rafale utilisant cette procédure il est alors déconseillé
d'utiliser d'autres programmes vu que j'aurais le clavier à utiliser...

--
@+
HD
HD
Le #23471221
d'où émane cette préoccupation ?


Arfff... elle émane du fait que pendant que ma macro tourne et lance des
sendkey à profusion je préfére ne pas toucher à mon pc de peur d'avoir des
soucis dans la macro... c'est vrai que ça monopolise le PC mais bon c'est un
mal nécessaire. lol

C'est dommage qu'il n'y ai pas d'autres moyens de déprotégrer le projet VBA.
Espérons que cela sera possible dans les prochaines versions d'Excel.

--
@+
HD
Gloops
Le #23472551
HD a écrit, le 17/06/2011 09:27 :
d'où émane cette préoccupation ?


Arfff... elle émane du fait que pendant que ma macro tourne et lance des
sendkey à profusion je préfére ne pas toucher à mon pc de peur d'avoir des
soucis dans la macro... c'est vrai que ça monopolise le PC mais bon c 'est un
mal nécessaire. lol

C'est dommage qu'il n'y ai pas d'autres moyens de déprotégrer le pr ojet VBA.
Espérons que cela sera possible dans les prochaines versions d'Excel.




Bonjour,

Est-ce que ce n'est pas une considération de sécurité qui amène à dire
que si c'est l'utilisateur qui veut modifier la protection du projet,
c'est à lui de le faire, et non à une macro ?



Pour que les simulations de touches partent bien vers la bonne fenêtre
il y aurait bien l'utilisation de SendMessage, mais ça, il m'a semblé
repérer que ce n'est pas un jouet pour débutants.
Publicité
Poster une réponse
Anonyme