VBA enregistrement protégé & cellule modifié

castet -  
lermite222 Messages postés 8724 Date d'inscription   Statut Contributeur Dernière intervention   -
Bonjour,

J'ai réussi à protéger l'enregistrement de mon classeur par mot de passe pour éviter des modifications inopportunes (en plus de protéger la feuille par mot de passe) et pour garantir que le fichier démarre avec une "page d'accueil".
Mais pour une plage de cellule je voudrais forcer l'enregistrement si elles sont modifiées.
J'ai donc mis la macro dans Feuil3 :

Sub Worksheet_Change(ByVal Target As Range)

Dim Intersection As Range, Plage As Range

Set Plage = Range("A2:B10")

Set Intersection = Application.Intersect(Target, Plage)
If Intersection Is Nothing Then
MsgBox "La cellule visée n'est pas dans la plage !"
Else
ActiveWorkbook.Save
Unprotect ("admin")
MsgBox "fichier sauvegardé"
End If

Set Plage = Nothing
Set Intersection = Nothing

End Sub
et dans This workbook, j'ai mis cette macro pour verrouiller l'enregistrement :
Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)
' Cette macro permet de bloquer l'enregistrement par un mot de passe.
Dim Password
Password = "admin"
a = InputBox("L'enregistrement de ce document est protégé par mot de passe. Veuillez saisir le mot de passe pour enregistrer ou fermer sans enregistrer :", Password)
If a <> Password Then Cancel = True
End Sub


Mon problème c'est que je n'arrive pas à débloquer l'enregistrement quand cette plage de celulles est modifiée.... (j'espère que j'ia été assez claire?)
Auriez-vous une idée??

Merci pour vos conseils....

A voir également:

11 réponses

lermite222 Messages postés 8724 Date d'inscription   Statut Contributeur Dernière intervention   1 191
 
Bonjour,
Private Sub Worksheet_Change(ByVal Target As Range) 
'Pas besoin de tester la plage, si le reste est protéger 
'Ca ne peu pas arriver dans cet événement, Excel le courcircuite avant. 

'Mais si la feuille n'est pas protégée..libère les 2 lignes (If et End If) 
    'If Not Intersect(Target, Range("A2:B10")) Is Nothing Then 
        'Tu a inverser le code 
        With ActiveWorkbook 
            .Unprotect ("admin") 
            .Save 
            .Protect ("admin") 
        End With 
    'End If 
'Pas besoin de remettre la protection elle est remise ici 
End Sub 
A+
L'expérience instruit plus sûrement que le conseil. (André Gide)
Si tu te cognes à un pot et que ça sonne creux, c'est pas forcément le pot qui est vide. ;-)(Confucius)
0
castet
 
Merci lermit222 pour tes conseils. Je les ai expérimenté : c'est plus clair et plus direct, mais mon problème demeure... lorsque je modifie la plage, au lieu de forcer l'enregistrement, il me demande le code pour autoriser l'enregistrement... (le mot de passe est le meme pour autoriser l'enregistrement et pour protéger la feuille). Je voudrais parvenir, uniquement pour cette plage, à forcer l'enregistrement.

Je joins un exemple en espérant que ce soit relativement clair...
http://www.cijoint.fr/cjlink.php?file=cj201012/cijseD1xTl.xlsm
0
lermite222 Messages postés 8724 Date d'inscription   Statut Contributeur Dernière intervention   1 191
 
Prochaine fois spécifie ta version d'excel, 2007 ou >
Je me demande si ce n'est pas un bug, pas moyen de déprotéger les fenêtres et structures par code.
Pourtant sur l'aide il y a..
expression.Protect(MotDePasse, Structure, Fenêtres)
Mais quand j'applique ça donne une erreur.
Comment tu à fait pour protéger l'enrégistrement ?

0
castet
 
Désolée pour la version, j'ai oublié (c'est bien 2007).
Pour protéger, j'ai mis une macro dans ThisWorkbook (citée plus haut).
Est-il possible d'attribuer automatiquement le code ("admin") dans la variable "a" (définie dans le code pour protéger l'enregistrement) ?

Petite question "bete" semble-t-il : A quoi correspondent la "structure" et les "fenetres" citées dans l'aide ?
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
lermite222 Messages postés 8724 Date d'inscription   Statut Contributeur Dernière intervention   1 191
 
:-D ... pour Petite question "bete" sélectionne Protect et tape F1 (tu doit être connecté)
A part ta macro tu n'a rien fait d'autre pour protéger ?? ça ne me semble pas réaliste, tu a dù faire une autre manip.
L'expérience instruit plus sûrement que le conseil. (André Gide)
Si tu te cognes à un pot et que ça sonne creux, c'est pas forcément le pot qui est vide. ;-)(Confucius)
0
castet
 
Je n'ai pas fait d'autre manip pour protéger l'enregistrement que cette macro...(sinon j'ai protégé la feuille mais ça n'a rien à voir). Pourquoi ce ne serait pas réaliste?

Merci pour l'aide ;)
Je suis débutante sur VBA (ça doit se sentir), et malgré mes essais ce pb me bloque vraiment...
On ne peut pas attribuer une valeur pour la variable "a" (cad celle du mot de passe pour l'enregistrement) pour cette exception à partir de cette macro (feuil3) ?
0
lermite222 Messages postés 8724 Date d'inscription   Statut Contributeur Dernière intervention   1 191
 
Pourquoi ce ne serait pas réaliste?
J'ai beau retourner le problème dans tout les sens je ne trouve pas comment mettre une protection par mot de passe sur l'enrégistrement... et découlant de cela, la possibilité de la supprimer.
Débloque toutes les protections que tu à mis et sauve sous un autre nom (sans mot de passe).. c'est possible ?

Concernant la variable du mot de passe, c'est tout à fait possible à condition de l'initialiser à l'ouverture du classeur, mais je ne vois pas l'intérèt, à moins de la mettre en constante.
0
castet
 
J'ai bloqué l'action "Enregistrer" et non "Enregistrer Sous". On peut donc enregistrer le fichier sous un autre nom. Mais les macro sont enregistrées à leur tour dans ce nouveau fichier, et l'action "Enregistrer" est toujours bloqué. Il faut supprimer la macro du ThisWorkbook pour que l'enregistrement ne soit plus protégé. La macro en question est la suivante :
Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)
' Cette macro permet de bloquer l'enregistrement par un mot de passe.
Dim Password
Password = "admin"
a = InputBox("L'enregistrement de ce document est protégé par mot de passe. Veuillez saisir le mot de passe pour enregistrer ou fermer sans enregistrer :", Password)
If a <> Password Then Cancel = True
End Sub


Je voudrais simplement que pour quelques cellules j'arrive à forcer, à passer outre cette restriction que j'ai mise mais tout en conservant le blocage de l'enregistrement pour le reste.
Je ne sais pas si c'est bien clair ce que je dis?
Je n'ai pas mis de mot de passe lorsqu'on ouvre la fenetre enregistrer sous > option generale > mot de passe pour lecture ou modification...

Mon but est que le fichier soit léger à l'ouverture (donc pas de mot de passe), mais protégé, cad que n'importe qui ne puisse pas enregistrer ses modification (d'où le mot de passe pour enregistrer). Mais je souhaiterais faire une exception pour quelques cellules (qui devront etre saisie par l'utilisateur, et donc qui doivent etre sauvegardées...).

Comment mettre une variable à l'ouverture du classeur ? Il faudrait que lors d'un enregistrement "classique", la valeur de cette variable soit saisie par l'utilisateur, et que lors de cette exception la valeur (mot de passe) soit donné automatiquement.
Est-ce que tu me suis?
0
lermite222 Messages postés 8724 Date d'inscription   Statut Contributeur Dernière intervention   1 191
 
Ouffffti, ça y est, j'ai enfin pigé..!!
Ajoute un module public
Tu déclare
Public Autorize as Boolean

dans le code du classeur tu met..
Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)  
  ' Cette macro permet de bloquer l'enregistrement par un mot de passe.  
  Dim Password  
  Password = "admin"  
  If Not Autorize Then  
    a = InputBox("L'enregistrement de ce document est protégé par mot de passe. Veuillez saisir le mot de passe pour enregistrer ou fermer sans enregistrer :", Password)  
    If a <> Password Then Cancel = True  
  End If  
  Autorize  = False
End Sub


Et quand tu veux passer "au dessus" tu met la variable Autorize = True
Le fichier serra enrégistrer sans demander le mot de passe.
A+

L'expérience instruit plus sûrement que le conseil. (André Gide)
Si tu te cognes à un pot et que ça sonne creux, c'est pas forcément le pot qui est vide. ;-)(Confucius)
0
castet
 
Bonjour,

Je m'excuse d'avoir mis autant de temps pour répondre..
J'ai suivi tes conseils : J'ai créé un module où j'ai déclaré la variable Autorize, ensuite j'ai mis le code que tu m'as proposé (j'ai déclaré "Public Sub" sur la feuill et le This Workbook), et j'ai mis dans le code de la feuil3 :
Public Sub Worksheet_Change(ByVal Target As Range)
If Not Intersect(Target, Range("A2:B10")) Is Nothing Then Autorize = True
End Sub

Mais l'enregistrement est toujours bloqué... Si je mets uniquement :
Public Sub Worksheet_Change(ByVal Target As Range)
Autorize = True
End Sub

Cela ne fonctionne pas plus...
Voilà le fichier:
https://www.cjoint.com/?0mnsCivhQz

Est-ce que j'ai raté quelque chose? Mal compris ?

Merci et A+
0
LauraHolt
 
Bonjour,

Ce code m'intéresse fortement, as tu eu une solution ?
Où doit on placer : "Public Autorize as Boolean" ?

Merci
LH
0
lermite222 Messages postés 8724 Date d'inscription   Statut Contributeur Dernière intervention   1 191
 
Bonjour,
J'ai raté la question de castet
LauraHolt >>
taper Alt+F11 , dans l'éditeur de macros qui s'ouvre >> Insertion >> Module.
C'est dans cette fenêtre qu'il faut mettre Public Autorize as Boolean et y faut pas de guillemet.
Ensuite .. sur la gauche de l'éditeur tu à l'explorateur de projets (si pas présent.. Ctrl+r)
double clic sur ThisWorkbook .. c'est dans cette fenêtre que tu doit coller le code
Private Sub Workbook_BeforeSave....
A+
Si tu te cognes à un pot et que ça sonne creux, c'est pas forcément le pot qui est vide. ;-)(Confucius)
NOTE : Je ne répond pas aux MP pour les questions techniques.
0