[Catégorie encore modifiée VB6 - VBA] Empêcher la modification d'une cellule si.

Résolu
Ericbzc Messages postés 17 Date d'inscription lundi 24 novembre 2008 Statut Membre Dernière intervention 13 décembre 2010 - 14 juil. 2010 à 11:36
us_30 Messages postés 2065 Date d'inscription lundi 11 avril 2005 Statut Membre Dernière intervention 14 mars 2016 - 28 juil. 2010 à 14:09
Bonjour à tous.

Je voudrais empêcher la modification d'une cellule par l'utilisateur, si la semaine est déjà commencée.

* j'avais pensé à worsheet.change... mais la vérification intervient après que la cellule est changée.
* Worksheet.select va empêcher l'utilisateur de sélectionner les cellules... ce qui m'embête.
* une validation ? mais la formule risque d'être un peu compliquée...

Merci d'avance
cdt, E.

10 réponses

us_30 Messages postés 2065 Date d'inscription lundi 11 avril 2005 Statut Membre Dernière intervention 14 mars 2016 10
15 juil. 2010 à 22:56
Bonsoir,

Il y a plusieurs possibilités. Par exemple si la cellule en question est A1, alors mettre le code suivant dans la feuille1 (par exemple) :

Dim Contenu As String

Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Address "$A$1" Then Range("A1") Contenu
End Sub

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
If Target.Address "$A$1" Then Contenu Range("A1").Text
End Sub


Bine sur il faut rajouter dans ton cas, le test du jour de la semaine...

Si tu préfères que la selection de la cellule ne se fasse pas, il suffit de définir une autre cible dans SelectionChange.

Amicalement,
Us.
3
Ericbzc Messages postés 17 Date d'inscription lundi 24 novembre 2008 Statut Membre Dernière intervention 13 décembre 2010
28 juil. 2010 à 09:00
Bonjour Us,

je reviens vers toi pr te faire part d'une autre solution que j'ai trouvée entre-temps
je la trouve assez élégante, et plus simple à programmer que ws_change + ws_selection


il s'agit tout simplement de application.undo !

ca donne qq chose comme ca :
Private Sub Worksheet_Change(ByVal Target As Range)
If Day(Now) = 23 Then 
  application.enableevents = false
  application.undo
  application.enableevents = true
End if
End Sub


Le app.enableevents c'est pr éviter une boucle infinie dès que tu xécutes le undo.

Voilà.
@+. Eric
3
Ericbzc Messages postés 17 Date d'inscription lundi 24 novembre 2008 Statut Membre Dernière intervention 13 décembre 2010
15 juil. 2010 à 23:30
Bonjour Us.

Merci bcp pr ta réponse.
Un doute subsiste qd même : si j'opte pr worksheet_change, la macro s'exécutant après le changement de valeur, comment faire pour l'interdire et par conséquent revenir à la valeur initiale ? (sachant que le contenu de la cellule est saisi manuellement et peut être n'importe quoi)

Merci encore.
E.
0
us_30 Messages postés 2065 Date d'inscription lundi 11 avril 2005 Statut Membre Dernière intervention 14 mars 2016 10
15 juil. 2010 à 23:41
Je ne comprend pas ce que tu veux dire. As-tu essayé le code ?

La valeur initiale de la cellule est mise dans une variable, en l'occurrence "Contenu", qui est restitué si le contenu de la cellule A1 a changé. Mais avant on sauve le "Contenu" de A1 avec SelectionChange...

Essayes, et tu comprendras...

Amicalement,
Us.
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Ericbzc Messages postés 17 Date d'inscription lundi 24 novembre 2008 Statut Membre Dernière intervention 13 décembre 2010
16 juil. 2010 à 02:33
j'ai essayé. mais worksheet_change se déclenche après le changement de la valeur de la cellule.

Je détaille :
dans la case A1, imaginons que l'utilisateur peut écrire 3 valeurs (toto, titi, tutu par exemple). c'est une saisie manuelle que je ne peux prévoir. je veux autoriser le changement de la valeur de A1 uniquement le 23 du mois.

imaginons maintenant que A1 = "Toto"
que l'on soit le 24, et que je tape tutu dans A1.

Je frappe "Tutu" + Enter. La macro worksheetchange se déclenche. elle véifie l'adresse, la date... on est le 24 donc la modif est interdite. il faudrait donc pouvoir revenir à Toto...
Mais c'est trop tard car la valeur a déjà été écrasée dans A1.

est ce que l'explication est plus claire ?

Du coup je passe pour le moment par wksheet_selection. mais c'est pas idéal... car je voudrais pouvoir autoriser la sélection de la cellule.
0
us_30 Messages postés 2065 Date d'inscription lundi 11 avril 2005 Statut Membre Dernière intervention 14 mars 2016 10
16 juil. 2010 à 10:10
Mais c'est très clair. Le code fourni répond bien à ta demande... J'ai rajouté "Bien sur il faut rajouter dans ton cas, le test du jour de la semaine... ". Mais à part ça, je ne vois où tu coinces...

Actuellement, le code fonctionne ainsi :
- Admettons qu'il y a une valeur dans A1
- Si tu changes la valeur de A1, la cellule A1 revient à son contenu initial. (IL laisse la modification se faire, mais elle ne sera prise en compte, donc...)

Tu as tout le principe de base que tu as besoin. Maintenant, c'est peut-être le problème de la date qui te gêne... Mais cela se rajoute simplement en faisant un test. Dans le principe : Si jour=23 alors sort de la procédure... et le tour est joué...

Plus précisément, voici le code pour le jour 23, qui te laisseras la main pour la modification de la cellule A1, sinon après toute modification la cellule reviendra à sa valeur initiale :

Dim Contenu As String

Private Sub Worksheet_Change(ByVal Target As Range)
If Day(Now) = 23 Then Exit Sub
If Target.Address "$A$1" Then Range("A1") Contenu
End Sub

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
If Target.Address "$A$1" Then Contenu Range("A1").Text
End Sub


On peut compléter à souhait... Par exemple, totalement interdit la saisie et renvoyer un message, etc... C'est toujours le même principe... Est-ce plus clair maintenant ?

Les événements SelectChange se déclenche au début dès la sélection de la cellule, Change se déclenche seulement si la validation du contenu est différente de ce qui avait avant l'activation de la cellule...

Amicalement,
Us.
0
Ericbzc Messages postés 17 Date d'inscription lundi 24 novembre 2008 Statut Membre Dernière intervention 13 décembre 2010
16 juil. 2010 à 11:29
Ahhhhhh... ca y est j'ai compris mon erreur !!!


Je croyais que je devais utiliser au choix un worksheet_change OU un worksheet_select.
et pas les 2 simultanément....

Donc forcément, avec le Worksheet_change seul, la valeur de la cellule est bien écrasée... et je ne peux la récupérer
SAUF si j'ai un worksheet_select qui a mémorisé la valeur avant...

Bien vu.

Merci beaucoup beaucoup pr ta patience et tes explications...
Eric
0
Ericbzc Messages postés 17 Date d'inscription lundi 24 novembre 2008 Statut Membre Dernière intervention 13 décembre 2010
16 juil. 2010 à 11:31
ps : c'est le "plusieurs possibilités" de ton 1er message + en écho à différentes choses lues sur des forums avant mon message qui m'ont 'enduit' d'erreur....

Toutes mes excuses....
0
us_30 Messages postés 2065 Date d'inscription lundi 11 avril 2005 Statut Membre Dernière intervention 14 mars 2016 10
16 juil. 2010 à 12:31
Pas de problème...

A+

Amicalement,
Us.
0
us_30 Messages postés 2065 Date d'inscription lundi 11 avril 2005 Statut Membre Dernière intervention 14 mars 2016 10
28 juil. 2010 à 14:09
Euh, cela fonctionne probablement en général... mais seulement en général... Comment tu as la certitude que faire un "undo" s'applique bien qu'à ta cellule et à cette dernière action ?
-> La seule chance que tu as c'est que l'exécution du code code est très rapide donc il y a peu de risque qu'une autre action soit prise en compte... Mais le risque n'est pas permis en programmation. Pour ma part, ta solution n'est donc pas identique, même si potentiellement identique.

Après à toi de voir, si tu préfères... Bien pensé toutefois...

Amicalement,
Us.
0
Rejoignez-nous