Fermeture Excel --> protection feuilles

Bonjour j'aimerai créer une macro qui me permettrait de proteger les feuilles 8 à X (X peut varier) quand je ferme l'excel

Cette macro ne fonctionne pas :

Private Sub Workbook_BeforeClose(Cancel As Boolean)

For i = 8 To Worksheets.Count
Sheets(i).Protect Password:="toto"
Next i
End Sub

En revanche celle-ci oui que sur la feuille 8, je ne vois pas ce qui cloche :

Private Sub Workbook_BeforeClose(Cancel As Boolean)

Feuil8.Protect Password:="toto"

End Sub

Merci par avance

Bonjour

Qu'est ce qui ne fonctionne pas ?

Le souci de votre code c'est que si la feuille positionnée en 8 est déplacée en position 1, le code va protéger la feuille 8 qui n'est peut-être pas celle à protéger..

- Sheets(i) avec i qui correspond à la position de la feuille
- feuil8 est le code name de la feuille et n'a rien avoir avec la position de votre feuille

Ma question : Quel est le nom des feuilles à protéger ou le code name de chaque feuille ?

Cordialement

Bonjour

Code a tester

Private Sub Workbook_BeforeClose(Cancel As Boolean)

For i = 8 To Worksheets.Count
Sheets(i).Protect Password:="toto"
Next 
End Sub

Crdlt

Bonjour,,

Le code ci-dessus ne fonctionne malheureusement pas

La macro ci-dessous fonctionne :

Private Sub Workbook_BeforeClose(Cancel As Boolean)

For i = 1 To Worksheets.Count
Sheets(i).Protect Password:="cqcondi"
Next i
End Sub

il faudrait juste rajouter une partie qui permettrait de proteger tous le monde sauf Feuille 1, 2, 3, 4 et 5

Merci

A tester mdp toto

après enregistrement les feuilles 6,7 etc sont protégées

Edit modo : juste besoin du code

Private Sub Workbook_BeforeClose(Cancel As Boolean)
  For i = 6 To Worksheets.Count
    Sheets(i).Protect Password:="toto"
  Next
End Sub

Bonjour,

Ca ne fonctionne pas...

Merci

Le problème également c'est que ça décoche toutes les cases de protection et moi j'aimerai que certaines cases soient cochées :

capture d ecran 2023 12 13 145747

Re bonjour

Sur le fichier que j'ai joins (supprimé par un modo) chez moi il fonctionne bien

Re

il faudrait juste rajouter une partie qui permettrait de proteger tous le monde sauf Feuille 1, 2, 3, 4 et 5

Vous ne répondez pas à la question que je vous avais posée.... Donc je décline si vous ne donnez pas l'info

A vous de voir.

Salut,

Bon ne pas renommer les feuilles c'est petit petit, mais bon. Dans la méthode Workbook_BeforeClose tu colles ce code :

Private Sub Workbook_BeforeClose(Cancel As Boolean)
    PtrotectSheets 6
End Sub

Et dans un module les procédures et fonctions suivantes :

Public Sub PtrotectSheets(ByVal FirstSheetNumber As Long)
    Dim Counter As Long
    With ThisWorkbook.Worksheets
        Counter = FirstSheetNumber
        Do While Counter <= .Count
            If IsWorksheetExists("Feuil" & CStr(Counter)) Then
            ' // Adapter selon besoin
            ' // https://learn.microsoft.com/en-us/office/vba/api/excel.worksheet.protect
                .Item("Feuil" & Counter).Protect Password:="toto", _
                                                 AllowFormattingRows:=True               ' // etc..
            End If
            Counter = Counter + 1
        Loop
    End With
End Sub

Public Function IsWorksheetExists(ByVal SheetName As String) As Boolean
    Dim localWorksheet As Worksheet
    For Each localWorksheet In ThisWorkbook.Worksheets
        If StrComp(localWorksheet.Name, SheetName, vbTextCompare) = 0 Then
            IsWorksheetExists = True
            Exit For
        End If
    Next
End Function

Je te laisse le soin d'adapter en regardant les possibilités sur la documentation de Microsoft :

Worksheet.Protect method (Excel) | Microsoft Learn

Bonjour

Je n'avais pas compris la question, les noms des feuilles à protéger peuvent varier ce n'est jamais la même chose ça peut être des chiffres comme des fois des lettres...

Je vais essayé la macro ci-dessus je vous tiens au courant si elle fonctionne mais elle m'a l'air compliqué j'espère y arriver...

Re,

Edit, hors sujet pardon....

Si tu ne connais pas le nom des feuilles comment veux tu pouvoir les protéger ?

Si tu connais leurs noms tu as la solution d'un Array

    Dim localName As String
    For Each localName In VBA.Array("Feuil1", "Feuil2", "Feuil3")
        ThisWorkbook.Worksheets.Item(localName).Protect Password:="toto"
    Next localName

re

Je n'avais pas compris la question, les noms des feuilles à protéger peuvent varier ce n'est jamais la même chose ça peut être des chiffres comme des fois des lettres...

raison de ma question. Donc toujours en attente de vos infos si vous voulez que je regarde

A la limite allez dans l'éditeur VBA et faite une vue de la fenetre "VBA project" que vous avez à gauche et postez-là dans votre réponse

Sans connaitre le nom des feuilles j'aurais aimé que la macro protège toutes les feuilles sauf Feuil 1 à 5 car celle-ci reste fixent

voici le screen

image

en résumé je vais créer des feuilles chaque jours qui auront un nom différents (exemple TEST1, TEST2..)

Les feuilles synthse, coa PF, logbook, liste, prog sont des feuilles qui ne doivent pas être protégé. Toutes les autres c'est à dire feuille type normal + les feuilles créer chaque jours doivent être protégé lors de la fermeture du fichier

Merci

Re,

C'est ce que fait le code que j'ai posté à 18h04 non ?

je ne sais pas pourquoi ça ne fonctionne pas

Private Sub Workbook_BeforeClose(Cancel As Boolean)
    PtrotectSheets 6
End Sub

Public Sub PtrotectSheets(ByVal FirstSheetNumber As Long)
    Dim Counter As Long
    With ThisWorkbook.Worksheets
        Counter = FirstSheetNumber
        Do While Counter <= .Count
            If IsWorksheetExists("Feuil" & CStr(Counter)) Then
                .Item("Feuil" & Counter).Protect Password:="cqcondi", DrawingObjects:=True, Contents:=True, Scenarios:=True, UserInterfaceOnly:=True, AllowFormattingCells:=False, AllowFormattingColumns:=False, AllowFormattingRows:=False, AllowInsertingColumns:=False, AllowInsertingRows:=False, AllowInsertingHyperlinks:=False, AllowDeletingColumns:=False, AllowDeletingRows:=False, AllowSorting:=False, AllowFiltering:=False, AllowUsingPivotTables:=False
            End If
            Counter = Counter + 1
        Loop
    End With
End Sub

Public Function IsWorksheetExists(ByVal SheetName As String) As Boolean
    Dim localWorksheet As Worksheet
    For Each localWorksheet In ThisWorkbook.Worksheets
        If StrComp(localWorksheet.Name, SheetName, vbTextCompare) = 0 Then
            IsWorksheetExists = True
            Exit For
        End If
    Next
End Function

J'ai pourtant copier cette macro dans ThisWorkbook

Re

Les feuilles synthse, coa PF, logbook, liste, prog sont des feuilles qui ne doivent pas être protégé

Alors votre code comme ceci où "toto" est le mot de passe et à remplacer par votre mot de passe
Code à placer dans thisworkbook qui fonctionnera à l'ouverture du fichier. On peut le faire aussi à la fermeture si vous préférez

Private Sub Workbook_Open()
Dim i As Byte
Dim ws As Worksheet

For Each ws In ThisWorkbook.Worksheets
    If Right(ws.CodeName, Len(ws.CodeName) - 5) <= 5 Then
        ws.Protect Password:="toto", DrawingObjects:=False, Contents:=True, Scenarios:= _
        False, AllowFormattingCells:=True, AllowFormattingColumns:=True, _
        AllowFormattingRows:=True, AllowInsertingRows:=True, AllowDeletingRows:=True
    End If
Next ws
End Sub

Pensez à cocher manuellement les cases que vous mentionnez avant

Cordialement

Re,

Qu'entends-tu par ça ne marche pas, bonne question non ?

Ca plante ? Ca ne fait pas le job ? Il faudrait plus d'explications non ?
Il nous faudrais aussi le nom de toutes les feuilles du classeur pour voir si la façon de faire est bonne.

je viens de me rendre compte de plusieurs bourdes de ma part, mais bon en lisant le code tu aurais du trouver.

  • PtrotectSheets et mal orthographié, mais cela ne gène en rien le fonctionnement
  • FirstSheetNumber doit-être définit sur la première feuille à protéger
  • .Item("Feuil" & CStr(Counter)).Protect Password:="cqcondi", ..... Ajoute le Cstr(), mais je pense qu'Excel arrive à le faire de lui même

Donc au final on a :

Private Sub Workbook_BeforeClose(Cancel As Boolean)
    ProtectSheets 6
End Sub

' // Il vaut mieux mettre ce code dans un module distinct

Public Sub ProtectSheets(ByVal FirstSheetNumber As Long)
Dim Counter As Long
    With ThisWorkbook.Worksheets
        Counter = FirstSheetNumber
        Do While Counter <= .Count
            If IsWorksheetExists("Feuil" & CStr(Counter)) Then
                .Item("Feuil" & CStr(Counter)).Protect _
                    Password:="cqcondi", DrawingObjects:=True, _
                    Contents:=True, Scenarios:=True, UserInterfaceOnly:=True, _
                    AllowFormattingCells:=False, AllowFormattingColumns:=False, _
                    AllowFormattingRows:=False, AllowInsertingColumns:=False, _
                    AllowInsertingRows:=False, AllowInsertingHyperlinks:=False, _
                    AllowDeletingColumns:=False, AllowDeletingRows:=False, AllowSorting:=False, _
                    AllowFiltering:=False, AllowUsingPivotTables:=False
            End If
            Counter = Counter + 1
        Loop
    End With
End Sub

Public Function IsWorksheetExists(ByVal SheetName As String) As Boolean
    Dim localWorksheet As Worksheet
    For Each localWorksheet In ThisWorkbook.Worksheets
        If StrComp(localWorksheet.Name, SheetName, vbTextCompare) = 0 Then
            IsWorksheetExists = True
            Exit For
        End If
    Next
End Function
Rechercher des sujets similaires à "fermeture protection feuilles"