Déverrouillage plage VBA

Bonjour a tous

J'aurais besoin de votre expertise concernant ce point assez particulier (car je n'ai pas trouver de solution adéquate dans plusieurs forum).

Je finalise actuellement un tableau de bord (partagé). A l'ouverture du fichier, j'ai insérer un code qui cache certaines cellules, puis demande un mot passe. A la saisie du mot de passe d'un utilisateur spécifique, les plages de cellules qui le concerne s'affiche.

Parallèlement l'utilisateur n'a le droit de modifier que la(les) plages de cellules qui le concerne seulement [X-ligne5 --> X-Ligne 1000] (via permettre la modification des plages).

Jusqu’à la tout marche convenablement, sauf que l’utilisateur doit insérer le même mot de passe en deux fois:

1: pour afficher les cellules cache.

2: pour déverrouillage la plage lors de l'insertion des données.

Ma question est: peut on combinée l'affichage et le déverrouillage dans un même code, les solutions que j'ai tester retourne toujours des erreurs de compilation ? Merci pour votre collaboration d'avance.

Private Sub Workbook_Open()

Columns("Q:AC").EntireColumn.Hidden = True
Columns("AD:BN").EntireColumn.Hidden = True
Columns("HR:HS").EntireColumn.Hidden = True
Columns("BO:DL").EntireColumn.Hidden = True
Columns("HT:HU").EntireColumn.Hidden = True
Columns("DM:FJ").EntireColumn.Hidden = True
Columns("HV:HW").EntireColumn.Hidden = True
Columns("IR:JA").EntireColumn.Hidden = True
Columns("JB:JF").EntireColumn.Hidden = True

Dim mot_de_passe As String
mot_de_passe = InputBox("INSERER LE MOT DE PASSE")

If mot_de_passe = "NTO1533" Then
Columns("Q:AC").EntireColumn.Hidden = False
ActiveSheet.Unprotect Password:="NTO1533"
Columns("Q5:AC1000").Select
Selection.unlocked

End If

End Sub

Cordialement

Salut,

Essaye de remplacer :

ActiveSheet.Unprotect Password:="NTO1533"
Columns("Q5:AC1000").Select
Selection.unlocked

par :

Range("Q5:AC1000").Locked = False

Ainsi tu enlève juste la protection sur la plage indiquée et non sur toute la feuille

Girodo,

Salut,

Essaye de remplacer :

ActiveSheet.Unprotect Password:="NTO1533"
Columns("Q5:AC1000").Select
Selection.unlocked

par :

Range("Q5:AC1000").Locked = False

Ainsi tu enlève juste la protection sur la plage indiquée et non sur toute la feuille

Girodo,

Merci Girodo pour cette réflexion, j’étais entrain de la tester et je me suis rendu compte que ma logique étais à côté de la plaque:

En faite j'ai fais l'erreur de protéger la feuille sur l'interface excel et permettre la modification des plages, puis j’essayais de la déverrouiller en VBA.

Cette approche retourne des erreur de type [erreur d'exécution 1004 impossible de définir la propriété hidden de la lasse range], puisque j'ai protégé la feuille contre (afficher/masquer les colonnes) et on décochant format des cellules lors de la protection cette dernière engendra une faille de sécurité permettant a l'utilisateur de démasquer les colonnes manuellement.

La solution idéale c'est de protéger la feuille en VBA et déverrouiller les plages de chaque utilisateur séparément, a condition d'activer et de désactiver la protection de la feuille a chaque opération:

Private Sub Workbook_Open()

ActiveSheet.Unprotect
Columns("Q:AC").EntireColumn.Hidden = True
Columns("AD:BN").EntireColumn.Hidden = True
Columns("HR:HS").EntireColumn.Hidden = True
Columns("BO:DL").EntireColumn.Hidden = True
Columns("HT:HU").EntireColumn.Hidden = True
Columns("DM:FJ").EntireColumn.Hidden = True
Columns("HV:HW").EntireColumn.Hidden = True
Columns("IR:JA").EntireColumn.Hidden = True
Columns("JB:JF").EntireColumn.Hidden = True

ActiveSheet.Protect

Dim mot_de_passe As String
mot_de_passe = InputBox("INSERER LE MOT DE PASSE")

If mot_de_passe = "NTO1533" Then

ActiveSheet.Unprotect

Columns("Q:AC").EntireColumn.Hidden = False
Range("Q5:AC1000").Locked = False

ActiveSheet.Protect

Donc plus besoin d'avoir a taper les deux mot de passe maintenant. Merci quand même.

mdp mdp2

LOL, apparemment j'ai parler trop vite. je crois avoir tout vérifier mais un truc étrange se passe:

Lorsque un utilisateur (A) rentre le mot passe "NTG1035" les colonnes appropriées s'affiche mais la plage ("JJ5:JJ1000") se déverrouille aussi (en apparence).

Même chose pour l'utilisateur (b) qui rentre le mot de passe "NTO1533" les colonnes appropriées s'affiche mais la plage ("Q5:AC1000") se déverrouille aussi (en apparence).

En allouant de mettre un mot de passe vide, je me suis aperçu que les cellules se déverrouille quel que soit le mot de passe insérer et même sans mot de passe. on dirais que le code [Range("Q5:AC1000").Locked = False] ignore les condidition de la commande IF.

Vos suggestions me seront d'une grande aide. Merci.

Private Sub Workbook_Open()

ActiveSheet.Unprotect "Delta!7604@"

Columns("Q:AC").EntireColumn.Hidden = True
Columns("AD:BN").EntireColumn.Hidden = True
Columns("HR:HS").EntireColumn.Hidden = True
Columns("BO:DL").EntireColumn.Hidden = True
Columns("HT:HU").EntireColumn.Hidden = True
Columns("DM:FJ").EntireColumn.Hidden = True
Columns("HV:HW").EntireColumn.Hidden = True
Columns("IR:JA").EntireColumn.Hidden = True
Columns("JB:JF").EntireColumn.Hidden = True

ActiveSheet.Protect "Delta!7604@"

MDP:

Dim mot_de_passe As String
mot_de_passe = InputBox("INSERER LE MOT DE PASSE")

If mot_de_passe = "NTG1035" Then

ActiveSheet.Unprotect "Delta!7604@"

Columns("Q:AC").EntireColumn.Hidden = False
Columns("AD:BN").EntireColumn.Hidden = False
Columns("HR:HS").EntireColumn.Hidden = False
Columns("BO:DL").EntireColumn.Hidden = False
Columns("HT:HU").EntireColumn.Hidden = False
Columns("DM:FJ").EntireColumn.Hidden = False
Columns("HV:HW").EntireColumn.Hidden = False
Columns("IR:JA").EntireColumn.Hidden = False
Columns("JB:JF").EntireColumn.Hidden = False
Range("JJ5:JJ1000").Locked = False

ActiveSheet.Protect "Delta!7604@"

GoTo DONE

End If

If mot_de_passe = "NTA5653" Then
'Columns("Q:AC").EntireColumn.Hidden = False
Columns("AD:BN").EntireColumn.Hidden = False
Columns("HR:HS").EntireColumn.Hidden = False
Columns("BO:DL").EntireColumn.Hidden = False
Columns("HT:HU").EntireColumn.Hidden = False
Columns("DM:FJ").EntireColumn.Hidden = False
Columns("HV:HW").EntireColumn.Hidden = False
Columns("IR:JA").EntireColumn.Hidden = False
Columns("JB:JF").EntireColumn.Hidden = False

End If

If mot_de_passe = "NTX4583" Then

Columns("AD:BN").EntireColumn.Hidden = False
Columns("HR:HS").EntireColumn.Hidden = False

End If

If mot_de_passe = "NTX3598" Then

Columns("BO:DL").EntireColumn.Hidden = False
Columns("HT:HU").EntireColumn.Hidden = False

End If

If mot_de_passe = "NTX1458" Then

Columns("DM:FJ").EntireColumn.Hidden = False
Columns("HV:HW").EntireColumn.Hidden = False

End If

If mot_de_passe = "NTH2269" Then
Columns("IR:JA").EntireColumn.Hidden = False

End If

If mot_de_passe = "NTO1533" Then

ActiveSheet.Unprotect "Delta!7604@"
Columns("Q:AC").EntireColumn.Hidden = False
Range("Q5:AC1000").Locked = False
ActiveSheet.Protect "Delta!7604@"
GoTo DONE

End If

'If mot_de_passe = "" Then GoTo MDP

DONE:
End Sub

Affaire classé, je laisse la solution ou cas ou quelqu'un aurais besoin de le savoir:

Il faudrait verrouiller les cellules concernées indépendamment du verrouillage de la feuille, n'oublier pas de supprimer les restriction au niveau de l'interface ("Permettre la modification des plages").

Maintenant il me reste plus qu'un léger problème : une exception lorsque le mot de passe est incorrect, vos suggestion sont toujours les bienvenus.

rivate Sub Workbook_Open()

ActiveSheet.Unprotect "Delta!7604@"

Range("Q:AC,AD:BN,HR:HS,BO:DL,HT:HU,DM:FJ,HV:HW,IR:JA,JB:JF").EntireColumn.Hidden = True
Range("C5:C1000,D5:G1000,I5:I1000,K5:L1000,N5:P1000,GX5:GY1000,HY5:HZ1000").Locked = True
Range("JJ5:JJ1000").Locked = True
Range("Q5:AC1000").Locked = True

ActiveSheet.Protect "Delta!7604@"

MDP:

Dim mot_de_passe As String
mot_de_passe = InputBox("INSERER LE MOT DE PASSE")

If mot_de_passe = "NTG1035" Then

ActiveSheet.Unprotect "Delta!7604@"

Range("Q:AC,AD:BN,HR:HS,BO:DL,HT:HU,DM:FJ,HV:HW,IR:JA,JB:JF").EntireColumn.Hidden = False
Range("JJ5:JJ1000").Locked = False

ActiveSheet.Protect "Delta!7604@"

GoTo DONE

End If

If mot_de_passe = "NTA5653" Then

ActiveSheet.Unprotect "Delta!7604@"
Range("Q:AC,AD:BN,HR:HS,BO:DL,HT:HU,DM:FJ,HV:HW,JB:JF").EntireColumn.Hidden = False
Range("C5:C1000,D5:G1000,I5:I1000,K5:L1000,N5:P1000,GX5:GY1000,HY5:HZ1000").Locked = False
ActiveSheet.Protect "Delta!7604@"

End If

If mot_de_passe = "NTX4583" Then

Columns("AD:BN").EntireColumn.Hidden = False
Columns("HR:HS").EntireColumn.Hidden = False

End If

If mot_de_passe = "NTX3598" Then

Columns("BO:DL").EntireColumn.Hidden = False
Columns("HT:HU").EntireColumn.Hidden = False

End If

If mot_de_passe = "NTX1458" Then

Columns("DM:FJ").EntireColumn.Hidden = False
Columns("HV:HW").EntireColumn.Hidden = False

End If

If mot_de_passe = "NTH2269" Then
Columns("IR:JA").EntireColumn.Hidden = False

End If

If mot_de_passe = "NTO1533" Then

ActiveSheet.Unprotect "Delta!7604@"
Columns("Q:AC").EntireColumn.Hidden = False
Range("Q5:AC1000").Locked = False
ActiveSheet.Protect "Delta!7604@"
GoTo DONE

End If

'If mot_de_passe = "" Then GoTo MDP

DONE:
End Sub

Bonjour,

le début me gêne un peu :

Private Sub Workbook_Open()
ActiveSheet.Unprotect

Comment es-tu sûr à 100% que c'est la bonne feuille active à l'ouverture ?

eric

Bonjour,

le début me gêne un peu :

Private Sub Workbook_Open()
ActiveSheet.Unprotect

Comment es-tu sûr à 100% que c'est la bonne feuille active à l'ouverture ?

eric

Bonsoir Eric

Ta raison, normalement je dois spécifier le nom de la feuille mais puisque tout les autres onglets sont caché, tous les utilisateurs vont travailler sur la seule feuille active.

cordialement.

Rechercher des sujets similaires à "deverrouillage plage vba"