VBA enregistrement protégé & cellule modifié
castet
-
lermite222 Messages postés 8724 Date d'inscription Statut Contributeur Dernière intervention -
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 Subet 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....
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 Subet 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:
- VBA enregistrement protégé & cellule modifié
- Proteger cellule excel - Guide
- Excel compter cellule couleur sans vba - Guide
- Excel cellule couleur si condition texte - Guide
- Enregistrement mp3 gratuit - Télécharger - Streaming audio
- Telecharger studio d'enregistrement rap - Télécharger - Édition & Montage
11 réponses
Bonjour,
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)
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 SubA+
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)
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
Je joins un exemple en espérant que ce soit relativement clair...
http://www.cijoint.fr/cjlink.php?file=cj201012/cijseD1xTl.xlsm
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 ?
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 ?
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 ?
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 ?
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
:-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)
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)
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) ?
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) ?
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.
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.
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?
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?
Ouffffti, ça y est, j'ai enfin pigé..!!
Ajoute un module public
Tu déclare
dans le code du classeur tu met..
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)
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)
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+
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+
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.
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.