Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

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

7 réponses
Avatar
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:=2578,
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

7 réponses

Avatar
HD
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
Avatar
MichD
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
Avatar
HD
Un grand MERCI à toi !!! ça fonctionne
(ma macro précédente avait des soucis dû au Wait de 1 seconde qui me
manquait...)

--
@+
HD
Avatar
HD
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
Avatar
MichD
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
Avatar
HD
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
Avatar
Gloops
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.