OVH Cloud OVH Cloud

Ajuster une macro

12 réponses
Avatar
Caroline L.
Bonjour à tous !

Au bas, voici une macro sur laquelle je dois faire des petits ajustements
mais je n'y arrive pas. Juste vous dire que le but de celle-ci est qu'à la
fermeture d'un classeur, l'utilisateur est forcer de remettre la protection
sur les feuilles et de protéger le classeur (tout ça avec un mot de passe).
La macro est presque à point, mais : au départ, il n'est pas nécessaire que
la boîte "Ôter la protection du classeur" s'ouvre... il serait bien que
seulement si la protection du classeur n'est pas activé, là d'accord une
boîte "Protéger le classeur" s'ouvre. (en ce moment, le programme demande
toujours d'ôter la protection et de remettre la protection, etc.)
Dernière petite chose, lorsque j'ouvre le classeur, la fenêtre du classeur
ne contient plus les barres de défilement verticales et je ne peux plus
"déplacer" cette fenêtre en "clique-glisse sur le bleu du haut". Pour
résoudre ces 2 problèmes, j'enlève la protection du classeur, et tout se
replace. Bizarre ??

Merci pour votre aide
Caroline



Private Sub Workbook_BeforeClose(Cancel As Boolean)
'remet la protection sur toutes les feuilles et protéger le classeur
On Error Resume Next

ThisWorkbook.Unprotect ""

Do While ThisWorkbook.ProtectStructure = False
MsgBox "Vous devez proteger ce classeur avant fermeture"
Application.CommandBars.FindControl(ID:=894).Execute
ThisWorkbook.Unprotect ""
Loop

Err.Clear

For I = 1 To Sheets.Count
If Sheets(I).ProtectContents = False Then
Sheets(I).Activate
Application.CommandBars.FindControl(ID:=893).Execute
End If
Next

2 réponses

1 2
Avatar
Denis Michon
Bonjour Caroline,

***Voilà ce qu'était ta question :

|Dernière petite question : je cherche à créer la macro suivante :

| Boîte dialogue "Ôter la protection du classeur"
| si le mot de passe est valide la macro se poursuit (j'ai fait le reste)
| sinon, MsgBox "Mot de passe erroné. La gestion des horaires est limité à
| l'administration"

*** Ma réponse est conforme à ta question, c'est-à-dire une boîte de dialogue pour déprotéger la feuille.

*** Je suis d'accord que ce n'est pas une façon acceptable de protéger une feuille de cette façon si tu désires
conserver le contrôle de ton application.... mais cela ne faisait pas parti de la question !

*** Une alternative est d'utiliser la propriété "PassWord" de l'objet "Textbox" qui tu ajoutes à un formulaire
(userform)... et une petite procédure d'un bouton de commande qui teste si oui ou non l'usager à taper le bon mot de
passe.

Tu peux télécharger un exemple à cette adresse. Tu devras modifier légèrement le code pour l'adapter à ton application.
Le formulaire est lancé à partir d'une procédure dans le ThisWorkbook.
http://cjoint.com/?dlfmUzP2EE

Et le mot de passe est "Denis" ... Attention, la procédure est sensible à la casse.


Salutations!







"Caroline L." a écrit dans le message de news: Cl8Yd.6261$
Bonsoir MichDenis,

Merci, mais ce n'est pas vraiment la bonne chose si la programme demande à
protéger la feuille.
Merci à toi et si tu as d'autres idées, n'hésite pas
bonne soirée
Caroline




"MichDenis" a écrit dans le message de news:
#
Bonsoir Caroline,

Tu peux insérer ceci dans ton code....

Si ta feuille est protégée lorsque cette ligne de code s'exécute, tu auras
une boîte de dialogue te demandant de saisir

le mot de passe pour déprotéger la feuille active. Cependant, si la
feuille n'est pas protégée, ce sera une fenêtre qui

s'affichera pour protéger la feuille.

'--------------------
If Application.Dialogs(xlDialogProtectDocument).Show = False Then
Exit Sub
End If
'--------------------


Salutations!



"Caroline L." a écrit dans le message de news:
Ch5Yd.45289$

D'accord, merci.
Là j'ai compris. Tu sais, je ne suis encore qu'à mes débuts en VBA, le
vocabulaire n'est pas toujours évident à saisir. Merci pour ta patience et
explications.
Dernière petite question : je cherche à créer la macro suivante :

Boîte dialogue "Ôter la protection du classeur"
si le mot de passe est valide la macro se poursuit (j'ai fait le reste)
sinon, MsgBox "Mot de passe erroné. La gestion des horaires est limité à
l'administration"

merci encore
Caroline

"anonymousA" a écrit dans le message de news:
4230c8f9$0$3124$
non, Caroline ca n'a pas exactement à voir avec l'obligation de saisir
le mdp .
EnablecancelKey=xldisabled veut dire que si l'utilisateur clique sur ESC
ou sur Ctrl+Pause pendant que la macro est exécutée ,celle-ci ne
s'interrompt pas.
En conséquence, même s'il ne veut pas saisir de mdp , il ne peut pas
faire planter la macro et fermer le fichier en l'état.Donc il est
contraint à laisser la macro se dérouler et par voie de conséquence à
lui reproposer la boite de dialogue mdp du classeur puis ensuite celle
des feuilles jusqu'à ce que , de guerre lasse, il finisse enfin par
saisir un mdp valide de classeur puis un mdp pour les feuilles.
Je me répète depuis 3 POSTS : ce qui oblige l'utilsateur à saisir un mdp
valide (c.à.d non vide)pour le classeur c'est Thisworkbook.unprotect ""
et la boucle Do while Thisworkbook.protectcontentsúlse.

A+


Re-bonjour Anonymous,

J'ai ajouté ce que tu suggères ci-bas... cela semble éviter que
l'utilisateur n'entre aucun mot de passe, donc le mdp n'est plus
facultatif


mais obligatoire, est-ce que je comprends bien ??

Enfin, pour éviter eventuellement que l'utilisateur ne puisse fermer
le




classeur, il faudrait rajouter un
Application.EnableCancelKey=xlDisabled





en

début de macro et un Application.EnableCancelKey =xlInterrupt à la fin


mais

c'est à manier avec précaution




"anonymousA" a écrit dans le
message


de news:

bonjour,

pour la 1ere question, le Thisworkbook.unprotect "" est là pour tester
si




le

classeur n'a pas été protégé par un chaine vide,ce qui rendrait de
facto





la

protection bien faible et le on error qui précede est la pour éviter
dans




ce

test que si jamais il y a déjà une protection de classeur , le
programme





ne

se plante.
Ensuite il est à nouveau répété dans la procédure pour les mêmes
raisons.




Par ailleurs, le programme d'envoi automatique de la fenêtre de
dialogue





de

la protcetion du classeur ,une fois son 1er test
Thisworkbook.unprotect




""
réalisé, ne se déclenche QUE si vraiment il n'y a pas de protection de
classeur. Je viens de refaire l'essai.

Enfin, pour éviter eventuellement que l'utilisateur ne puisse fermer
le




classeur, il faudrait rajouter un
Application.EnableCancelKey=xlDisabled





en

début de macro et un Application.EnableCancelKey =xlInterrupt à la fin


mais

c'est à manier avec précaution.

Pour la 2eme question , je ne vois pas, enableselections ou scrollarea
peut-être.

A+



Bonjour à tous !

Au bas, voici une macro sur laquelle je dois faire des petits



ajustements

mais je n'y arrive pas. Juste vous dire que le but de celle-ci est
qu'à






la

fermeture d'un classeur, l'utilisateur est forcer de remettre la



protection

sur les feuilles et de protéger le classeur (tout ça avec un mot de



passe).

La macro est presque à point, mais : au départ, il n'est pas
nécessaire






que

la boîte "Ôter la protection du classeur" s'ouvre... il serait bien
que





seulement si la protection du classeur n'est pas activé, là d'accord
une




boîte "Protéger le classeur" s'ouvre. (en ce moment, le programme



demande

toujours d'ôter la protection et de remettre la protection, etc.)
Dernière petite chose, lorsque j'ouvre le classeur, la fenêtre du



classeur

ne contient plus les barres de défilement verticales et je ne peux
plus





"déplacer" cette fenêtre en "clique-glisse sur le bleu du haut". Pour
résoudre ces 2 problèmes, j'enlève la protection du classeur, et tout
se




replace. Bizarre ??

Merci pour votre aide
Caroline



Private Sub Workbook_BeforeClose(Cancel As Boolean)
'remet la protection sur toutes les feuilles et protéger le classeur
On Error Resume Next

ThisWorkbook.Unprotect ""

Do While ThisWorkbook.ProtectStructure = False
MsgBox "Vous devez proteger ce classeur avant fermeture"
Application.CommandBars.FindControl(ID:‰4).Execute
ThisWorkbook.Unprotect ""
Loop

Err.Clear

For I = 1 To Sheets.Count
If Sheets(I).ProtectContents = False Then
Sheets(I).Activate
Application.CommandBars.FindControl(ID:‰3).Execute
End If
Next



















Avatar
Oliv'
Bonjour,
Voici un bien meilleur code qui répond mieux à la demande de caroline :
Private Sub Workbook_BeforeClose(Cancel As Boolean)
'remet la protection sur toutes les feuilles et protéger le classeur
'On Error Resume Next
For I = 1 To Sheets.Count
toto = Sheets(I).ProtectContents
Do While Sheets(I).ProtectContents = False

Sheets(I).Activate
nom = ActiveSheet.Name
MsgBox "Vous devez proteger cette feuille avant fermeture AVEC UN MOT
DE PASSE : " & nom
Application.CommandBars.FindControl(ID:‰3).Execute
On Error Resume Next
ActiveSheet.Unprotect ""
On Error GoTo 0
Loop
Next
'ThisWorkbook.Unprotect ""

Do While ThisWorkbook.ProtectStructure = False
MsgBox "Vous devez proteger ce classeur avant fermeture AVEC UN MOT DE
PASSE"
Application.CommandBars.FindControl(ID:‰4).Execute
On Error Resume Next
ThisWorkbook.Unprotect ""
On Error GoTo 0
Loop

Err.Clear

End Sub
Oliv'
"anonymousA" a écrit dans le message de news:
4230a448$0$19343$
bonjour,

si tu supprimes le thisworkbook.unprotect "" , comment geres-tu le fait
que la chaine vide ait pu être choisie par l'utilisateur comme mdp, ce
qui , reconnaissons le , est quand même plus que faiblard comme protection.
De +, quel est l'interet de la variable toto qui recoit d'ailleurs false
ou true ?


A+

Bonsoir,
Essaye ce code
Private Sub Workbook_BeforeClose(Cancel As Boolean)
'remet la protection sur toutes les feuilles et protéger le classeur
'On Error Resume Next
For I = 1 To Sheets.Count
toto = Sheets(I).ProtectContents
Do While Sheets(I).ProtectContents = False

Sheets(I).Activate
nom = ActiveSheet.Name
MsgBox "Vous devez proteger cette feuille avant fermeture" & nom
Application.CommandBars.FindControl(ID:‰3).Execute
Loop
Next
'ThisWorkbook.Unprotect ""

Do While ThisWorkbook.ProtectStructure = False
MsgBox "Vous devez proteger ce classeur avant fermeture"
Application.CommandBars.FindControl(ID:‰4).Execute
'ThisWorkbook.Unprotect ""
Loop

Err.Clear

End Sub

2) le classeur est figé car protégé.

Pourquoi ne protège tu pas toi même les feuilles avec ta macro ?
les utilisateurs doivent t'ils saisir un mot de passe ?

Oliv'

"Caroline L." a écrit dans le message de news:
xx_Xd.22260$
Bonjour à tous !

Au bas, voici une macro sur laquelle je dois faire des petits ajustements
mais je n'y arrive pas. Juste vous dire que le but de celle-ci est qu'à la
fermeture d'un classeur, l'utilisateur est forcer de remettre la
protection
sur les feuilles et de protéger le classeur (tout ça avec un mot de
passe).
La macro est presque à point, mais : au départ, il n'est pas nécessaire
que
la boîte "Ôter la protection du classeur" s'ouvre... il serait bien que
seulement si la protection du classeur n'est pas activé, là d'accord une
boîte "Protéger le classeur" s'ouvre. (en ce moment, le programme demande
toujours d'ôter la protection et de remettre la protection, etc.)
Dernière petite chose, lorsque j'ouvre le classeur, la fenêtre du classeur
ne contient plus les barres de défilement verticales et je ne peux plus
"déplacer" cette fenêtre en "clique-glisse sur le bleu du haut". Pour
résoudre ces 2 problèmes, j'enlève la protection du classeur, et tout se
replace. Bizarre ??

Merci pour votre aide
Caroline



Private Sub Workbook_BeforeClose(Cancel As Boolean)
'remet la protection sur toutes les feuilles et protéger le classeur
On Error Resume Next

ThisWorkbook.Unprotect ""

Do While ThisWorkbook.ProtectStructure = False
MsgBox "Vous devez proteger ce classeur avant fermeture"
Application.CommandBars.FindControl(ID:‰4).Execute
ThisWorkbook.Unprotect ""
Loop

Err.Clear

For I = 1 To Sheets.Count
If Sheets(I).ProtectContents = False Then
Sheets(I).Activate
Application.CommandBars.FindControl(ID:‰3).Execute
End If
Next





1 2