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

Déprotection VBE impossible par code

15 réponses
Avatar
khinoa
Bonjour à tous,

J'utilise Excel 2002. Je voudrais à partir d'un classeur déprotégé, qui
contient le code suivant, déprotéger un classeur dont je connais le chemin
d'accès et le mot de passe. Le code ci-après récupéré sur le net ne
fonctionne pas.

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

Je préfère mettre le mot de passe dans le code, par exemple MDP. D'où
suppression des argements de la procédure qui devient UnprotectVBProject()

et l'instruction SendKeys Password & "~~" devient SendKeys "MDP" & "~~"

Mais comme il y a forcément 2 classeurs ouverts, celui qui contient le code
de déprotection ci-dessus et le classeur dont le VBE doit être déprotégé,
l'instruction Application.VBE.CommandBars(1).FindControl(ID:=2578,
recursive:=True).Execute n'affiche pas la boîte de dialogue du projet
protégé (attendue quand on clique dans VBE sur le nom du projet) et à
déprotéger, mais affiche celle du classeur source (et plus précisément
l'onglet Général) dont le VBE n'est pas protégé.

Or quand on clique dans l'explorateur de projets sur un projet protégé, une
petite boîte de dialogue "VBA Project Mot de passe" s'affiche dont le
curseur se trouve dans la case encore vide appelée "Entrer le mot de passe".
Comment donc sélectionner ou nommer, à partir du code ci-dessus, dans
l'explorateur de projets le bon projet (qui comprend toujours le nom d'un
classeur suivi de ".xls") pour que la bonne boîte de dialogue s'affiche?

J'ai essayé l'instruction suivante pour désigner le classeur actif dont le
VBE doit être déprotégé, sans succès. Le classeur actif a pourtant été
désigné comme le nouveau classeur ouvert à déprotéger, il s'agit donc bien
théoriquement avec ActiveWorkbook.VBProject du classeur dont le VBE doit
être déprotégé.

Set vbProj = ActiveWorkbook.VBProject


La déclaration Dim vbProj As Object est-elle suffisante pour désigner dans
l'explorateur de projets un projet VBA?

D'avance merci

khinoa

10 réponses

1 2
Avatar
anonymousA
Bonjour,

décidement, tu n'as pas de chance car cette affaire fonctionne très bien
ici un exemple avec un fichier qui s'appelle bibliothèque.xls et qui
bien sur est ouvert et dont le mdp est toto. Enfin, il n'est pas
obligatoire de déclarer vbProj autrement que as Object.

Sub ff()

UnprotectVBProject Workbooks("bibliothèque.xls"), "toto"

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

A+

Bonjour à tous,

J'utilise Excel 2002. Je voudrais à partir d'un classeur déprotégé, qui
contient le code suivant, déprotéger un classeur dont je connais le chemin
d'accès et le mot de passe. Le code ci-après récupéré sur le net ne
fonctionne pas.

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

Je préfère mettre le mot de passe dans le code, par exemple MDP. D'où
suppression des argements de la procédure qui devient UnprotectVBProject()

et l'instruction SendKeys Password & "~~" devient SendKeys "MDP" & "~~"

Mais comme il y a forcément 2 classeurs ouverts, celui qui contient le code
de déprotection ci-dessus et le classeur dont le VBE doit être déprotégé,
l'instruction Application.VBE.CommandBars(1).FindControl(ID:%78,
recursive:=True).Execute n'affiche pas la boîte de dialogue du projet
protégé (attendue quand on clique dans VBE sur le nom du projet) et à
déprotéger, mais affiche celle du classeur source (et plus précisément
l'onglet Général) dont le VBE n'est pas protégé.

Or quand on clique dans l'explorateur de projets sur un projet protégé, une
petite boîte de dialogue "VBA Project Mot de passe" s'affiche dont le
curseur se trouve dans la case encore vide appelée "Entrer le mot de passe".
Comment donc sélectionner ou nommer, à partir du code ci-dessus, dans
l'explorateur de projets le bon projet (qui comprend toujours le nom d'un
classeur suivi de ".xls") pour que la bonne boîte de dialogue s'affiche?

J'ai essayé l'instruction suivante pour désigner le classeur actif dont le
VBE doit être déprotégé, sans succès. Le classeur actif a pourtant été
désigné comme le nouveau classeur ouvert à déprotéger, il s'agit donc bien
théoriquement avec ActiveWorkbook.VBProject du classeur dont le VBE doit
être déprotégé.

Set vbProj = ActiveWorkbook.VBProject


La déclaration Dim vbProj As Object est-elle suffisante pour désigner dans
l'explorateur de projets un projet VBA?

D'avance merci

khinoa










Avatar
khinoa
Bonjour,

Je confirme que malheureusement chez moi le code ne fonctionne pas car la
boîte de dialogue qui s'affiche est celle du projet du classeur non protégé
(avec ses deux onglets Général et Protection) qui contient le code de
déprotection (classeur source) et n'est pas celle du classeur dont l'accès
au code doit être déprotégé (classeur cible)

Il découle de ce qui précède que le projet du classeur cible, classeur qui
est ouvert et qui devient donc actif, ne peut être sélectionné ou nommé et
encore moins déprotégé.

Il est impossible de nommer et donc de déprotéger le projet qui doit l'être.

D'ailleurs MsgBox ActiveWorkbook.VBProject.Name ne renvoie que "VBAProject"
et jamais le nom du classeur affiché dans l'explorateur de projets indiqué
après entre parenthèses. Alors je ne vois pas comment sélectionner ou
seulement nommer le nom du projet dont l'accès sera rendu possible par mot
de passe.

Des solutions ou des explications?

khinoa
Avatar
anonymousA
Eh bien non, aucune explication ou proposition, puisque je ne reproduis
absolument pas ce phénomène.La seule chose que je puis peut-être
apporter mais sans doute sans rapport puisqu'elle n'apparait pas dans
ton code, c'est de ne pas mettre une instruction du style
Application.VBE.MainWindow.Visible = False car elle conduit à ne pas
déprotéger le projet quand bien même les instructions précédentes aient
pu être exécutées.J'ai d'ailleurs du mal à voir comment tu peux voir que
la boite de dialogue qui s'ouvre est celle du projet abritant ta
procédure sachant que tout cela n'est que très fugace mais sait-on jamais ?

Décidément,je n'ai pas de chance avec toi bien que j'ai pu voir que tu
aies été dépanné sur ton fil d'hier sur une solution qui m'était apparue
comme la seule probable mais que je n'avais aucun moyen de vérifier
n'ayant pas Excel 2002.

A+

Bonjour,

Je confirme que malheureusement chez moi le code ne fonctionne pas car la
boîte de dialogue qui s'affiche est celle du projet du classeur non protégé
(avec ses deux onglets Général et Protection) qui contient le code de
déprotection (classeur source) et n'est pas celle du classeur dont l'accès
au code doit être déprotégé (classeur cible)

Il découle de ce qui précède que le projet du classeur cible, classeur qui
est ouvert et qui devient donc actif, ne peut être sélectionné ou nommé et
encore moins déprotégé.

Il est impossible de nommer et donc de déprotéger le projet qui doit l'être.

D'ailleurs MsgBox ActiveWorkbook.VBProject.Name ne renvoie que "VBAProject"
et jamais le nom du classeur affiché dans l'explorateur de projets indiqué
après entre parenthèses. Alors je ne vois pas comment sélectionner ou
seulement nommer le nom du projet dont l'accès sera rendu possible par mot
de passe.

Des solutions ou des explications?

khinoa







Avatar
khinoa
D'après un post retrouvé avec Google il semble qu'il y ait à ce sujet des
différences entre Excel 2002 et les versions antérieures. J'ai pourtant
essayé le code proposé pour 2002 sans résultat, il était plus simple mais le
résultat était le même.

J'ai d'ailleurs du mal à voir comment tu peux voir que la boite de
dialogue qui s'ouvre est celle du projet abritant ta procédure sachant que
tout cela n'est que très fugace mais sait-on jamais ?



Tout simplement car je ne peux sélectionner le projet de l'autre classeur et
parce que la boîte de dialogue qui apparaît lors de l'exécution du code, et
qui reste ouverte attendant je ne sais quoi, n'est pas celle qui permet de
déprotéger mais plutôt de protéger un projet. Cette boîte possède deux
onglets Général et Protection, et reste ouverte sur Général. Elle ne
ressemble en rien à celle qui demande le mot de passe pour déprotéger un
projet lorsqu'on clique sur le nom du projet dans l'explorateur de projets.

Même après avoir fermé manuellement cette boîte de dialogue, l'accès au
projet qui m'intéresse reste protégé car aucun mot de passe n'a pu lui être
donné, vu que la boîte le demandant n'est jamais apparue. Il me faut donc
cliquer sur le nom du projet et lui donner manuellement le mot de passe, ce
que j'aurais préféré que la macro fasse. Du coup je ne peux accéder par
programmation à aucun code d'un projet protégé, ce qui m'empêche de faire
certaines choses.

Décidément,je n'ai pas de chance avec toi bien que j'ai pu voir que tu
aies été dépanné sur ton fil d'hier sur une solution qui m'était apparue
comme la seule probable mais que je n'avais aucun moyen de vérifier
n'ayant pas Excel 2002.


Oui la solution d'hier était finalement simple (une option non cochée) mais
elle n'est d'aucune utilité, hélas, pour régler le problème d'aujourd'hui.

Merci quand même. J'irai peut-être poser cette question sur le forum
anglophone.

Au revoir

Avatar
Ange Ounis
Si tu as supprimé les 2 arguments de la procédure initiale, il n'est pas
suffisant de remplacer Password par ton mot de passe en dur, il faut aussi
remplacer WB par le nom du classeur (ouvert) à traiter, en début de procédure :

Set vbProj = Workbooks("NomDuClasseurProtégé.xls").VBProject

----------
Ange Ounis
----------

Bonjour à tous,

J'utilise Excel 2002. Je voudrais à partir d'un classeur déprotégé, qui
contient le code suivant, déprotéger un classeur dont je connais le chemin
d'accès et le mot de passe. Le code ci-après récupéré sur le net ne
fonctionne pas.

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

Je préfère mettre le mot de passe dans le code, par exemple MDP. D'où
suppression des argements de la procédure qui devient UnprotectVBProject()

et l'instruction SendKeys Password & "~~" devient SendKeys "MDP" & "~~"

Mais comme il y a forcément 2 classeurs ouverts, celui qui contient le code
de déprotection ci-dessus et le classeur dont le VBE doit être déprotégé,
l'instruction Application.VBE.CommandBars(1).FindControl(ID:%78,
recursive:=True).Execute n'affiche pas la boîte de dialogue du projet
protégé (attendue quand on clique dans VBE sur le nom du projet) et à
déprotéger, mais affiche celle du classeur source (et plus précisément
l'onglet Général) dont le VBE n'est pas protégé.

Or quand on clique dans l'explorateur de projets sur un projet protégé, une
petite boîte de dialogue "VBA Project Mot de passe" s'affiche dont le
curseur se trouve dans la case encore vide appelée "Entrer le mot de passe".
Comment donc sélectionner ou nommer, à partir du code ci-dessus, dans
l'explorateur de projets le bon projet (qui comprend toujours le nom d'un
classeur suivi de ".xls") pour que la bonne boîte de dialogue s'affiche?

J'ai essayé l'instruction suivante pour désigner le classeur actif dont le
VBE doit être déprotégé, sans succès. Le classeur actif a pourtant été
désigné comme le nouveau classeur ouvert à déprotéger, il s'agit donc bien
théoriquement avec ActiveWorkbook.VBProject du classeur dont le VBE doit
être déprotégé.

Set vbProj = ActiveWorkbook.VBProject


La déclaration Dim vbProj As Object est-elle suffisante pour désigner dans
l'explorateur de projets un projet VBA?

D'avance merci

khinoa










Avatar
khinoa
Bonjour Ange,

Si tu as supprimé les 2 arguments de la procédure initiale, il n'est pas
suffisant de remplacer Password par ton mot de passe en dur, il faut aussi
remplacer WB par le nom du classeur (ouvert) à traiter, en début de
procédure :

Set vbProj = Workbooks("NomDuClasseurProtégé.xls").VBProject


Naturellement j'ai désigné nommément le classeur dont l'accès au VBE doit
être possible. Dans le code suivant "nom" est réellement le nom du classeur
ouvert par macro dont l'accès à VBE doit être déprotégé. D'après ce code je
suis sûr que le bon projet est identifié, mais comment s'assurer qu'il est
vraiment sélectionné? Comment ou par quelle succession de touches avec
SendKeys reproduire le clic sur son nom dans l'explorateur de projets qui
permet d'afficher la boîte de dialogue demandant le mot de passe ?

L'instruction SendKeys "{ENTER}" & "motdepasse" & "{ENTER}{ESC}", True est
peut être correcte, je l'ignore, mais comme c'est toujours la boîte de
dialogue avec les deux onglets Général et Protection qui s'affiche (soit
celle du projet non protégé qui contient le code source, ici déprotection),
cette succession de touches ne sert à rien, car l'instruction SendKeys
devrait apporter seulement la réponse à la boîte de dialogue demandant
d'entrer un mot de passe.

Apparemment l'instruction Set Application.VBE.ActiveVBProject =
Workbooks(nom).VBProject n'arrive pas à activer le projet qui est pourtant
correctement nommé avec "nom" puisque le projet reste protégé à la fin de
l'exécution de la macro. Est-on obligé d'utiliser une variable objet comme
Set? Ne peut-on pas écrire cela différemment?

Logiquement après avoir exécuté le code de la macro, s'il fonctionnait bien,
en cliquant sur le nom du projet dans l'explorateur de projet, je ne devrais
pas avoir à entrer de mot de passe puisque le projet à déprotéger reste
ouvert provisoirement, n'est-ce pas?

Sub déprotection()

Dim nom As String

nom = ActiveWorkbook.Name

If Workbooks(nom).VBProject.Protection = 0 Then Exit Sub
Set Application.VBE.ActiveVBProject = Workbooks(nom).VBProject
SendKeys "{ENTER}" & "motdepasse" & "{ENTER}{ESC}", True

Khinoa

Avatar
Ange Ounis
As-tu essayé de déprotéger ton projet en utilisant le code tel qu'il proposé au
départ (cad avec une procédure appelant celle qui a ses deux paramètres) ?
Ton premier post n'est pas clair sur ce point.

----------
Ange Ounis
----------

Bonjour Ange,

Si tu as supprimé les 2 arguments de la procédure initiale, il n'est pas
suffisant de remplacer Password par ton mot de passe en dur, il faut aussi
remplacer WB par le nom du classeur (ouvert) à traiter, en début de
procédure :

Set vbProj = Workbooks("NomDuClasseurProtégé.xls").VBProject


Naturellement j'ai désigné nommément le classeur dont l'accès au VBE doit
être possible. Dans le code suivant "nom" est réellement le nom du classeur
ouvert par macro dont l'accès à VBE doit être déprotégé. D'après ce code je
suis sûr que le bon projet est identifié, mais comment s'assurer qu'il est
vraiment sélectionné? Comment ou par quelle succession de touches avec
SendKeys reproduire le clic sur son nom dans l'explorateur de projets qui
permet d'afficher la boîte de dialogue demandant le mot de passe ?

L'instruction SendKeys "{ENTER}" & "motdepasse" & "{ENTER}{ESC}", True est
peut être correcte, je l'ignore, mais comme c'est toujours la boîte de
dialogue avec les deux onglets Général et Protection qui s'affiche (soit
celle du projet non protégé qui contient le code source, ici déprotection),
cette succession de touches ne sert à rien, car l'instruction SendKeys
devrait apporter seulement la réponse à la boîte de dialogue demandant
d'entrer un mot de passe.

Apparemment l'instruction Set Application.VBE.ActiveVBProject =
Workbooks(nom).VBProject n'arrive pas à activer le projet qui est pourtant
correctement nommé avec "nom" puisque le projet reste protégé à la fin de
l'exécution de la macro. Est-on obligé d'utiliser une variable objet comme
Set? Ne peut-on pas écrire cela différemment?

Logiquement après avoir exécuté le code de la macro, s'il fonctionnait bien,
en cliquant sur le nom du projet dans l'explorateur de projet, je ne devrais
pas avoir à entrer de mot de passe puisque le projet à déprotéger reste
ouvert provisoirement, n'est-ce pas?

Sub déprotection()

Dim nom As String

nom = ActiveWorkbook.Name

If Workbooks(nom).VBProject.Protection = 0 Then Exit Sub
Set Application.VBE.ActiveVBProject = Workbooks(nom).VBProject
SendKeys "{ENTER}" & "motdepasse" & "{ENTER}{ESC}", True

Khinoa





Avatar
khinoa
As-tu essayé de déprotéger ton projet en utilisant le code tel qu'il
proposé au départ (cad avec une procédure appelant celle qui a ses deux
paramètres) ?
Ton premier post n'est pas clair sur ce point.



Oui comme je l'ai dit dans mon premier post, le code avec la procédure
appelante et ses deux arguments ne fonctionne pas non plus. D'ailleurs qu'il
y ait deux procédures (une appelante et une appelée) ou une seule, le
résultat ne peut être qu'identique. Mes recherches sur le net montrent
qu'apparemment le code récupéré fonctionne chez les autres, mais pas chez
moi.

Alors je préfère abandonner et je verrai lorsque j'aurais une nouvelle
version d'Excel si le problème persiste.

Je te remercie pour ton aide

khinoa

Avatar
Clément Marcotte
De toutes façons, tu ne peux pas modifier du code protégé dans une autre
version sans le déprotéger avant dans la version initiale.


"khinoa" a écrit dans le message de news:
4467772e$0$17371$
As-tu essayé de déprotéger ton projet en utilisant le code tel qu'il
proposé au départ (cad avec une procédure appelant celle qui a ses deux
paramètres) ?
Ton premier post n'est pas clair sur ce point.



Oui comme je l'ai dit dans mon premier post, le code avec la procédure
appelante et ses deux arguments ne fonctionne pas non plus. D'ailleurs
qu'il y ait deux procédures (une appelante et une appelée) ou une seule,
le résultat ne peut être qu'identique. Mes recherches sur le net montrent
qu'apparemment le code récupéré fonctionne chez les autres, mais pas chez
moi.

Alors je préfère abandonner et je verrai lorsque j'aurais une nouvelle
version d'Excel si le problème persiste.

Je te remercie pour ton aide

khinoa






Avatar
khinoa
Bonjour Clément,

De toutes façons, tu ne peux pas modifier du code protégé dans une autre
version sans le déprotéger avant dans la version initiale.


Je veux simplement dire qu'avec une nouvelle version je tenterai à nouveau
sur de nouveaux classeurs créés pour la circonstance. Et je verrai si
c'était lié à ma version d'Excel 2002. Pour l'instant je ne peux rien faire
d'autre.

au revoir

1 2