Problème macro conditionnelle de vérrouillage

Problème macro conditionnelle de vérrouillage - VB/VBA/VBS - Programmation

Marsh Posté le 13-03-2009 à 11:03:38    

Bonjour,
J'ai commencé à utiliser le vba depuis hier, et j'ai des soucis pour faire fonctionner une macro sousExcel
- Objectif principal:
Verrouiller des colonnes cibles par mot de passe à la fermeture d'un document Excel. (j'y suis parvenu tout va bien :pt1cable: )
 
- Objectif secondaire:
L'activer sous condition :heink:  
 
Module de verrouillage: :pfff:  
Sub FERMETURE_VERROUILLER()
'Sélection de toutes les cellules
    Cells.Select
'Déverrouillage de toutes les cellules
    Selection.Locked = False
    Selection.FormulaHidden = False
'Sélection des colonnes A,B,D,E,F,G,H,I
    Range("A:B,D:I" ).Select
    Range("D1" ).Activate
'Verrouiller le contenu sélectionné
    Selection.Locked = True
    Selection.FormulaHidden = False
'Protéger la feuille active par un mot de passe  
    ActiveSheet.Protect Password:="test :kaola: ", DrawingObjects:=True, Contents:=True, Scenarios:=True
'Sélection de la case A1 avant fermeture (pour ne pas que à l'ouverture les colonnes soient toujours sélectionnées et que ce soit moche)
    Range("A1" ).Select
End Sub :jap:  
 :kaola: ("ne vous inquiéter pas je protègerai le contenu de ma macro donc pas de ricanement en précisant que protéger un contenu en mettant un mot de passe si facilement accessible tu te fatigues pour rien^^" )
 
Modules pour ordonner l'activation de la macro à la fermeture du fichier: :pfff:  
Private Sub Workbook_BeforeClose(Cancel As Boolean)
FERMETURE_VERROUILLER
End Sub :jap:  
 
Donc jusque là tout va bien, j'ai ma macro qui s'active à la fermeture du document me mettant un mot de passe sur la protection des colonnes que je veux protéger... :sol:  
 
Le problème est que si le fichier n'a pas été déverrouillé, j'ai ce message: "impossible de définir la propriété locked de la classe range". En effet le script tente sans utiliser de mot de passe de déverrouiller des cellules.  
(Cf 'Sélection de toutes les cellules
    Cells.Select
'Déverrouillage de toutes les cellules
    Selection.Locked = False
    Selection.FormulaHidden = False)
 
Pour résoudre ce problème j'ai entrepris d'ajouter à mon système un macro conditionnelle pour définir la condition suivante: :sol:  
Si les colonnes sélectionnée sont déjà verrouillées alors
ne pas activer la Macro
sinon activer la Macro
 
En gros j'ai essayer un truc dans le genre mais le résultat est néan :cry: .
Sub FERMETURE_CONDITIONNELLE()
'
' FERMETURE_CONDITIONNELLE Macro
' Macro enregistrée le 13/03/2009
'
 
'Si les colonnes A,B,D,E,F,G,H,I sont verrouillées alors
Range("A:B,D:I" ).Select
If Selection.Locked = True Then
'Exécuter la Macro
FERMETURE_SIMPLE
'Sinon
Else
'Exécuter la Macro
FERMETURE_VERROUILLER
End If
End Sub :cry:  
 
J'ai testé plein d'autre syntaxe :p mais qui ne fonctionne pas. Et étant donné que ma demande est assez spécifique je ne trouve pas d'infos sur les syntaxes de condition à appliquer sur des paramètres (tel que locker ou unlocker), c'est pourquoi je fais appel à vous :bounce: .
 
Donc je formule ma demande clairement: connaissez-vous la syntaxe correcte pour ordonner:
Si les colonnes présélectionnées sont verrouillées alors
activer la Macro1
Sinon
activer la Macro2
 
Je vous remercie d'avance pour les réponses.:hello:


Message édité par eXos'Legend le 16-03-2009 à 13:04:24

---------------
@+
Reply

Marsh Posté le 13-03-2009 à 11:03:38   

Reply

Marsh Posté le 13-03-2009 à 12:03:30    

Quelle est la ligne sur laquelle il y a une erreur ?
 
Peut-être qu'au lieu de

FERMETURE_SIMPLE

il faudrait écrire

Call FERMETURE_SIMPLE

Reply

Marsh Posté le 13-03-2009 à 12:10:38    

La ligne sur laquelle il y a une erreur est celle-ci:
If Selection.Locked = True Then
et plus précisément c'est la syntaxe Selection.locked = true qui n'est pas correcte. Le but est de dire si(if) la selection comporte des cellules verrouillées(selection.locked = true) alors(then), mais ça ne fonctionne pas.

Reply

Marsh Posté le 13-03-2009 à 12:12:17    

Je vais test avec le call, et je te redis on ne sais jamais.

Reply

Marsh Posté le 13-03-2009 à 12:17:19    

Nan même avec le Call ça ne fonctionne pas mieu j'ai les mm symptômes.

Reply

Marsh Posté le 13-03-2009 à 15:11:54    

Bizarre, parce que j'ai essayé chez moi cette ligne, et ça passe sans problème. Le problème est peut-être ailleurs.

Reply

Marsh Posté le 13-03-2009 à 18:17:02    

Bonsoir,
cela fonctionne aussi dans mes essais, mais pourquoi ne mets-tu pas simplement :
ActiveSheet.Unprotect Password:="test  " en tête de ton Sub FERMETURE_VERROUILLER()  
 
ainsi tu peux refaire ta séquence sans pb
Cordialement
?

Reply

Marsh Posté le 16-03-2009 à 08:13:33    

Bonjour à tous.
Désolé de répondre tardivement, week-end oblige. Merci pour vos réponses. Seniorpapou je teste ta suggestion qui paraît d'une logique redoutable. En souhaitant que si la feuille est déjà déverrouillée, qu'un message d'erreur n'apparaisse pas. Et vous tiens au courant dans la matinée.

Reply

Marsh Posté le 16-03-2009 à 08:39:21    

Bonjour,
cela devrait fonctionner, j'avais testé avec plusieurs unprotect sur des lignes successives sans problème.
@+

Reply

Marsh Posté le 16-03-2009 à 09:02:18    

Re! Et bien. Tout fonctionne! Je vous remercie beaucoup, j'ai donc rajouté la formule pour retirer la protection en tête de Sub et j'ai laissé le Call par mesure de précaution, bien qu'il semble que l'appel d'un module par un autre fonctionne sans le Call. Dans tous les cas c'est plus propre.
Donc ainsi pour correctement conclure le post je vous inscrit le contenu final de la macro, qui pourra servir à d'autre personne de mon niveau en VBA, je pense.
 
OBJECTIF DE LA MACRO: A partir d'une macro sous excel (VBA), vérrouiller certaines cellules (plus précisément, certaines colonnes) d'un document par un mot de passe, dans le but de fournir un droit total en modifcation à un groupe d'utilisateur, et poser des restrictions à un autre groupe.
Le groupe qui aura donc besoin des accés à l'intégralité du fichier devra donc disposer du mot de passe.
Le groupe auquel on souhaite poser des restrictions ne devra pas disposer de ce dernier(logique).
 
Script à inscrire dans le Module principale de la feuille (VBAProject => "ThisWorkbook" ):
 
Private Sub Workbook_BeforeClose(Cancel As Boolean)
Call FERMETURE_VERROUILLER
End Sub
----------------------------------------------------
Script à inscrire dans un nouveau module:
 
Sub FERMETURE_VERROUILLER()
'Sélection de toutes les cellules
    Cells.Select
'Suppression de la protection de la feuille
    ActiveSheet.Unprotect Password:="test"
'Déverrouillage de toutes les cellules
    Selection.Locked = False
    Selection.FormulaHidden = False
'Sélection des colonnes A,B,D,E,F,G,H,I que l'on souhaite verrouiller
    Range("A:B,D:I" ).Select
    Range("D1" ).Activate
'Verrouiller le contenu sélectionné
    Selection.Locked = True
    Selection.FormulaHidden = False
'Protéger la feuille active
    ActiveSheet.Protect Password:="test", DrawingObjects:=True, Contents:=True, Scenarios:=True
'Sélection de la case A1 avant fermeture
    Range("A1" ).Select
End Sub
 
Voilà.
Remarque: la macro n'est valide bien entendu qu'à partir du moment ou son script est verrouillé puisqu'il comporte quand même un mot de passe.
Voilà si vous trouvez des améliorations par rapport à cette Macro n'hésitez pas à les soumettre. Si je parviens à l'optimiser je vous le préciserai aussi. Merci encore.


Message édité par eXos'Legend le 16-03-2009 à 14:00:57

---------------
@+
Reply

Marsh Posté le 16-03-2009 à 09:02:18   

Reply

Marsh Posté le 16-03-2009 à 11:17:19    

J'ai de nouveau un souci:
Ma macro prévoit que lors de la fermeture du document, celui-ci verrouille automatiquement des cellules par l'intermédiaire d'un mot de passe, résultat souhaité, donc pas de problème de ce côté.
 
Le problème survient lorsque plusieurs autres fichiers Excel sont ouverts en même temps que celui sus-cité. En effet ma macro a tendance à s'exécuter sur tous les fichiers ouverts quand je ferme Excel.
 
Donc ma question est la suivante: y'aurait-il une solution pour à la fermeture d'excel, appliquer la macro uniquement sur une seule feuille plutôt que sur tous les classeurs ouverts?
 
Je pense que le souci vient du script présent dans le projet au niveau du "ThisWorkbook",  
J'ai testé en déplaçant le script dans un module Feuil1 en l'adaptant:
 
Private Sub Worksheet_BeforeClose (Cancel as Boolean)
Call FERMETURE_VERROUILLER
End Sub
 
Cela ne fonctionne pas.


Message édité par eXos'Legend le 16-03-2009 à 13:58:09

---------------
@+
Reply

Marsh Posté le 16-03-2009 à 18:43:14    

Bonsoir,
étonnant!!
ta macro doit être mal placée, ou bien tu l'as écrite aussi dans l'autre classeur; mais, si tu ne veux pas te compliquer la vie, testes sur : thisworkbook.name
pour exécuter ta macro
Cordialement
 
as-tu commencé par enregistrer une macro et choisi enregistrer la macro pour tous les classeurs ouverts??


Message édité par seniorpapou le 16-03-2009 à 18:53:14
Reply

Marsh Posté le 17-03-2009 à 08:26:14    

Alors, effectivement j'ai commencé par l'enregistreur de macro, mais n'est pas du tout fait attention à l'option "enregistrer la macro pour tous les classeurs ouverts".
 
Donc je vais tester sur Thisworkbook.name.
Et si cela ne fonctionne toujours pas, j'essaierai de la refaire.
Je te rapporte les résultats rapidement.


Message édité par eXos'Legend le 17-03-2009 à 08:26:47

---------------
@+
Reply

Marsh Posté le 17-03-2009 à 09:34:20    

Alors, à priori cela fonctionne. J'ai toujours un doute sur ce que signifiait: "test sur : thisworkbook.name",  
je l'ai compri comme ça: "mets le contenu de ton Sub FERMTURE_VERROUILLER directement dans le Thisworkbook du projet portant le nom de ton fichier que tu veux verrouiller.
 
Ainsi en suivant ton conseil j'obtiens:
 
Private Sub Workbook_BeforeClose(Cancel As Boolean)
'Sélection de toutes les cellules
    Cells.Select
'Suppression de la protection de la feuille
    ActiveSheet.Unprotect Password:="test"
etc...
    ...Sheet.Protect Password:="be", DrawingObjects:=True, Contents:=True, Scenarios:=True
'Sélection de la case A1 avant fermeture
    Range("A1" ).Select
End Sub
 
Ainsi quelque soit les fichiers ouverts et les conditions, seul le fichier comportant la macro se verrouille quand je ferme Excel ce qui était bien mon objectif.
Ma macro était effectivement mal placé. Merci encore! Je pense que sur ce coup là on est bon.
Bon courage et à bientôt.


---------------
@+
Reply

Marsh Posté le 17-03-2009 à 17:09:19    

Bonsoir,
c'est déja beaucoup mieux de mettre le :Private Sub Workbook_BeforeClose(Cancel As Boolean)  
etc.. dans le classeur concerné.....
 
Attention à ton password: il est "test"  ou "be", je pense que c'est simplement une erreur d'écriture de ta part.
cordialement
 

Reply

Marsh Posté le 18-03-2009 à 08:26:23    

Ah pour le password, il est ni l'un ni l'autre. "test" et "be" ne sont que des passwords de test. Le password final sera différent^^.
Merci encore et bonne journée.


---------------
@+
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed