Protection d'une page qui génère une erreur VBA

Bonsoir à tous,

J'aurais besoin s'il vous plait d'un avis pour du code VBA.

Dès lors que je rajoute la protection sur la page et que je rajoute également au préalable les lignes de codes :

ActiveSheet.Unprotect "mdp"

et

 ActiveSheet.Protect "mdp"

Comme ceci :

Sub Triligne()
    ActiveSheet.Unprotect "mdp"
 '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 "mdp"
    End Sub

J'active alors la protection de la feuille, execute la macro et j'obtiens le message d'erreur suivant.

Erreur ligne 0
Error 1004, la méthode hidden de l'objet range à échoué.

Je précise que la macro triligne fonctionne correctement sans protection.

En vous remerciant par avance pour votre aide.

Cordialement.

Bonsoir

Tu ôtes la protection de la feuille active. Mais ta feuille "Planning" ne serait-elle pas protégée également ?

Amicalement

Nad

Bonsoir à tous,

Nad j'ajouterai que peut-être que la feuille active est masquée... Code à ajouter peut-être :

Worksheets("nom de l'onglet").Visible = True 'Rend visible l'onglet TEST
Worksheets("nom de l'onglet").Activate  'Active l'onglet TEST
ActiveSheet.Unprotect ("mdp") 'Enlève le mote de passe

Je l'ai déjà effectué et cela fonctionne :

https://cellulexcel.blogspot.fr/p/blog-page_1.html

Bonsoir et1000lio,

L'onglet planning n'est pas masqué.

Il est bien apparent avec juste une protection de feuille.

Cordialement.

Re

Tu es sur quelle feuille quand le code est lancé ?

Nad

Re,

La macro s'exécute lorsque la page est chargée.

Je suis sur un onglet a gauche, je clique sur l'onglet planning, hop j'ai l'erreur.

Sinon je teste aussi : je suis sur l'onglet planning, j'ouvre la fenêtre macro, j'excite la macro triligne hop j'ai l'erreur.

Cordialement.

Re

Il faut que tu ôtes la protection de la feuille Planning également

Sheets("Planning").Unprotect "mdp"

Re

Je rallume l'ordi et je teste

Cordialement.


Re Nad

Toujours pas, j'ai toujours l'erreur.

Je pense que le problème se situe plutôt au niveau de la formule mais je ne suis pas sûr.

J'y suis parvenu sur deux autres onglets qui supprime des lignes et les remets dans leurs états initial.

https://forum.excel-pratique.com/excel/protection-feuille-et-utilisation-macro-t55962.html

La je ne sais pas pourquoi ça ne veut pas.

Sur l'onglet planning, la macro se fait sur des cellule horizontale, alors que sur les autres onglets ou ça fonctionne c'est vertical.

J'essaye de donner le plus d'éléments possible.

Cordialement.

Bonjour

Tu recherches le 1er zéro, mais que se passe t-il si aucun zéro ?

Il y plantage mais pas le même message d'erreur

Ton fichier en cause permettait (enfin je crois) de mieux cerner le problème

Bonjour à tous,

Merci à tous pour vos différentes interventions.

En fait la macro "récupère" les noms de l'onglet personnels, les classe par ordre alphabétique de la gauche vers la droite et efface les 0.

Voici le fichier en PJ, je suis presque à la fin

Le mot de passe est "200997" ou "mdp" pour les protections.

En vous en remerciant par avance.

Cordialement.

Bonjour

Je ne suis pas réveillé peut-être, mais que faut il faire pour planter le programme ?

Tout se passe dans la page "Planning" ?

Pourquoi trier B1 (JSFERIE) avec les noms ?

A te lire

Bonjour Banzai64,

Il faut juste activer la protection de l'onglet planning, aller sur un autre onglet et retourner sur l'onglet planning pour que la macro s’exécute.

Effectivement trier B1 n'a aucune utilité.

Merci bien par avance.

Bonjour

Et bien voilà quand tu expliques cela va mieux

En fait tu as 2 macros

Une déclenchée par la procédure évènementielle Worksheet_Activate qui elle ne déprotège pas la feuille --> Donc erreur détournée par ta gestion des erreurs On Error GoTo errorhandler

Une autre macro (TriLigne) qui elle déprotège la page

Donc dans ta procédure évènementielle rajoute en début ActiveSheet.Unprotect "mdp" et avant de la quitter ActiveSheet.Protect "mdp"

Ensuite refais un test

Bonjour,

Merci bien, je n'ai plus de Pc jusqu'à lundi matin, mais des lundi, je teste.

Bon week-end.

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.

Bonjour

Mon avis personnel à moi tout seul que je partage

Déplaces la protection ActiveSheet.Protect "200997" avant le Exit Sub

Le fait de protéger la feuille après un plantage peut gêner la recherche des causes du plantage

La fin de ton code pourrait ressembler à ceci

       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
 ActiveSheet.Protect "200997"  

 Exit Sub

errorhandler:
 MsgBox "Ligne: " & Erl & vbCrLf & _
            "Error: (" & Err.Number & ") " & Err.Description, vbCritical, "Erreur"
End Sub

Re Banzai64,

Ca n'engage que toi, mais ça fonctionne Héhé

Merci encore et bonne soirée.

Cordialement.

Bonjour,

Je suis pas un pro, mais j'ai l'impression que dans la macro événementielle, ça reprends le code de la macro triligue au moins à 80%.

Est ce que c'est pas redondant ? Car c'est vrai que lorsque je charge la page planning on voit une barre de progression en bas de la fenêtre excel.

Je me demande si elle ne s'exécute pas 2 fois en fait.

Cordialement.

Bonjour

Oui elles sont semblables

Une qui est appelée automatiquement par l'évènement Activate et l'autre sans doute par un bouton ou un raccourci clavier

Cela n'est pas gênant en soi, bien qu'elles fassent le même boulot elles ne s'appellent pas entre eux

On pourrait bien sur envisager d'en faire qu'une, mais, à mon avis, cela serait juste pour simplifier

Bonjour,

Merci pour cette réponse, claire et précise.

Cordialement.

Rechercher des sujets similaires à "protection page qui genere erreur vba"