Bonsoir.
Je travaille sous Windows Xp Pro SP2 avec Excel 2003.
J’ai un classeur « Loisirs.xls » pour lequel j’ai protégé son code VBA par un mot de passe.
C'est-à-dire que lorsque j’ouvre Microsoft Visual basic (par Alt+F11) de ce classeur, et que je veux déployer la liste de mes modules en cliquant sur le bouton + de VBAProject(Loisirs.xls)
Le mot de passe m’est demandé. (que je possède car je l’ai créé, ce n’est pas pour déprotéger un classeur soyons clair)
A partir d’un autre classeur, je voudrai ajouter un module dans ce classeur « Loisir.xls ».
Il me faut donc déprotéger, ajouter le module et reprotéger le classeur « Loisirs.xls ».
Ce classeur se trouve dans le répertoire :
C:\Vacances\
Son mot de passe : toto1 (pour l’exemple)

J’ai adapté la macro, de Laurent Longre, mpfe, suivante :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
 
'Attribute VB_Name = "DeprotegeProjetVBA"
 
'=================================================
'Laurent Longre, mpfe
 
Private Declare Function FindWindowA Lib "User32" _
  (ByVal lpClassName As String, _
  ByVal lpWindowName As String) As Long
 
Private Declare Function GetForegroundWindow Lib "User32" () As Long
 
Private Declare Function SetForegroundWindow Lib "User32" _
  (ByVal hWnd As Long) As Long
 
__________________________________
 
Function Déprotège(Classeur As String, MdP As String) As Boolean
 
  Dim XLhWnd As Long, VBEhWnd As Long, CurhWnd As Long
  Dim Wbk As Workbook
 
  On Error Resume Next
  Set Wbk = Workbooks(Dir$(Classeur))
  On Error GoTo Fin
  If Not Wbk Is Nothing Then
    If Wbk.FullName <> Classeur Then Exit Function
    If Not Wbk.Saved Then Wbk.Save
  Else: Application.ScreenUpdating = False
  End If
 
  CurhWnd = GetForegroundWindow
  XLhWnd = FindWindowA(vbNullString, Application.Caption)
 
  With Application.VBE
    VBEhWnd = FindWindowA(vbNullString, .MainWindow.Caption)
    If CurhWnd = XLhWnd Then SetForegroundWindow VBEhWnd
       .CommandBars.FindControl(ID:=2557).Execute
    ' NE PAS EFFACER, même si le classeur est déjà ouvert !!!!!!
    Workbooks.Open Classeur
    If ActiveWorkbook.VBProject.Protection = vbext_pp_locked Then
      SendKeys "~" & MdP & "~", True
      .ActiveCodePane.Window.Close
    End If
  End With
 
  SetForegroundWindow CurhWnd
  Déprotège = True
  Exit Function
 
Fin:
End Function
 
______________________________________________
 
Sub DeprotegeVBA()
 
  ' Déprotection du projet VBA C:\Temp\Test.xls (mot de passe "Zaza"),
  ' Ajout d'un module standard dans ce projet, puis rétablissement
  ' de la protection
 
  Const Classeur = "C:\Vacances\Loisirs.xls"
  If Not Déprotège(Classeur, "toto1") Then
    MsgBox "Erreur"
  Else
    MsgBox "Projet VBA déprotégé."
    With Workbooks(Dir$(Classeur))
      .VBProject.VBComponents.Add vbext_ct_StdModule
      .Close True
    End With
    Workbooks.Open Classeur
    MsgBox "Projet reprotégé, ajout d'un module standard."
  End If
 
End Sub
Mais cela ne fonctionne pas dans mon cas.
Quant je lance cette macro pas à pas avec F8, tout se déroule bien sans erreurs jusqu'à l’affichage du Msgbox : « Projet VBA déprotégé ».
Or, en vérifiant, le classeur n’est pas déprotégé !
Je m’aperçois que le problème se situe au niveau de la ligne :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
 
 If ActiveWorkbook.VBProject.Protection = vbext_pp_locked Then
La macro ne passe pas par :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
 
SendKeys "~" & MdP & "~", True
Mais saute directement en

De plus la variable : vbext_pp_locked = vide (est-ce pour cela que je saute directement à End if)

La macro, elle, continue donc jusqu'à l’affichage du Msgbox « Projet VBA déprotégé ».
Mon classeur n’est donc pas déprotégé malgré le Msgbox et je ne peux pas lui ajouter un module.
Est-ce que l’erreur provient de la macro utilisée qui n’est pas en VBA mais en VB. (je ne suis pas un spécialiste en la matière pour m’en rendre compte…), que me conseillez-vous ?
Merci pour votre aide.
Bonne soirée.