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.
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.