Protection feuille (sauf cellules déverrouillées) avec VBA

Sans fichier c'est compliqué ..

Par exemple ce code met la propriété verouillée sur les cellules de la plage I5 à M3

ActiveSheet.Range("I5:M3").Locked = True

Qui est ensuite activée via la protection de la feuille.

Re,

Il faut définir dans le code le bon paramètre. Sur Microsoft Docs, on trouve souvent la documentation nécessaire :

https://docs.microsoft.com/fr-fr/office/vba/api/excel.worksheet.protect

Dans ton cas, ce sera a priori :

    .protect allowformattingcells:=true

Cdlt,

Bonsoir 3GB, oui après une recherche sur le net j'ai trouvé ça aussi ! j'ai testé sur un fichier lambda et ça fonctionne mais pas sur mon projet car j'ai le message d'erreur suivant à l'exécution du code:

erreur

Auriez-vous une idée ? :/

J-Baptiste

Alors là, comme ça, je n'ai pas vraiment d'idée mais il n'y a pas de raison que ça marche sur un fichier et pas sur un autre.

Les erreurs de compilation sont des saisies imparfaites (if sans end if, pas de sub au début, ...).

Par exemple, le méthode .protect toute seule et donc pas rattachée à la feuille sur laquelle elle devrait agir provoquerait probablement une erreur de compilation.

Il faut avoir une des 2 choses suivantes :

Sheets("blabla").protect allowformattingcells:=true 'ou ws.protect ...

ou

with ws
    .protect allowformattingcells:=true 'ou sheets("blabla")
    'code
end with

Il s'agit d'une méthode portant sur les feuilles donc il faut toujours un objet feuille avant .protect.

Cdlt,

Je pense qu'il serait pertinent que tu nous repostes ton code entier (je vais pas demander le fichier, j'ai déjà essayé sans succès), il y a eu pas mal de modification !

Bonne soirée !

Merci pour votre retour. voici le code dans lequel je vais insérer Protect

Sub Int_Classeur()
 Application.ScreenUpdating = False
    '********************************************************************
    RAZ.afficher
    '********************************************************************
    Dim Plage As Range, Cel_Trouv As Range, DerLig As Long, i, Sh As Worksheet, Nb_Feuille, Cpt
    Nb_Feuille = ThisWorkbook.Worksheets.Count
    For Each Sh In ThisWorkbook.Worksheets
        Cpt = Cpt + 1
        If Left(Sh.Name, 1) = "V" Then
            With Sh
                .Unprotect AllowFormattingCells:=False
                ' on efface les deux première zone et leur colueur
                .Range("F3:I5,J3:M5").ClearContents
                .Range("F3:I5,J3:M5").Interior.Color = xlNone
                ' on attribue à la variable Plage la colonne A de la feuille que l'on essaie de quitter
                Set Plage = .Columns(1)
                ' on attribue la variable Cel_Trouv la cellule qui contient le mot "fin"
                Set Cel_Trouv = Plage.Cells.Find("fin", lookat:=xlWhole)
                ' si cette cellule est vide on quitte la procédure de test car "fin" n'a pas été trouvé
                If Not Cel_Trouv Is Nothing Then
                    DerLig = Cel_Trouv.Row - 1
                    ' on supprime la couleur des cellules en colonne 1 et 2
                    For i = 9 To DerLig
                        ' on supprime la couleur des cellules en colonne 1 et 2
                        If .Cells(i, 1).MergeArea.Cells.Count = 1 Then .Range("A" & i).Resize(, 2).Interior.Color = xlNone
                        ' on efface les données en colonne D, mais elles sont fusionnées, pour le différencier des autres
                        ' on regarde le nombre de cellules comprise dans la sélection
                        If .Cells(i, 4).MergeArea.Cells.Count = 10 Then .Range("D" & i).Resize(, 10).ClearContents
                        Sheets("Sommaire").Shapes.Range(Sh.Name).Fill.ForeColor.RGB = RGB(255, 0, 0)
                    Next i
                    '**************************************************************************************
                    RAZ.actualiser CInt((Cpt / Nb_Feuille) * 100)
                    '*************************************************************************************
                End If
            End With
            .Protect AllowFormattingCells:=True
        End If
    Next Sh
End Sub

Il faut remonter le .protect juste avant le end with (pour qu'il se rattache à l'objet feuille). Et il n'y a pas besoin de mettre .Unprotect AllowFormattingCells:=False. Il faut juste .unprotect (et le mot de passe quand on en met un).

Exact 3GB, cela fonctionne mieux comme ça !

J'en profite pour un autre problème mais je ne vois pas où ça coince: J'ai voulu créer une scrollarea sur la feuille "TEST" en définissant la largeur et en utilisant le mot "fin" sur la longueur car celle-ci sera amenée à varier. J'ai un message d'erreur, auriez-vous une piste svp ? :)

Je joins mon fichier ça sera plus simple.

Bonne fin de soirée

J-Baptiste

5test2.xlsm (27.23 Ko)

Bonjour,

Votre fichier est typiquement la raison pour laquelle j'évite d'en télécharger : bug d'entrée, barres masquées à l'ouverture (propriétés que je vais devoir rétablir moi-même maintenant), aucune indication ni simplification...

Voici le code sans le mot fin, encore une fois en utilisant usedrange (limitée à 13 colonnes) :

Private Sub Worksheet_Activate()

ScrollArea = Me.UsedRange.Resize(, 13).Address
Range("D9").Activate

End Sub

Bon courage pour le reste,

Bonsoir 3GB, merci pour cette réponse.

Je me suis permis de joindre le fichier car certaines personnes sur ce forum préfèrent travailler avec le classeur EXCEL c'est plus explicite. Certes, j'aurais pu rétablir les propriétés avant de le joindre mais je ne pensais pas que cela pourrait agacer autant, j'en suis désolé.
Mon but était de gérer le scroolarea entre les colonnes A et M et de la ligne 1 jusqu'à la ligne contenant le mot "fin".

Je vais tenter de trouver la solution sur le net.

Bonne soirée :)

J-Baptiste

Bonsoir Jean-Baptiste,

Il faut pas le prendre mal, ça parait sévère avec le smiley mais c'est juste une façon de dire qu'il faut essayer de préparer un fichier facilement utilisable...

Pour ton problème, c'est exactement ce que j'ai fait mais en mieux et en plus simple . La scrollarea est l'adresse de zone utilisée (toutes les lignes donc) limitée à 13 colonnes (via le resize). Il faut juste effacer le mot fin justement.

Mais si tu veux à tout prix le garder, c'est toi qui vois.

A plus,

Re bonsoir G3B, je ne l'ai pas mal pris et je veillerai à faire attention au fichier posté la prochaine fois !

En effet, je préférerais conserver le mot "fin" pour limiter le scroll area sur la partie verticale mais je ne sais pas comment l'intégrer:

Private Sub Worksheet_Activate()
Dim DerCol As Integer
Dim Plage As Range
Dim Cel_Trouv As Range
Dim Sh As Worksheet
                ' on attribue la variable Cel_Trouv la cellule qui contient le mot "fin"
'Set Cel_Trouv = Sh.Columns(1).Cells.Find("fin", lookat:=xlWhole)

ScrollArea = "$A$1:$M$" & Cel_Trouv.Row

Range("A1").Select
DerCol = Cells(1, Cells.Columns.Count).End(xlToLeft).Column
Range(Cells(, 1), Cells(, 13)).Select
'Application.DisplayFullScreen = True
Range("D9").Select
End Sub

Si vous pouviez m'aiguiller pour arranger ce code ça serai gentil

Bonne soirée :)

J-Baptiste

Est-ce que tu as pris le temps d'essayer le code que j'ai posté au moins ?

Pour ce problème, il faut :

Set Cel_Trouv = me.Columns(1).Find("fin", lookat:=xlWhole)

Mais 5 lignes de code (avec des bugs potentiels) contre 1 ligne de code sans risque de bug, c'est vite vu pour moi.

Cdlt,

Pardon 3GB, je n'avais pas fait attention à votre code, c'est parfait pour moi ça fonctionne :)

Merci à vous pour votre aide !

Bonne fin de soirée

J-Baptiste

Rechercher des sujets similaires à "protection feuille sauf deverrouillees vba"