Protection avec condition

  • Initiateur de la discussion Initiateur de la discussion Cobbalt
  • Date de début Date de début

Boostez vos compétences Excel avec notre communauté !

Rejoignez Excel Downloads, le rendez-vous des passionnés où l'entraide fait la force. Apprenez, échangez, progressez – et tout ça gratuitement ! 👉 Inscrivez-vous maintenant !

C

Cobbalt

Guest
Bonjour,

Je suis face à un petit problème sur mon fichier, je vous l'explique de cette façon :

A l'ouverture du fichier
SI cellule C45 de la feuille 1 est vide
ALORS protection de toutes les feuilles du fichier, en laissant certaines cellules modifiables (je les ai déjà déterminées)
SINON
SI cellule C45 de la feuille 1 non vide
ALORS protection de toutes les feuilles du fichier, mais aucune cellule ne peut être modifiée. (cependant les boutons qui contiennent des macros comme : "Imprimer la feuille" doivent être disponible...)
FIN SI

Voila je sais le faire comme ca, mais pas en langage de programmation 🙁

J'ai seulement réussi à faire ce bout de code
Code:
Private Sub Workbook_Open()
For Each sh In Sheets
    sh.Protect "toto"
Next
End Sub

Merci pour votre aide

Cordialement.

Damien
 
Re : Protection avec condition

Bonjour,
Il y a deux besoins dans ta demande
1- Pour que la protection s'applique à l'usager et pas aux macros (pouvoir utiliser les boutons), il faut utiliser
Code:
sh.Protect "toto" UserInterfaceOnly:=True
2- Pour que certaines cellules soient parfois modifiables ou non, il faut modifier leurs propriétés
on peut utiliser Union(range1, range2...) pour définir CellulesVariables
Code:
Modifiable = False
If Range("C45") = "" Then Modifiable = True
For Each c In CellulesVariables
    c.Locked = Modifiable
Next c
Ta macro est effectivement à écrire dans Private Sub Workbook_Open() que tu places dans ThisWorkbook.
Par sécurité (ouverture avec macros désactivées) il faut aussi tout verrouiller à la fermeture Private Sub Workbook_Close()

N'hésite pas à demander si tu as besoin d'explications plus détaillées.
A+
 
Re : Protection avec condition

Merci pour vos messages.

J'ai donc essayé de compléter ma macro avec vos messages
Code:
Private Sub Workbook_Open()
For Each sh In Sheets
    sh.Protect "toto" 'UserInterfaceOnly:=True'
    Modifiable = False
If Range("C45") = "" Then Modifiable = True
For Each c In CellulesVariables
    c.Locked = Modifiable
Next
End Sub


Private Sub Workbook_Close()
For Each sh In Sheets
    sh.Protect "toto"
End Sub

Mais à l'ouverture du fichier j'ai le message d'erreur suivant :
<< Erreur de compilation dans le module caché :This Workbook
Cette erreur se produit généralement lorsque le code est incompatible avec la version, plateforme ou architecture de cette application.
Pour plus d'info blablabla.. >>
et le fichier n'est plus du tout protégé..

Quelqu'un peut m'éclairer où je me suis foiré ? :$
 
Re : Protection avec condition

Bonjour,
Tu avais dit que tu avais déterminé les cellules modifiables, il faut que tu les définisses dans "CellulesVariables"
VB:
Private Sub Workbook_Open()
    For Each sh In Sheets
        sh.Protect Password:="toto", UserInterfaceOnly:=True
    Next sh

    Set CellulesVariables = Union( range1, range2 ...) A RENSEIGNER
    Verrouille = True
    If Feuil1.Range("C45") = "" Then Verrouille = False
    For Each c In CellulesVariables
        c.Locked = Verrouille
    Next c
End Sub

Private Sub Workbook_Close()
    CellulesVariables = Union( range1, range2 ...) A RENSEIGNER
    For Each c In CellulesVariables
        c.Locked = True
    Next c
End Sub
en relisant je me suis aperçu que j'avais interverti cellules verrouillées ou non
A+
 
Dernière édition:
Re : Protection avec condition

Re-bonjour,

Voici le code que j'ai fais:

Code:
Private Sub Workbook_Open()
    For Each sh In Sheets
        sh.Protect Password:="toto", UserInterfaceOnly:=True
    Next sh

    CellulesVariables = Union(Range("e2"), Range("g2"), Range("b4"), Range("c10"), Range("c11"), Range("c12"), Range("c13"), Range("c14"), Range("c15"), Range("c16"), Range("c17"), Range("c18"), Range("c19"), Range("b22"), Range("b23"), Range("b24"), Range("b25"), Range("b26"), Range("b27"), Range("b28"), Range("e22:h22"), Range("g35:h40"), Range("c44"), Range("f44"), Range("b51"))
    
    Verrouille = True
    If Feuil1.Range("C45") = "" Then Verrouille = False
    For Each c In CellulesVariables
        c.Locked = Verrouille
    Next c
End Sub

Private Sub Workbook_Close()
    CellulesVariables = Union(Range("e2"), Range("g2"), Range("b4"), Range("c10"), Range("c11"), Range("c12"), Range("c13"), Range("c14"), Range("c15"), Range("c16"), Range("c17"), Range("c18"), Range("c19"), Range("b22"), Range("b23"), Range("b24"), Range("b25"), Range("b26"), Range("b27"), Range("b28"), Range("e22:h22"), Range("g35:h40"), Range("c44"), Range("f44"), Range("b51"))
    For Each c In CellulesVariables
        c.Locked = True
    Next c
End Sub

Mais j'ai le message d'erreur suivant :
<<Erreur d'exécution '13':
Incompatibilité de type>>
🙁

Du coup même lorsque la cellule C45 est remplie, les cellule "déclarées" sont toujours modifiables..

Merci de vos éclaircissements..
 
Re : Protection avec condition

Bonjour,

il est préférable de déclarer les variables...


Code:
Dim CellulesVariables As Range
Set CellulesVariables = Union(Range("e2"), Range("g2"), Range("b4"), Range("c10"), Range("c11"), Range("c12"), Range("c13"), Range("c14"), Range("c15"), Range("c16"), Range("c17"), Range("c18"), Range("c19"), Range("b22"), Range("b23"), Range("b24"), Range("b25"), Range("b26"), Range("b27"), Range("b28"), Range("e22:h22"), Range("g35:h40"), Range("c44"), Range("f44"), Range("b51"))

d'autre part, pour initialiser une variable objet, il faut faire précéder du mot "set"

bon après midi
@+
 
Re : Protection avec condition

Code:
Private Sub Workbook_Open()
    For Each sh In Sheets
        sh.Protect Password:="toto", UserInterfaceOnly:=True
    Next sh
    
Dim CellulesVariables As Range
Set CellulesVariables = Union(Range("e2"), Range("g2"), Range("b4"), Range("c10"), Range("c11"), Range("c12"), Range("c13"), Range("c14"), Range("c15"), Range("c16"), Range("c17"), Range("c18"), Range("c19"), Range("b22"), Range("b23"), Range("b24"), Range("b25"), Range("b26"), Range("b27"), Range("b28"), Range("e22:h22"), Range("g35:h40"), Range("c44"), Range("f44"), Range("b51"))
    
    Verrouille = True
    If Feuil1.Range("C45") = "" Then Verrouille = False
    For Each c In CellulesVariables
        c.Locked = Verrouille
    Next c
End Sub

Comme ca ? parce que la j'ai erreur d'exécution 1004.. 😕
 
Re : Protection avec condition

Re,

code avec cellules fusionnées :
Code:
Private Sub Workbook_Open()
Dim CellulesVariables As Range, c As Range, Verrouille As Boolean, sh As Object
For Each sh In Sheets
    sh.Protect Password:="toto", UserInterfaceOnly:=True
Next sh
Set CellulesVariables = Union(Range("e2"), Range("g2"), Range("b4"), Range("c10"), Range("c11"), Range("c12"), Range("c13"), Range("c14"), Range("c15"), Range("c16"), Range("c17"), Range("c18"), Range("c19"), Range("b22"), Range("b23"), Range("b24"), Range("b25"), Range("b26"), Range("b27"), Range("b28"), Range("e22:h22"), Range("g35:h40"), Range("c44"), Range("f44"), Range("b51"))
Verrouille = True
If Feuil1.Range("C45") = "" Then Verrouille = False
    For Each c In CellulesVariables
        If c.MergeCells Then c.MergeArea.Locked = Verrouille Else c.Locked = Verrouille
    Next c
End Sub
 
- Navigue sans publicité
- Accède à Cléa, notre assistante IA experte Excel... et pas que...
- Profite de fonctionnalités exclusives
Ton soutien permet à Excel Downloads de rester 100% gratuit et de continuer à rassembler les passionnés d'Excel.
Je deviens Supporter XLD
Assurez vous de marquer un message comme solution pour une meilleure transparence.

Discussions similaires

Retour