Bonjour à tous,
je me permets de relancer le sujet car j'ai un problème lié.
J'ai un classeur 'Matrice.xls' instancié pour chaque affaire, dans lequel il y a un module 'ListeArticles'. Suite à une récente migration du serveur de données, j'ai dû changer le code de ce module...
Les utilisateurs ouvrent les différentes instances du fichier 'Matrice.xls' par un fichier 'Index.xls'...
J'y ai donc mis une macro qui remplace le module 'ListeArticles' par sa version la plus récente.
Seulement voilà, j'ai rencontré plusieurs difficultés:
1. Le projet VB de 'Matrice.xls' a été protégé par plusieurs mots de passe au fil du temps, que je connais heureusement (j'ai donc une affaire A protégée par 'Pwd1', et une affaire B protégée par 'Pwd2'.
2. Par moment mon code de déverrouillage tente d'accéder à un autre projet que celui que je veux.
Voici mon code de déprotection pour illustration:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
| Function UnprotectVBProject(WB As Workbook, ByVal Password As String) As Boolean
Dim vbProj As Object
Set vbProj = WB.VBProject
'Inutile si le projet est déjà déprotégé
If vbProj.protection <> 1 Then
UnprotectVBProject = True
Exit Function
Else
Set Application.VBE.ActiveVBProject = vbProj
'Saisie du mot de passe avec SendKeys
Application.VBE.CommandBars(1).FindControl(ID:=2578, recursive:=True).Execute
SendKeys Password & "~~"
'Ajout pour sortir de la fenêtre de saisie du mot de passe au cas où Password n'est pas le bon
SendKeys "{TAB}{TAB}~"
If vbProj.protection <> 1 Then
UnprotectVBProject = True
Else
UnprotectVBProject = False
End If
End If
End Function |
La ligne Sendkeys "{TAB}{TAB}~", que j'ai ajoutée pour pouvoir sortir de la fenêtre de saisie du mot de passe si le mot de passe n'est pas le bon, doit être celle qui pose problème... En effet, si mon mot de passe est le bon, au lieu de sortir de la fenêtre de saisie du mot de passe, je me retrouve deux projets plus bas, et la touche Entrée m'envoie directement sur la fenêtre de saisie du mot de passe...
Je ne sais pas si je suis très clair, alors je rajoute aussi mon code d'appel, peut-être que ce sera mieux:
1 2 3 4 5 6 7 8 9
| 'Ouverture du classeur de l'affaire
Set Classeur_Cible = Workbooks.Open(Filename:=cible, UpdateLinks:=0, WriteResPassword:=code1, IgnoreReadOnlyRecommended:=True)
Deverrouill_Classeur = UnprotectVBProject(Classeur_Cible, Pwd1)
DoEvents
If Deverrouill_Classeur = False Then
'Si le mot de passe est refusé, c'est que l'affaire est trop ancienne, on doit alors utiliser l'ancien mot de passe
Deverrouill_Classeur = UnprotectVBProject(Classeur_Cible, Pwd2)
DoEvents
End If |
Mon problème est plus un désagrément qu'un bug (un clic sur 'Annuler' et le code poursuit son exécution sans problème), mais j'aimerais que tout soit transparent pour l'utilisateur.
Je pense que la solution serait de déclencher le Sendkeys "{TAB}{TAB}~" seulement si on est toujours sur la fenêtre de saisie du mot de passe après la première tentative de mot de passe, mais j'ignore comment faire...
Désolé pour le roman, et merci d'avance à ceux qui pourront m'aider.
Partager