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 :
Mais cela ne fonctionne pas dans mon cas.
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
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 :
La macro ne passe pas par :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 If ActiveWorkbook.VBProject.Protection = vbext_pp_locked Then
Mais saute directement en
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 SendKeys "~" & MdP & "~", True
De plus la variable : vbext_pp_locked = vide (est-ce pour cela que je saute directement à End if)
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 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.
Partager