Ecrire un mot dans une cellule lorsqu'une condition est remplie

gillmo

XLDnaute Occasionnel
Bonjour,

J'ai repris un code VBA que j'ai trouvé sur le forum et j'ai essayé de l'adapter un peu à ma problèmatique. Le problème c'est que je n'arrive pas à obtenir ce que je souhaite. Je vous met un fichier pour exemple.

Dans mon exemple, je souhaiterai dès lors que dans la colonne noté X il y a un oui, il y ai écrit "cf synthèse" dans la colonne noté Y et que la cellule soit verrouillé. Si c'est non ou vide alors la cellule correspondante dans la colonne Y n'est pas verrouillé

Je ne sais pas si je suis très clair.

merci de votre aide
 

Pièces jointes

  • test.xls
    59.5 KB · Affichages: 48
  • test.xls
    59.5 KB · Affichages: 54
  • test.xls
    59.5 KB · Affichages: 46

gillmo

XLDnaute Occasionnel
Re : Ecrire un mot dans une cellule lorsqu'une condition est remplie

Merci pour ta réponse.

en fait il ne faut pas verrouiller le oui mais par contre si jamais je change le oui en vide ou non j'aimerai que la case Y redevienne vide.

Par contre, j'aurai aimé corriger mon code au lieu d'utiliser le tien si cela est possible, non pas qu'il ne me va pas, mais plutôt pour apprendre de mes erreurs.

Cdlt.
 
G

Guest

Guest
Re : Ecrire un mot dans une cellule lorsqu'une condition est remplie

Re,

Ben justement, il y a un peu tout qui n'allait pas.
1 - les variables qui contiennent des n° de lignes sont de type Long et non Integer
2 - l'évènement change est appelé sur n'importe quel changement de n'importe quelle cellule ou plage de cellules:
si tu changes une cellule (d'une quelconque colonne) l'évènement va être appelé avec pour Paramètre 'Target' , la cellule
ton code regarde si la ligne de Target est entre 4 et 104 (bornes comprises)
il test la la colonne G pour la ligne n
Si G est = "oui" il change la valeur de la colonne J qui rappel l'évènement change pour la ligne r et la colonne j qui va retester la colonne G qui sera toujours oui, qui va re modifier la colonne J qui va rappeler l'évènement change ....and so, and so....on tourne en boucle, jusqu'à saturer la mémoire.

donc voici ton code corrigé, mais non optimisé car il va être exécuté pour chaque changement de n'importe quel cellule comprise dans la plage A4 IV104.

Code:
Private Sub Worksheet_Change(ByVal Target As Range)
Dim r As Long, c As Range
r = Target.Row
Select Case r
Case 4 To 103
    Set c = Range("G" & r)
    If c = "oui" Then
        Application.EnableEvents = False 'empêche le rappel de l'évènement Change
        ActiveSheet.Unprotect Password:="toto"
        With Range("J" & r).Cells
            .Value = "cf Synthèse"
            .Locked = True
        End With
        ActiveSheet.Protect Password:="toto"
        Application.EnableEvents = True
    End If
End Select
End Sub

C'est pourqoi je te proposais les modifications de mon précédent post.

Pour la seconde question je te propose:
Dim Valeur as variant
Valeur= iif(C="Oui", "cf Synthèse",Empty)

Tu n'auras plus qu'à mettre:

.Value = Valeur
Entre With et End With

A+
 
Dernière modification par un modérateur:
G

Guest

Guest
Re : Ecrire un mot dans une cellule lorsqu'une condition est remplie

Re,

gillmo post#3 à dit:
Par contre, j'aurai aimé corriger mon code au lieu d'utiliser le tien si cela est possible, non pas qu'il ne me va pas, mais plutôt pour apprendre de mes erreurs.

Si tu veux apprendre de tes erreurs, alors il faut nous les montrer. Où sont tes tentatives d'adaptation du code donné plus haut?

A+
 

gillmo

XLDnaute Occasionnel
Re : Ecrire un mot dans une cellule lorsqu'une condition est remplie

en fait je suis reparti du code que tu m'avais corrigé, mais celui ci ne donne rien. Je change n'importe quelle cellule en oui ou non mais rien ne change en face.

Je creuse le problème.
 
G

Guest

Guest
Re : Ecrire un mot dans une cellule lorsqu'une condition est remplie

Re,

Attention: Application.EnableEvents = False arrête la gestion des évènements alors si ta macro c'est arrêter après cette instruction et avant Application.EnableEvents = True
la gestion des évènement reste bloquée

Dans l'éditeur de macro Fait CTRL+G pour afficher la fenêtre Exécution
tape dans cette dernière (point d'interrogation compris):
?Application.EnableEvents
Puis valide
si tu vois apparaître False c'est que la gestion évènementielle est arrêtée
alors tape (toujours dans la même fenêtre et sans point d'interrogation)
Application.EnableEvents = True
puis valide

Tu peux éventuellement mettre dans la macro un On Error Resume Next avant la ligne
Application.EnableEvents = False

Sinon, je ne vois pas ce qui te bloque

A+
 

gillmo

XLDnaute Occasionnel
Re : Ecrire un mot dans une cellule lorsqu'une condition est remplie

J'ai intégré la fonction compléte mais je pense que j'ai fait une erreur puisque cela ne fonctionne pas.

ci joint mon fichier
 

Pièces jointes

  • test.xls
    59.5 KB · Affichages: 38
  • test.xls
    59.5 KB · Affichages: 39
  • test.xls
    59.5 KB · Affichages: 37

gillmo

XLDnaute Occasionnel
Re : Ecrire un mot dans une cellule lorsqu'une condition est remplie

J'ai fait une modification du code sur le fichier test 2, je pense que c'est une approche qui pourrait fonctionner mais je dois avoir un problème de syntaxe.
 

Pièces jointes

  • test 2.xls
    60.5 KB · Affichages: 41
  • test 2.xls
    60.5 KB · Affichages: 40
  • test 2.xls
    60.5 KB · Affichages: 43
G

Guest

Guest
Re : Ecrire un mot dans une cellule lorsqu'une condition est remplie

Re,

Voilà qui est corrigé, mais toujours pas optimiser pour prendre en compte que les changement sur la bonne colonne "G"

Code:
Private Sub Worksheet_Change(ByVal Target As Range)
    Dim r As Long, c As Range, Valeur As Variant
    r = Target.Row
    Select Case r
    Case 4 To 103
        Set c = Range("G" & r)
        Valeur = IIf(c = "oui", "cf Synthèse", Empty)
        On Error Resume Next
        Application.EnableEvents = False    'empêche le rappel de l'évènement Change
        ActiveSheet.Unprotect Password:="toto"
        With Range("J" & r).Cells
            .Value = Valeur
            .Locked = True
        End With
        ActiveSheet.Protect Password:="toto"
        Application.EnableEvents = True
    End Select
End Sub

le .Locked = True n'est pas non plus très utile.
Vérouille toutes les cellule de la colonne J par le menu Format Cellule, les changements se feront quand même puisque qu'on déprotège par macro.

A+
 

gillmo

XLDnaute Occasionnel
Re : Ecrire un mot dans une cellule lorsqu'une condition est remplie

super ca fonctionne bien

seul petit bémol, c'est qu'en fait je souhaiterai que la cellule en colonne J soit deverouiller lorsque je met non ou vide. J'ai fait le test en sélectionnant la colonne et dans format cellule j'ai décoché verrouillé. Ca fonctionne pour les cellule vide ou à non, par contre dès que je change une cellule oui en cellule non, la cellule correspondante en J ne se deprotége pas.
 

gillmo

XLDnaute Occasionnel
Re : Ecrire un mot dans une cellule lorsqu'une condition est remplie

j'ai fait évoluer le code, cela me donne à peu près ce que je souhaite sur la forme. Maintenant ce qui me pose problème, c'est que je voudrai lorsque l'on choisit non ou vide, la cellule ne soit pas verrouiller (ca marche quand on choisit non mais pas lorsque on laisse vide).

Et surtout lorsque je choisi non ou vide que je puisse saisir une donnée dans la cellule, et pour l'instant si je saisi une donnée, celle ci est automatiquement effacée.
 

Pièces jointes

  • test(1).xls
    49 KB · Affichages: 42
  • test(1).xls
    49 KB · Affichages: 43
  • test(1).xls
    49 KB · Affichages: 42
G

Guest

Guest
Re : Ecrire un mot dans une cellule lorsqu'une condition est remplie

Bonjour,

Il faut que tu limites l'évènement change à la colonne G (comme je l'ai fait hier dans ma première réponse). Sinon, c'est normal que ta cellule se vide, même non vérrouillée.

Mais si tu t'entête dans ta démarche et à ne pas vouloir modifier ton code, je passe la main

A+
 

gillmo

XLDnaute Occasionnel
Re : Ecrire un mot dans une cellule lorsqu'une condition est remplie

j'ai enfin modifié mon code comme tu me l'as indiqué et effectivement cela fonctionne niquel

code
Private Sub Worksheet_Change(ByVal Target As Range)
Dim r As Long, c As Range, j As Range
If Target.Count > 1 Then Exit Sub
If Target.Column <> 7 Or Target.Row < 4 Or Target.Row > 103 Then Exit Sub
r = Target.Row
Select Case r
Case 4 To 103
Set c = Range("G" & r)
Set j = Range("j" & r)
Application.EnableEvents = False 'empêche le rappel de l'évènement Change
If c = "oui" Then
j = "cf synthèse"
End If
On Error Resume Next
If c = "oui" Then
MsgBox "ne pas oublier d'aller dans l'onglet NAO"
End If
If c <> "oui" Then
j.ClearContents
End If
Application.EnableEvents = True
End Select
End Sub


merci encore pour ta patience
 

Discussions similaires

Réponses
10
Affichages
224

Statistiques des forums

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