Bonsoir Banzai64,
J'ai scrupuleusement respecté ta consigne en ce qui concerne la macro évènementielle, je n'ai plus d'erreur dans l'exécution de la macro, cependant, le fait de l'exécuter en son entier déverrouille la protection à la fin.
Je colle le code modifié ;
Option Explicit
Private Sub Worksheet_Activate()
ActiveSheet.Unprotect "200997"
On Error GoTo errorhandler
Dim i As Long
Dim fPlanning As Worksheet
Dim r As Range
Dim masquer As Range
Dim Premiere As Range
Dim Derniere As Range
Set fPlanning = ActiveWorkbook.Worksheets("Planning")
fPlanning.Activate
'Premier tri : descendant
Set r = fPlanning.Range("C1:BR1") 'Definit le champ a trier
Set Premiere = r.Cells(1, 1)
Set Derniere = r.Cells(1, r.Columns.Count)
'Affiche toutes les colonnes de ce champ
fPlanning.Range(fPlanning.Columns(Premiere.Column), fPlanning.Columns(Derniere.Column)).Hidden = False
With ActiveWorkbook.Worksheets("Planning").Sort
.SortFields.Clear
.SortFields.Add Key:=r, _
SortOn:=xlSortOnValues, Order:=xlDescending, DataOption:=xlSortNormal
.SetRange r
.Header = xlGuess
.MatchCase = False
.Orientation = xlLeftToRight
.SortMethod = xlPinYin
.Apply
End With
'Chercher le premier 0 ou ""
Set masquer = Nothing
For i = Premiere.Column To Derniere.Column
If fPlanning.Cells(1, i) = "" Or fPlanning.Cells(1, i) = 0 Then
Set masquer = fPlanning.Range(fPlanning.Columns(fPlanning.Cells(1, i).Column), Derniere)
Set r = fPlanning.Range(Premiere, fPlanning.Cells(1, i - 1)) 'Definir le champ a trier
Exit For
End If
Next
If i > Premiere.Column Then
'Second tri : Ascendant
With ActiveWorkbook.Worksheets("Planning").Sort
.SortFields.Clear
.SortFields.Add Key:=r, _
SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
.SetRange r
.Header = xlGuess
.MatchCase = False
.Orientation = xlLeftToRight
.SortMethod = xlPinYin
.Apply
End With
'Masquer les colonnes dont le titre est "" ou est 0
If Not masquer Is Nothing Then
fPlanning.Range(fPlanning.Columns(masquer.Column), fPlanning.Columns(masquer.Columns.Count + masquer.Column - 1)).Hidden = True
End If
End If
Exit Sub
errorhandler:
MsgBox "Ligne: " & Erl & vbCrLf & _
"Error: (" & Err.Number & ") " & Err.Description, vbCritical, "Erreur"
ActiveSheet.Protect "200997"
End Sub
Et
Sub Triligne()
ActiveSheet.Unprotect "200997"
'Premier tri : descendant
Set r = Range("B1:AJ1") 'Definit le champ a trier
'Affiche toutes les colonnes de ce champ
Range(Columns(r.Column), Columns(r.Columns.Count + r.Column - 1)).Hidden = False
With ActiveWorkbook.Worksheets("Planning").Sort
.SortFields.Clear
.SortFields.Add Key:=r, _
SortOn:=xlSortOnValues, Order:=xlDescending, DataOption:=xlSortNormal
.SetRange r
.Header = xlGuess
.MatchCase = False
.Orientation = xlLeftToRight
.SortMethod = xlPinYin
.Apply
End With
'Chercher le premier 0
For i = Cells(1, "B").Column To Cells(1, "Aj").Column
If Cells(1, i) = 0 Then
Set masquer = Range(Cells(1, i), Cells(1, "AJ")) 'D_finir le champ ˆ masquer
Set r = Range(Cells(1, "B"), Cells(1, i - 1)) 'Definir le champ a trier
Exit For
End If
Next
If i > Cells(1, "B").Column Then
'Second tri : Ascendant
With ActiveWorkbook.Worksheets("Planning").Sort
.SortFields.Clear
.SortFields.Add Key:=r, _
SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
.SetRange r
.Header = xlGuess
.MatchCase = False
.Orientation = xlLeftToRight
.SortMethod = xlPinYin
.Apply
End With
'Masquer les colonnes dont le titre est 0
Range(Columns(masquer.Column), Columns(masquer.Columns.Count + masquer.Column - 1)).Hidden = True
End If
ActiveSheet.Protect "200997"
End Sub
Merci aussi pour les explications que tu m'a donné en ce qui concerne le déverrouillage des macros, ça me servira par la suit c'est sûr.
En t'en remerciant bien par avance.
Cordialement.