XL 2016 Utiliser la fonction de Tri en mode Protect

Laurent97310

XLDnaute Nouveau
Bonjour,

Je cherche une solution pour pouvoir protéger une feuille, tout en pouvant utiliser les fonctions de Tri.
Lorsque je protège ma feuille et que je clique sur Tri et Filtre, seul le filtre et encore possible. Si j'essaie de trier les données, Excel me dit que les celulles sont protégées. Pour pouvoir trier, il faut rajouter une plage dans "Permettre la modification des plages" mais l'utilisateur peut du coup écrire dans les cellules.
Existe t'il une solution pour autoriser le tri en mode Protect, tout en protégeant les cellules contre l'écriture?

J'ai passé plusieurs heures à chercher sur les différents forums anglais ou français mais sans succès.

Merci d'avance,
 

youky(BJ)

XLDnaute Barbatruc
Bonjour Laurent,
Tu as été voir ici en protégeant c'est tout en bas
1620376089921.png

Bruno
 

Fred0o

XLDnaute Barbatruc
Bonjour Laurent97310, youky(BJ)

Pour que le tri fonctionne sur un classeur protégé, il te faut déverrouiller les cellules que tu veux trier, dans "Clic-droit, Format Cellule, Protection..."
 

Pièces jointes

  • Fltre_Protege.xlsx
    11 KB · Affichages: 7

Columbo

XLDnaute Nouveau
Bonjour à tous,
Par défaut les cellules sont verrouillées.

1620726912423.png

Lorsqu'on active la protection de la feuille en passant par Révision, même si le tri est sélectionné,
1620727028882.png

il est impossible de trier les données
1620727080712.png

En faisant la technique de Fred0o, cela fonctionne mais les données peuvent-être modifiées.

J'ai cherché sur un autre forum, certains ont proposé un code VBA à mettre dans le private module de la feuille de manière à double cliquer sur une des cellules pour que le tableau se trie automatiquement.
Voici le code mais ça ne fonctionne pas chez moi:

Option Explicit
Private Const MDP As String = "MDP"

Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
Dim SortAddress As String
With ActiveSheet
.Unprotect MDP
If Intersect(ActiveCell, Range("A1").CurrentRegion) Is Nothing Then Exit Sub
SortAddress = ActiveCell.Address(0, 0)
.Range("A1").CurrentRegion.Sort Key1:=Range(SortAddress), Order1:=xlAscending, Header:=xlYes
.Protect MDP
End With
Cancel = True
End Sub

source : https://www.excel-downloads.com/thr...ter-la-protection-de-la-feuille-excel.120705/
 

Laurent97310

XLDnaute Nouveau
Finalement, j'ai fait un peu ce que Columbo propose mais manuellement. Il suffit de sélectionner la colonne à trier puis de cliquer sur la macro pour que ça trie. Le code est surement pas propre mais ça fonctionne quelque soit la page sur mon projet:

VB:
Static Sub TriColonne()
Dim sens As Boolean
Dim wrksht As Worksheet
Dim oListObj As ListObject

Application.ScreenUpdating = False
Call ProtectSoloOFF 'Unprotect

Feuille = ActiveSheet.Name
Set wrksht = ActiveWorkbook.Worksheets(Feuille)
Set oListObj = wrksht.ListObjects(1)
Tableau = oListObj.Name

Columnadress = ActiveCell.Column

Var = Cells(10, Columnadress) 'Mon tableau commence à la ligne 10

If Columnadress < 14 Then 'Colonne fin de tableau
Select Case bSens
        Case True
    ActiveWorkbook.Worksheets(Feuille).ListObjects(Tableau).Sort.SortFields. _
        Clear
    ActiveWorkbook.Worksheets(Feuille).ListObjects(Tableau).Sort.SortFields. _
        Add Key:=Range(Tableau & "[[#All],[" & Var & "]]"), SortOn:=xlSortOnValues, _
        Order:=xlAscending, DataOption:=xlSortNormal
    With ActiveWorkbook.Worksheets(Feuille).ListObjects(Tableau).Sort
        .Header = xlYes
        .MatchCase = False
        .Orientation = xlTopToBottom
        .SortMethod = xlPinYin
        .Apply
    End With
    
    Case False
    ActiveWorkbook.Worksheets(Feuille).ListObjects(Tableau).Sort.SortFields. _
        Clear
    ActiveWorkbook.Worksheets(Feuille).ListObjects(Tableau).Sort.SortFields. _
        Add Key:=Range(Tableau & "[[#All],[" & Var & "]]"), SortOn:=xlSortOnValues, _
        Order:=xlDescending, DataOption:=xlSortNormal
    With ActiveWorkbook.Worksheets(Feuille).ListObjects(Tableau).Sort
        .Header = xlYes
        .MatchCase = False
        .Orientation = xlTopToBottom
        .SortMethod = xlPinYin
        .Apply
    End With
    End Select
 
    bSens = Not bSens
End If
Call ProtectSoloON 'Unprotect
Application.ScreenUpdating = True
    
End Sub
 

Columbo

XLDnaute Nouveau
Bonjour Laurent,
J'ai repris ton code, je l'ai mis dans un nouveau module. La feuille est protégée ainsi que les données.
La colonne A est sélectionnée, je lance le code mais il bloque "Call ProtectSoloOFF 'Unprotect"
J'ai tenté de mettre le code dans la feuille directement ça fait pareil.
 

Laurent97310

XLDnaute Nouveau
C'est normal c'est ma macro pour déprotéger la feuille avant d'effectuer le tri:

VB:
Sub ProtectSoloOFF()

ActiveSheet.Unprotect

End Sub

puis à la fin pour reprotéger (avec mes paramètres propres à mon projet):

Code:
Sub ProtectSoloON()

ActiveSheet.Protect DrawingObjects:=True, Contents:=True, Scenarios:=True _
        , AllowSorting:=True, AllowFiltering:=True
End Sub
 

Columbo

XLDnaute Nouveau
Laurent97310,
Je n'arrive pas à faire le tri avec la macro que tu mentionnes.
Je joins un fichier test protégé avec la macro dans l'onglet.
Quand je fais tourner la macro, j'ai le message suivant qui s'affiche et rien n'est trié:
1620763717479.png

Merci pour ton aide
 

Pièces jointes

  • test tri.xlsm
    18.9 KB · Affichages: 4

Discussions similaires

Statistiques des forums

Discussions
294 371
Messages
1 938 081
Membres
188 643
dernier inscrit
Stoppub