Empêcher la modification de valeur sous condition

GS82

XLDnaute Occasionnel
Salut
je souhaite faire ceci:
lorsque la valeur de la cellule B1est vide
l'utilisateur peut soit supprimer soit modifier la valeur dans la cellule A1 a son gré

lorsque la cellule B1 n'est pas vide
l'utilisateur ne peut plus supprimer la valeur dans A1
et s'il veut changer la valeur dans A1, cette dernière doit être différente de celle saisie dans B2.

:)
je suis à votre disposition !!
 

GS82

XLDnaute Occasionnel
Re : Empêcher la modification de valeur sous condition

c'est en fait une sorte de pile
tq nous avons des cellule
A1 B1 C1 D1 E1 et...
Chaque cellule renferme des données

une fois que B1.value est <> de vide

je ne peux plus supprimer A1, je ne peux que modifier sa valeur et ceci sous la condition que la nouvelle valeur de A1 soit differentes de celle de B1



même chose si la cellule M1 par exemple n'est plus vide
je ne peux plus supprimer aucune des valeurs des cellules qui se retrouvent en amont de M1 cad A1 B1 ...K1 L1
et si je change une des valeurs de ces cellules elle doit etre différente des valeurs des autres cellules A1...M1

:)
dispo
 

Pierre-Henry

XLDnaute Junior
Re : Empêcher la modification de valeur sous condition

Bonsoir,
Avec ton histoire de pile, je pense que tu n'as pas du perturber que moi....c'était plutôt clair avant, mais alors après.... :D

Voila un petit bout de code....néanmoins je ne sais pas comment enregistrer la valeur/formule en A1 afin de la remettre dans le cas ou on tenterait une action "interdite", donc pour l'instant il se re-place en A1, et impose la saisie (avec un espace)...

Code:
Private Sub Worksheet_Change(ByVal Target As Range)
If Target = Range("A1") Then
    If Range("B1") <> "" Then
        If Range("A1") = "" Or Range("A1").Value = Range("B1").Value Then
'            MsgBox "Erreur : action interdite en A1"
            Range("A1").Select
            Application.SendKeys (" ")
        End If
    End If
End If
End Sub

(code à placer dans la feuille concernée)

Cordialement
 

GS82

XLDnaute Occasionnel
Re : Empêcher la modification de valeur sous condition

bonsoir
ouai pierre-henry c'est vraiment assez genant, pour moi aussi !!
en fait le problème et que j'ai des saisi a faire
et je veux obligé l'agent de saisi a ne plus pouvoir supprimer les enregistrements anterieurs d'une façon aléatoire, mais en respectant une sorte de lifo (last in first out)
et lors de la modification je dois veiller à ne pas inserer generer des doublons
voila !!
et merci pour ta réponse ;)
 

GS82

XLDnaute Occasionnel
Re : Empêcher la modification de valeur sous condition

un autre truc
l'algorithme doit parcourir toute la liste des valeurs existantes et non seulement A et B comme l'exemple de pierre-henry


cad que je peux avoir les données enregistrées dans des cellules A1,B1,C1,...,Z1

donc si une fois je touche a une valeur dans cette liste
si c'est Z,
si Z devient = "", pas de problème c'est le dernier de la liste
si la nouvelle valeur de Z = a une valeur deja saisie dans la liste pas de problème (je sais comment empecher les doublons)
si c'est pas Z alors la :S
si la je supprime la valeur alors erreur il faut pas que je fasse ceci
sinon si je change la cellule selectionnée alors la nouvelle valeur ne doit pas exister ailleur dans la liste sinon la cellule garde sa valeur initiale


:(
je sais c'est un peu complexe mais bon !! je dois trouver une solution, j'ai des agents de saisis qui peuvent tous faire avec les données !!
 

Pierre-Henry

XLDnaute Junior
Re : Empêcher la modification de valeur sous condition

Re-bonsoir,
Voici une solution pour l'histoire de pile (en relisant j'ai compris cette fois ;))
Si j'ai bien compris, lorsque l'on modifie en D1 par exemple, il suffit de vérifier que E1 soit vide ou non (puisque si n'importe laquelle après est non vide, tout ce qui précède est non-vide....).

Je suis donc parti de là.
Pour l'égalité, j'ai juste vérifié avec la cellule suivante (donc si on modifie B1, si B1<>C1 ça marche, même si B1=D1....à voir en fonction de ce que tu veux)

Enfin j'ai remplacé l'espace par un #ERR. bien plus voyant et gênant, mais toujours pas de solution pour retourner à la valeur d'origine...

Enfin, je ne teste toujours que sur la première ligne....c'est pareil, à voir en fonction de ce que tu désires....

Code:
Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Row = 1 Then
    If Target.Offset(0, 1) <> "" Then
        If Target.Value = "" Or Target.Value = Target.Offset(0, 1).Value Then
'            MsgBox "Erreur : action interdite en A1"
            Target.Select
            Application.SendKeys ("#ERR.")
        End If
    End If
End If
End Sub

Ce n'est pas parfait, mais j'espère que ça aide un peu....

Cordialement

EDIT: Aïe, je viens de lire "la nouvelle valeur ne doit pas exister ailleur dans la liste"....ça contredit "mes" hypothèses....je me re-penche dessus tout de suite....
 
Dernière édition:

myDearFriend!

XLDnaute Barbatruc
Re : Empêcher la modification de valeur sous condition

Bonsoir GS82, Pierre-Henry,

Si j'ai bien compris l'ensemble des contraintes, peut-être une autre façon de faire :
Code:
[COLOR=GRAY][B][I]DANS LE MODULE DE CODE DE LA FEUILLE[/I][/B][/COLOR]

[COLOR=NAVY]Option Explicit[/COLOR]

[COLOR=NAVY]Private Sub[/COLOR] Worksheet_Change([COLOR=NAVY]ByVal[/COLOR] Target [COLOR=NAVY]As[/COLOR] Range)
[COLOR=GREEN]'myDearFriend! - www.mdf-xlpages.com[/COLOR]
[COLOR=NAVY]Dim[/COLOR] Plage [COLOR=NAVY]As[/COLOR] Range
    [COLOR=NAVY]With[/COLOR] Application
        [COLOR=GREEN]'On empêche l'utilisateur d'agir sur une plage entière[/COLOR]
        [COLOR=NAVY]If[/COLOR] Target.Count > 1 [COLOR=NAVY]Then[/COLOR]
            .Undo
            [COLOR=NAVY]Exit Sub
        End If[/COLOR]
        
        [COLOR=GREEN]'Pour limiter le traitement à la seule ligne "1", il faut décommenter la ligne de code suivante :[/COLOR]
        [COLOR=GREEN]'If .Intersect(Target, Rows(1)) Is Nothing Then Exit Sub[/COLOR]
        
        [COLOR=GREEN]'On définit la plage de traitement (cellules en ligne)[/COLOR]
        [COLOR=NAVY]Set[/COLOR] Plage = Range(Cells(Target.Row, 1), Cells(Target.Row, 256).[COLOR=NAVY]End[/COLOR](xlToLeft))
        [COLOR=GREEN]'Seule la dernière cellule de la plage peut être effacée[/COLOR]
        [COLOR=NAVY]If[/COLOR] .CountBlank(Plage.Resize(, Plage.Columns.Count - 1)) [COLOR=NAVY]Then[/COLOR]
            .Undo
            [COLOR=NAVY]Exit Sub
        End If[/COLOR]
        [COLOR=GREEN]'On empêche les doublons[/COLOR]
        [COLOR=NAVY]If[/COLOR] .CountIf(Plage, Target) > 1 [COLOR=NAVY]Then[/COLOR] .Undo
    [COLOR=NAVY]End With
End Sub[/COLOR]
Pierre-Henry, je pense que c'est Application.Undo qui te manquait "pour retourner à la valeur d'origine".;)

Cordialement,
 
Dernière édition:

GS82

XLDnaute Occasionnel
Re : Empêcher la modification de valeur sous condition

salut Lii mydearfreind et pierre henry
@mydearfreind
drole de coincidence j'était a l'instant dans ton forum en train de fouiller pour trouver une réponse et je me suis demandé est ce qu'avec un forum pareil que le tien t'aurais du temps pour jeter un coup d'oeuil sur ce forume...
et puis .... j'ai eu la réponse ;)
je vais voire ce que ca donne et je reviens :D
 

Discussions similaires