web-dev-qa-db-fra.com

VBA Excel - Comment verrouiller des cellules spécifiques tout en permettant le filtrage et le tri

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

13
Ronald Valdivia

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
9
WoodenKitty

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

  • Débloquer la feuille de travail
  • Allez dans "Protection" --- "Autoriser les utilisateurs à modifier des plages" (si Excel 2007, onglet "Révision")
  • Ajouter "Nouvelle" gamme
  • Sélectionnez la plage que vous souhaitez autoriser les utilisateurs à trier
  • Cliquez sur "Protéger la feuille"
  • Cette fois, * ne pas autoriser les utilisateurs à sélectionner "cellules verrouillées" **
  • D'accord

http://answers.yahoo.com/question/index?qid=20090419000032AAs5VRR

6
Lorie Darlin

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.

3
Isaac Moses

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.

1
Aviva M.

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
1
Wisecompany

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.

0
Mike

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.

0
Hank