Proteger une cellule UNIQUEMENT si pas vide

B

Bertrand

Guest
Bonjour tout le monde,

Voila je chercherai a savoir quelle serait la maniere la plus simple de proteger un ensemble de cellules si celles ci sont deja renseignees. Formulé autrement : COMMENT N'AUTORISER DANS UN CLASSEUR EXCEL LA SAISIE D'INFORMATION QUE DANS LES CELLULES VIDES?
La cerise sur le gateau serait que vous m'expliquiez si il y a un moyen d'enfreindre cette regle EXCEPTIONNELLEMENT si on veut pouvoir modifier le contenu d'une cellule deja renseignée

D'avance merci pour votre precieuse aide

Bertrand
 

MARIE74

XLDnaute Occasionnel
B) Re a tous

Salut bertrand

Si j'ai bien compris

Je te propose

Dans outil/protection tu interdit toutes modif uniquement sur les cellule deja pleine.

Mais si tu veux que apres une saisie il ne soit plus possible de revenir
modifier la saisie
Je pense qu'un expert VBA du forum va peut etre te trouver un code
car je tres interessée par ton probleme

Bonne chance
 
B

Bertrand

Guest
Tout d'abord merci pour ta réponse,

J'aurai aimé savoir sur quelle version d'Excel tu as cette option à disponibilité parce que sur la version 2000 je ne la trouve pas : Outil -> Protection -> Proteger la feuille (ou le classeur) : ensuite il m'ouvre une fenêtre avec des cases à cocher pour définir quelles sont les élements à proteger (contenu, objets, scénarios).

Est ce qu'il me faut une version plus récente d'Excel pour voir apparaître cette option dont tu parles?

Merci pour ta précieuse aide.

Bertrand.
 

MARIE74

XLDnaute Occasionnel
B) Re a tous

Re a bertrand

J'ai excel 2003 mais dans 2000 tu dois avoir la meme chose avec peut etre quelques differences dans la presentation ou le chemin a suivre.

La marche a suivre

1) Tu selectionne toute ta feuille et Clic droit protection tu coche cellule verrouillée
2) Ensuite tu selectionne sur ta feuille les cellules ou tu veux autoriser une saisie, clic droit tu decoche 'cellule verrouillée'
3) Tu va dans outils/protection/proteger le fauille et tu selectionne
uniquement 'selectionner les cellules deverouillées'
4) Avec un mot de passe si tu le veux

Cela devrait fonctionner

Bonne soirée
 
B

Bertrand

Guest
Bonsoir Marie et tout d'abord merci encore pour ta reponse.

Je tenais à te preciser que l'opération que tu me décris dans ton dernier message ne semble pas correspondre à mon besoin. En effet, je connais la manipulation que tu viens de me décrire. Elle permet de proteger DE MANIERE STATIQUE un ensemble de cellules. Mon problème est que je voudrais pouvoir proteger des cellules mais DE MANIERE DYNAMIQUE. C'est a dire que lorsque la cellule est vide alors on peut y inserer la valeur que l'on desire, mais dès lors que la valeur est saisie alors la cellule est automatiquement verouillée. Tu comprends mon besoin?
En fait concretement si tu veux savoir j'ai une fiche Excel avec des prêts clients et je voudrais pouvoir autoriser la manipulation des cellules vides pour le rajout de nouveaus prêts mais interdire toute manipulation sur les cellules qui contiennent déjà des montants saisis. J'ai eu la regrettable surprise un jour de me rendre compte que j'avais sans le faire expres effacé la valeur d'une celllule et j'aimerais que cela ne se reproduise plus!...:)

Sur ce je te souhaite à toi aussi une excellente soirée

Bertrand.
 

jeromegmc

XLDnaute Occasionnel
Salut,

Voici un code qui, lorsque la feuille est modifiée, verrouille les cellules qui ne sont pas vides. Et cela sur la plage de cellules A1:Z100.

Attention il vérifie toutes les cellules à chaque changement de ta feuille, si ta feuille comporte un nombre de données importante, précise le et je j'essayrais de simplifier la manip.


A coller dans thisworkbook:

Code:
Function mon_password()

mon_password = 'tonpassword'

End Function


Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)

ActiveSheet.Unprotect mon_password

Dim myrange As Range

Dim C As Variant

Set myrange = Range('A1:Z100')

For Each C In myrange
If C.Value <> '' Then
C.Select
Selection.Locked = True
MsgBox 'toto' 'permet de voir les cases qui sont vérifier par ce code (enleves le une fois que tu as compris)
End If
Next

ActiveSheet.Protect mon_password, DrawingObjects:=True, Contents:=True, _
Scenarios:=True


End Sub


A+
 
B

Bertrand

Guest
Bonsoir Jerome

Tout d'abord merci pour ta réponse, j'ai pu tester le bout de code envoyé : ca marche mais le probleme c'est que j'ai BEAUCOUP de cellules et ça met ENORMEMENT de temps malheureusement. C'est une solution qui techniquement est valide mais qui dans mon cas n'est pas exploitable...:(

Je suis preneur si tu as une autre façon de contourner le probleme.

Dans tous les cas merci pour tout...:))

Bonne soirée!

Bertrand.
 
B

Bertrand

Guest
Bonsoir Jerome

Tout d'abord merci pour ta réponse, j'ai pu tester le bout de code envoyé : ca marche mais le probleme c'est que j'ai BEAUCOUP de cellules et ça met ENORMEMENT de temps malheureusement. C'est une solution qui techniquement est valide mais qui dans mon cas n'est pas exploitable...:(

Je suis preneur si tu as une autre façon de contourner le probleme.

Dans tous les cas merci pour tout...:))

Bonne soirée!

Bertrand.
 

MARIE74

XLDnaute Occasionnel
B) Bonjour a toutes et a tous

météo 5° ciel dégagé


salut bertrand et jeromegmc

C'est bien ce que je pensais mais comme je te le dis dans ma premiere reponse, en VBA je ne sais pas, c'est d'un niveau trop élevé
pour l'instant mais je progresse.

Donc jeromegmc lui a un code, je le teste moi aussi et si j'ai une amelioration je te l'envoie

Bonne journée
 

_Thierry

XLDnaute Barbatruc
Repose en paix
Bonjour Bertrand, Jérome, Marie, le Forum

Une approche avec une évènementielle à placer dans le Private Module de la Feuille en Question.

Option Explicit

Private RightClick As Boolean

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
If Not RightClick Then
&nbsp; &nbsp;
On Error Resume Next
&nbsp; &nbsp; &nbsp; &nbsp;
If Not Target = Empty Then
&nbsp; &nbsp;
On Error GoTo 0
&nbsp; &nbsp; &nbsp; &nbsp; Range('A1').Select
&nbsp; &nbsp; &nbsp; &nbsp;
End If
End If
RightClick =
False
End Sub


Private Sub Worksheet_BeforeRightClick(ByVal Target As Range, Cancel As Boolean)
&nbsp; &nbsp; RightClick =
True
End Sub

Le principe : on ne protège pas les cellules non-vides, on envoie simplement l'utilisateur en 'A1' (ou ailleurs à définir) ... Cette méthode devrait être immédiate quelque soit le nombre de Cellules non vides sur la Feuille...

Pour pouvoir modifier une cellule non-vide il faudra faire deux click droits sur celle-ci...

Bonne Journée
[ol]@+Thierry[/ol]
 

jeromegmc

XLDnaute Occasionnel
Salut,

Voici le code avec une petite modification (dans le if), et normalement la macro sera longue la première fois et puis ensuite ne vérifiera que les cases modifiées, dis moi si c'est ok.


Code:
Option Explicit

 Function mon_password()

mon_password = 'tonpassword'

End Function


Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)

ActiveSheet.Unprotect mon_password

Dim myrange As Range
Dim C As Variant


Set myrange = Range('A1:Z100')

For Each C In myrange
    If C.Value <> '' And Cells(C.Row, C.Column).Locked = False Then
    C.Select
    Selection.Locked = True
    MsgBox 'toto' 'permet de voir les cases qui sont vérifier par ce code (enleves le une fois que tu as compris)
    End If
Next

ActiveSheet.Protect mon_password, DrawingObjects:=True, Contents:=True, _
Scenarios:=True

End Sub


A+

Message édité par: jeromegmc, à: 12/10/2005 08:52
 
B

Bertrand

Guest
Bonjour tout le monde...:)

Tout d'abord pour Jérôme : malheureusement c'est toujours aussi long aussi bien à la premiere modification de cellule qu'à la deuxième...:(

Thierry : j'ai essayé le bout de script que tu m'as envoyé mais à priori il n'a aucun effet sur mes données (je peux faire ce que je veux)...Je n'ai peut être pas fait la bonne manipulation???

En fait j'apporte une petite indication à mon besoin originel : Je gère des donnees financières clients dans un classeur Excel et en fait je voudrais tout simplement EMPECHER toutes modifications sur des CELLULES ENREGISTREES (ca complexifie encore plus ma demande...:( )
Cela signifie que j'aimerai pouvoir modifier des cellules autant de fois que je le désire SI ELLES SONT PHYSIQUEMENT VIDES DANS LA VERSION ENREGISTREE DE MON CLASSEUR.

Je donne cette precision car effectivement si je fais une erreur de saisie dans une cellule vide je suis bloqué!...:)

Enfin ça c'est ce que j'aimerai pouvoir faire dans le meilleur des mondes possibles...maintenant je demande peut être des choses qui ne sont pas possibles via Excel...enfin je ne suis vraiment pas du tout un expert Excel donc peut-être que quelqu'un parmi vous pourrais m'éclairer...:)

Dans tous les cas merci beaucoup pour votre precieuse aide

Bertrand
 

jeromegmc

XLDnaute Occasionnel
Re,

Voici un code qui s'appliquera avant chaque enregistrement, (pour info ce 3ème code est plus rapide, j'ai enlevé l'option 'select'



Code:
Option Explicit

Function mon_password()

mon_password = 'tonpassword'

End Function


Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)
ActiveSheet.Unprotect mon_password

Dim myrange As Range
Dim C As Variant


Set myrange = Range('A1:Z100')

For Each C In myrange
    If C.Value <> '' And C.Locked = False Then
    C.Locked = True
    End If
Next

ActiveSheet.Protect mon_password, DrawingObjects:=True, Contents:=True, _
Scenarios:=True

End Sub

A+
 

_Thierry

XLDnaute Barbatruc
Repose en paix
Bonsoir Marie, Bertrand, Jérome, le Forum

Rapidos car je suis relativement à la bourre pour changer !

Pour Marie, oui c'est assez simple, mais semble fonctionner vu que tu n'es pas revenue.

Pour Bertrand , il faut placer ce code dans le Private Module de la Feuille en Question (Click droit sur l'onglet de la feuille désirée et dans le menu contextuel 'Visualiser le Code'... Pour le reste je n'ai fait que survoler ton histoire de cellules sauvegarder... Regarde dans les archives à 'SPY' avec '@+Thierry' tu auras peut-être une piste...

Pour Jérome, il vaut mieux déclarer ton 'C' As Range car c'est bien un Objet Range dans ce context, inutile d'encombrer avec un Variant.

Bonne Soirée
[ol]@+Thierry[/ol]
 

Discussions similaires

Statistiques des forums

Discussions
312 329
Messages
2 087 334
Membres
103 519
dernier inscrit
Thomas_grc11