J'utilise le code suivant pour verrouiller le contenu de certaines cellules
Sub LockCell(ws As Worksheet, strCellRng As String)
With ws
.Unprotect
.Cells.Locked = False
.Range(strCellRng).Locked = True
.Protect Contents:=True, AllowFormattingCells:=True, AllowFormattingColumns:=True, AllowFormattingRows:=True, AllowInsertingColumns:=True, AllowInsertingRows:=True, AllowSorting:=True, AllowFiltering:=True, AllowUsingPivotTables:=True, DrawingObjects:=True
End With
End Sub
Cela fonctionne bien en verrouillant le contenu de ces colonnes spécifiques. Le problème est que, travaillant sur la feuille de calcul elle-même, les utilisateurs ne peuvent pas trier ni appliquer de bordures aux cellules, car ces éléments de menu Excel sont désactivés. Je pensais que AllowSorting:=True
, AllowFiltering:=True
et DrawingObjects:=True
permettraient cela de la même manière que AllowFormattingColumns:=True
et AllowFormattingRows:=True
permettaient le redimensionnement.
Merci d'avance pour votre aide.
Cordialement, .__ Ronald
Un certain nombre de personnes ont cette difficulté. La réponse prédominante est que vous ne pouvez pas protéger le contenu de l'édition tout en permettant un tri sans entrave. Vos options sont:
1) Autoriser l'édition et le tri :(
2) Appliquez une protection et créez des boutons avec du code à trier à l'aide de VBA. Il y a d'autres posts expliquant comment faire cela. Je pense qu'il existe deux méthodes, soit (1) obtenir le code permettant de déprotéger la feuille, appliquer le tri, puis protéger à nouveau la feuille ou (2) protéger la feuille à l'aide de UserInterfaceOnly:=True
.
3) La réponse de Lorie qui ne permet pas aux utilisateurs de sélectionner des cellules ( https://stackoverflow.com/a/15390698/269953 )
4) Une solution que je n'ai pas vue discuter utilise VBA pour fournir une protection de base. Par exemple, détectez et annulez les modifications à l'aide de Worksheet_Change
. C'est loin d'être une solution idéale cependant.
5) Vous pouvez garder la feuille protégée lorsque l'utilisateur sélectionne les données et non protégée lorsque l'utilisateur a sélectionné l'en-tête. Cela laisse d'innombrables façons pour les utilisateurs de gâcher les données tout en posant certains problèmes d'utilisation, mais au moins, réduit les chances que des collègues gênants fassent des modifications imprudentes.
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
If (Target.row = HEADER_ROW) Then
wsMainTable.Unprotect Password:=PROTECTION_PASSWORD
Else
wsMainTable.Protect Password:=PROTECTION_PASSWORD, UserInterfaceOnly:=True
End If
End Sub
C'était un problème majeur pour moi et j'ai trouvé le lien suivant avec une réponse relativement simple. Merci Voyager !!!
Notez que j'ai nommé la plage que je voulais que les autres puissent trier
http://answers.yahoo.com/question/index?qid=20090419000032AAs5VRR
Je viens de trouver un moyen difficile d'obtenir presque les mêmes fonctionnalités. Au lieu de protéger la feuille normalement, utilisez un gestionnaire d'événements pour annuler tout ce que l'utilisateur essaie de faire.
Ajoutez les éléments suivants au module de la feuille de calcul:
Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Locked = True Then
Application.EnableEvents = False
Application.Undo
Application.EnableEvents = True
End If
End Sub
Si l'utilisateur fait quelque chose pour changer une cellule verrouillée, l'action sera immédiatement annulée. La désactivation temporaire des événements consiste à empêcher le déclenchement de cet événement, ce qui entraîne une boucle infinie.
Le tri et le filtrage ne déclenchent pas l'événement Change. Ces fonctions restent donc activées.
Notez que cette solution empêche de modifier ou d'effacer le contenu des cellules, mais n'empêche pas de changer de format. Un utilisateur déterminé pourrait contourner le problème en définissant simplement les cellules à déverrouiller.
Voici un article qui explique le problème et la solution avec beaucoup plus de détails:
Tri des cellules verrouillées dans des feuilles de calcul protégées
Ce qu'il faut comprendre, c'est que le verrouillage des cellules a pour but d'empêcher leur modification et que le tri modifie en permanence les valeurs des cellules. Vous pouvez écrire une macro, mais une solution bien meilleure consiste à utiliser la fonctionnalité "Autoriser les utilisateurs à modifier des plages". Cela rend les cellules modifiables pour que le tri puisse fonctionner, mais étant donné que les cellules sont toujours verrouillées sur le plan technique, vous pouvez empêcher les utilisateurs de les sélectionner.
La réponse de Lorie est bonne, mais si un utilisateur sélectionne une plage contenant des cellules verrouillées et déverrouillées, les données des cellules verrouillées/protégées peuvent être supprimées.
La réponse d'Isaac est excellente, mais ne fonctionne pas si l'utilisateur met en surbrillance une plage comportant à la fois des cellules verrouillées et déverrouillées.
J'ai légèrement modifié le code d'Isaac pour annuler les modifications si AUCUNE des cellules de la plage cible n'était verrouillée. Il affiche également un message expliquant pourquoi l'action a été annulée. Combiné à la réponse de Lorie, j'ai pu obtenir le résultat souhaité, à savoir trier/filtrer une feuille protégée, tout en permettant à un utilisateur de modifier une cellule non protégée.
Suivez les instructions de la réponse de Lorie, puis insérez le code suivant dans le module de feuille de calcul:
Private Sub Worksheet_Change(ByVal Target As Range)
For Each i In Target
If i.Locked = True Then
Application.EnableEvents = False
Application.Undo
Application.EnableEvents = True
MsgBox "Your action was undone because it made changes to a locked cell.", , "Action Undone"
Exit For
End If
Next i
End Sub
Si le filtrage automatique fait partie d'une opération de sous-programme, vous pouvez utiliser
BioSum.Unprotect "letmein"
'<Your function here>
BioSum.Cells(1, 1).Activate
BioSum.Protect "letmein"
déprotéger momentanément la feuille, filtrer les cellules et reprotéger par la suite.
Je sais que c'est très vieux, mais revient chaque fois que je google ce problème. Vous pouvez déprotéger la plage indiquée dans les cellules ci-dessus, puis ajouter une validation des données aux cellules non protégées afin de référencer quelque chose de scandaleux tel que "423fdgfdsg3254fer". Si les utilisateurs tentent de modifier l'une de ces cellules, ils ne pourront pas, mais vous triez et le filtrage va maintenant fonctionner.