Ta demande était : comment déprotéger par macro un fichier dont le projet VBA est protégé.
La solution proposée me semble répondre à ta demande.
Une fois déprotégé, le code proposé par Efgé doit donc pouvoir faire son travail.
A+
As-tu seulement lu le lien que je t'avais indiqué ? Les explications me semblent pourtant claires et même si c'est en anglais tu peux utiliser un outil de traduction (celui de Google par exemple).MERCI pour la réponse mais je n'arrive pas comprendre pourquoi deux fichiers ??
Sub DeprotegerProjetVBA()
Dim NomClasseur As String
If Application.VBE.ActiveVBProject.Protection <> 0 Then
NomClasseur = ThisWorkbook.Path & "\FichierTemp.xls"
Workbooks.Open Filename:=NomClasseur
Application.Run "'FichierTemp.xls'!Sample"
Workbooks("FichierTemp.xls").Close SaveChanges:=False
End If
End Sub
Sub Procedure()
Application.ScreenUpdating = False
If Application.VBE.ActiveVBProject.Protection <> 0 Then
Call CreerClasseur
Call DeprotegerProjetVBA
Call SupprimerClasseur
End If
Application.ScreenUpdating = True
End Sub
Sub SupprimerClasseur()
Dim chemin As String, nf As String
nf = ThisWorkbook.Path & "\FichierTemp.xls"
chemin = Dir(nf)
If chemin <> "" Then Kill (nf)
End Sub
Sub CreerClasseur()
Dim xlBook As Workbook
Dim xlModule As Object, i As Long
Application.DisplayAlerts = False
Set xlBook = Workbooks.Add
Set xlModule = xlBook.VBProject.VBComponents.Add(1)
With xlModule.CodeModule
i = .CountOfLines
.InsertLines i, "Sub Sample()": i = i + 1
.InsertLines i, "UnprotecPassword Workbooks(""Unprotect_VBA_Project.xls""), ""do""": i = i + 1
.InsertLines i, "End Sub": i = i + 1
.InsertLines i, "Sub UnprotecPassword(wb As Workbook, ByVal projectPassword As String)": i = i + 1
.InsertLines i, "Dim currentActiveWb As Workbook": i = i + 1
.InsertLines i, "If wb.VBProject.Protection <> 1 Then": i = i + 1
.InsertLines i, "Exit Sub": i = i + 1
.InsertLines i, "End If": i = i + 1
.InsertLines i, "Set currentActiveWb = ActiveWorkbook": i = i + 1
.InsertLines i, "wb.Activate": i = i + 1
.InsertLines i, "SendKeys ""^r""": i = i + 1
.InsertLines i, "SendKeys ""{TAB}""": i = i + 1
.InsertLines i, "SendKeys ""~""": i = i + 1
.InsertLines i, "SendKeys projectPassword": i = i + 1
.InsertLines i, "SendKeys ""~""": i = i + 1
.InsertLines i, "SendKeys ""{NUMLOCK}""": i = i + 1
.InsertLines i, "If (wb.VBProject.Protection = 0) Then": i = i + 1
.InsertLines i, "MsgBox (""failed to unlock"")": i = i + 1
.InsertLines i, "End If": i = i + 1
.InsertLines i, "currentActiveWb.Activate": i = i + 1
.InsertLines i, "End Sub": i = i + 1
End With
xlBook.SaveAs Filename:= _
ThisWorkbook.Path & "\FichierTemp.xls", FileFormat:=xlExcel8 _
, Password:="", WriteResPassword:="", ReadOnlyRecommended:=False, _
CreateBackup:=False
xlBook.Close SaveChanges:=True
Application.DisplayAlerts = True
End Sub
Encore une fois, je n'ai faire que suivre puis développer l'idée proposée dans le lien mais peut-être y-a-t-il plus simple, peut-être n'a-t-on pas besoin de passer par la création de ce fichier temporaire, peut-être peut-on directement inclure un code de déprotection dans le fichier, bref à toi aussi de creuser la question.
Sub Sample()
UnprotecPassword Workbooks(ThisWorkbook.Name), "do"
End Sub
Sub UnprotecPassword(wb As Workbook, ByVal projectPassword As String)
Dim currentActiveWb As Workbook
If wb.VBProject.Protection <> 1 Then Exit Sub
Set currentActiveWb = ActiveWorkbook
wb.Activate
SendKeys "%{F11}"
SendKeys "^r" ' Set focus to Explorer
SendKeys "{TAB}" ' Tab to locked project
SendKeys "~" ' Enter
SendKeys projectPassword
SendKeys "~" ' Enter
SendKeys "{NUMLOCK}"
If (wb.VBProject.Protection = vbext_pp_locked) Then
MsgBox ("failed to unlock")
End If
currentActiveWb.Activate
End Sub
Sub DeprotegerProjetVBA()
If Application.VBE.ActiveVBProject.Protection <> 0 Then Call Sample
End Sub
Ce n'est pas du tout ce que j'ai dit.Re DAVID
merci pour ces explications donc si j'ai bien compris ta logique : je rajoute ce code au code TOM(Efgé) est ça fonctionne!!!
mais malheureusement ça n'a pas fonctionné??? je suis désolé
A+
Sub Sample()
UnprotecPassword Workbooks(ThisWorkbook.Name), "do"
End Sub
Sub UnprotecPassword(wb As Workbook, ByVal projectPassword As String)
Dim currentActiveWb As Workbook
Set currentActiveWb = ActiveWorkbook
wb.Activate
SendKeys "%{F11}"
SendKeys "^r" ' Set focus to Explorer
SendKeys "{TAB}" ' Tab to locked project
SendKeys "~" ' Enter
SendKeys projectPassword
SendKeys "~" ' Enter
SendKeys "{NUMLOCK}"
currentActiveWb.Activate
End Sub
Sub DeprotegerProjetVBA()
If Application.VBE.ActiveVBProject.Protection <> 0 Then Call Sample
End Sub
re
grazie DAVID je vais le tester ...
A+
NB: ci rattaché le 1 jet de mon fichier (rassemblé Egfé et DAVID)
Bonjour DAVIDJe ne vois pas le code fourni par Efgé dans ton fichier.
A+
RE
Je te laisse réfléchir la-dessus et dois te laisser car je suis occupé par ailleurs.
Bon courage
A+
je souhaiterai créer un code qui supprime tous les codes du mon classeur ( fichiers) de cette maniere
1 - Déverrouiller le code de VBA ( ou bien désactiver le code ou le supprimer définitivement )
2 - vérifier la date ( d'autodetruit )
3 - en fin supprimer toutes les feuilles et les codes
Je t'ai bien précisé que le bouton n'était là que pour la phase de test. Rien ne t'empêchera une fois le code testé correctement d'appeler la procédure via la Sub Workbook_Open() et donc de supprimer le bouton.NB toutes ces codes doivent être automatique sans créer des boutons
Je suis d'accord avec ce que tu as décrit mais alors pourquoi ne pas suivre ta logique ?si vous permettez ma logique( ou bien comme je vois les choses)
mais pourtant tu fais l'inverse en lançant dans la Sub Workbook_Open le code de Efgé sans t'occuper du fait de déprotéger le projet VBA avant.1 - Déverrouiller le code de VBA ( ou bien désactiver le code ou le supprimer définitivement )
2 - vérifier la date ( d'autodetruit )
3 - en fin supprimer toutes les feuilles et les codes