proteger toutes les cellules modifiées à la fermeture du fichier

micky01

XLDnaute Occasionnel
Bonjour à tous,

Je cherche à protéger les cellules non vides de toutes les feuilles d'un classeur.
J'ai suivi un fils sur ce sujet mais j'ai peur que ça me fasse buguer mon fichier qui contient 84 feuilles différentes.
Avez vous une idée d'une macro permettant uniquement de proteger les cellules remplies depuis le dernier enregistrement (ou quelque chose du style).

Merci par avance,

Ci dessous le fils suivi :
Bonjour
Bon pour plage "A1:A100"
1er sélect toute tes cell et clic droit ...format ...sous l'onglet protection déverouille tout
2eme Mettre ce code dans le workbook ALT+F11
Voir image ici

Code:
Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)

For Each c In Sheets("Feuil1").Range("A1:A100")
    If c <> "" Then
       ActiveSheet.Unprotect Password:=""
       c.Locked = True
       ActiveSheet.Protect Password:=""
    End If
Next c

End Sub

A+

Temjeh
 

Robert

XLDnaute Barbatruc
Repose en paix
Re : proteger toutes les cellules modifiées à la fermeture du fichier

Bonjour Micky, bonjour le forum,

La protection nécessite deux étapes. La première est le verrouillage des cellules que l'on veut protéger et la seconde est la protection de l'onglet contenant ces cellules. L'un sans l'autre ne sert à rien. Comme par défaut toutes les cellules d'un onglet sont verrouillées, si on protège l'onglet tu ne pourras plus rien éditer. Je t'ai donc fait une première macro qui permet de déverrouiller toutes les cellules de tous les onglets de ton classeur.
Si tu avais un mot de passe modifie le code en conséquence...
Code:
Sub Macro1()
Dim o As Worksheet 'déclare la variale o (Onglet)For Each o In Sheets 'boucle sur tous les onglets du classeur
    o.Unprotect Password:="" 'déprotège l'onglet (rajoute un mot de passe entre les guillemets si tu en as envie ou besoin...)
    o.Cells.Locked = False 'déverrouille toutes les cellules de l'onglet
    o.Protect Password:="" 'protège l'onglet (si tu as rajouté un mot de passe, il faut le même ici entre les guillemets)
Next o 'prochain onglet de la boucle
End Sub
Cette macro ne te servira qu'une fois. Après tu peux carrément la supprimer car c'est la macro événementielle BeforeClose qui fera ce que tu demandes. Il te faut la placer dans le composant VBA ThisWorkbook :
Code:
Private Sub Workbook_BeforeClose(Cancel As Boolean)
Dim o As Worksheet 'déclare la variale o (Onglet)
Dim cel As Range 'déclare la variable cel (cellule)
For Each o In Sheets 'boucle 1 : sur tous les onglets du classeur
    o.Unprotect Password:="" 'déprotège l'onglet (rajoute un mot de passe entre les guillemets si tu en as envie ou besoin...)
    For Each cel In o.UsedRange 'boucle 2 : sur toutes les cellules éditées du l'onglet
        cel.Locked = True 'verrouille la cellule
    Next cel 'prochaine cellule de la boucle 2
    o.Protect Password:="" 'protège l'onglet (si tu as rajouté un mot de passe, il faut le même ici entre les guillemets)
Next o 'prochain onglet de la boucle 1
ThisWorkbook.Save 'sauve le classeur
End Sub
 

micky01

XLDnaute Occasionnel
Re : proteger toutes les cellules modifiées à la fermeture du fichier

Merci de ton retour Robert,

J'ai essayé ta macro, mais lorsque je ferme le classeur il me met une erreur d'execution 1004 "impossible de définir la propriété locked de la classe range.
Je ne vois pas trop ce que cela veut dire :eek:
 

micky01

XLDnaute Occasionnel
Re : proteger toutes les cellules modifiées à la fermeture du fichier

Re bonjour Robert,
En fait, je viens de me rendre compte que c'est parce que j'ai des cellules fusionnées et donc, visiblement il n'aime pas trop ça.
Y'a t'il une parade à cela ou suis-je obligé de revoir tout mon fichier en enlevant toutes les cellules fusionnées?

Merci
 

Robert

XLDnaute Barbatruc
Repose en paix
Re : proteger toutes les cellules modifiées à la fermeture du fichier

Bonjour Micky, bonjour le forum,

En effet ça plante avec des cellules fusionnées. Essaie comme ça :
Code:
Private Sub Workbook_BeforeClose(Cancel As Boolean)
Dim o As Worksheet 'déclare la variale o (Onglet)
Dim cel As Range 'déclare la variable cel (cellule)
Dim cel1 As Range 'déclare la variable cel1 (cellule 1)
Dim pl As Range 'déclare la variable pl

For Each o In Sheets 'boucle 1 : sur tous les onglets du classeur
    o.Unprotect Password:="" 'déprotège l'onglet (rajoute un mot de passe entre les guillemets si tu en as envie ou besoin...)
    For Each cel In o.UsedRange 'boucle 2 : sur toutes les cellules éditées du l'onglet
        If cel.MergeCells = True Then
            Set pl = cel.MergeArea 'définit la plage pl
            cel.UnMerge 'défusionne la cellule
            For Each cel1 In pl 'boucle 3 : sur toutes les cellules cel1 de la plage pl
                cel1.Locked = True 'verrouille la cellule
            Next cel1 'prochaine cellule de la boucle 3
            pl.Merge
        Else
            cel.Locked = True 'verrouille la cellule
        End If
    Next cel 'prochaine cellule de la boucle 2
    o.Protect Password:="" 'protège l'onglet (si tu as rajouté un mot de passe, il faut le même ici entre les guillemets)
Next o 'prochain onglet de la boucle 1
ThisWorkbook.Save 'sauve le classeur
End Sub
 

micky01

XLDnaute Occasionnel
Re : proteger toutes les cellules modifiées à la fermeture du fichier

Salut,
Visiblement ça ne plante plus mais c'est super long et ce'st ce que je redoutais...
Je vais songer à modifier mon fichier pour que ce soit plus facile.
Merci tout de même, ça me donne une piste de réflection.
A plus
 

Robert

XLDnaute Barbatruc
Repose en paix
Re : proteger toutes les cellules modifiées à la fermeture du fichier

Bonjour Micky, bonjour le forum,

On peut peut-être éviter la boucle 3. Essaie comme ça :
Code:
Private Sub Workbook_BeforeClose(Cancel As Boolean)
Dim o As Worksheet 'déclare la variale o (Onglet)
Dim cel As Range 'déclare la variable cel (cellule)
Dim cel1 As Range 'déclare la variable cel1 (cellule 1)
Dim pl As Range 'déclare la variable pl

For Each o In Sheets 'boucle 1 : sur tous les onglets du classeur
    o.Unprotect Password:="" 'déprotège l'onglet (rajoute un mot de passe entre les guillemets si tu en as envie ou besoin...)
    For Each cel In o.UsedRange 'boucle 2 : sur toutes les cellules éditées du l'onglet
        If cel.MergeCells = True Then
            Set pl = cel.MergeArea 'définit la plage pl
            cel.UnMerge 'défusionne la cellule
[FONT=Courier New]            cel.Locked = True 'verrouille la cellule[/FONT]
            pl.Merge 'fusionne la plage pl
        Else
            cel.Locked = True 'verrouille la cellule
        End If
    Next cel 'prochaine cellule de la boucle 2
    o.Protect Password:="" 'protège l'onglet (si tu as rajouté un mot de passe, il faut le même ici entre les guillemets)
Next o 'prochain onglet de la boucle 1
ThisWorkbook.Save 'sauve le classeur
End Su
 

micky01

XLDnaute Occasionnel
Re : proteger toutes les cellules modifiées à la fermeture du fichier

C'est mieux mais il faut vraiment que je supprime un bon paquet de cellule fusionnées.
Sachant que j'ai près de 80 feuilles que chaque feuille contient actuellement unecentaine de fusion... ça devient trop trop long.
Je pense que je passerais moins de temps à revoir mon fichier qu'à attendre a chaque fois que je vais l'arrêter...

Merci encore pour ton aide Robert.

A plus
 

yvan9223

XLDnaute Nouveau
Bonjour, c'est absolument génial ceci, Sauf que la j'arrive plus à le faire. lol, mais je vais retrouver pourquoi

Sinon, j'ai essayé et en cas de remplissage de tableau par une validation de donnée, de type liste, cela ne verrouille pas la liste. Et comme j'ai une liste déroulante colonne A, et une rechercheV dans la colonne B, cela verrouille la modification manuelle de la colonne B (donc la recherche V reste) mais pas la colonne A. Du coup, je peux toujours modifier la colonne A, et en conséquence, la colonne B se modifie aussi.

Une solution pour ce problème?
 

Discussions similaires

Statistiques des forums

Discussions
312 467
Messages
2 088 671
Membres
103 914
dernier inscrit
VAL965698