OVH Cloud OVH Cloud

macro mise en forme conditionnelle décalée

17 réponses
Avatar
j-pascal
Bonjour à toutes et à tous,
Je fais mon entrée sur le forum, merci d'être indulgent(e)s ! Pour l'adresse
de messagerie, je n'ai pas osé car le forum me paraît être déjà un lieu
d'échanges...
Voici ma question :

En fonction du contenu de la cellule A1, je veux une mise en forme dans la
zone (C1:F1) idem pour la cellule A2 et la zone (C2:F2), etc. Le prob, est
que ça marche la première fois mais quand la valeur A1 change, la mise en
forme de la zone (C1:F1) ne change pas... Et si je veux affecter plusieurs
mises en forme dans la zone (C1:F1)en fonction de différentes valeurs dans
la celulle A1, alors là je sèche lamentablement. Comme je l'ai plus ou moins
indiqué, je souhaite évidemment que cette MEF soit étendues aux lignes
suivantes...

<Ci-après, ce que j'ai fait (à titre d'exemple), sachant que ça ne peut pas
marcher... :

Private Sub Worksheet_Change(ByVal Target As Range)

Application.ScreenUpdating = False
On Error Resume Next

If Target.Value = toto Then
Target(1, 4).Interior.ColorIndex = 30
Target(1, 5).Interior.ColorIndex = 28
Target.Font.ColorIndex = 2
Else (et là le "else" n'a évidemment aucun effet !")
Target(1, 4).Interior.ColorIndex = 28
Target.Font.ColorIndex = 4


If Target.Value = titi Then
Target(1, 4).Interior.ColorIndex = 32
Target(1, 5).Interior.ColorIndex = 29
Target.Font.ColorIndex = 2
Else
Target(1, 4).Interior.ColorIndex = 28
Target.Font.ColorIndex = 4

End If

Merci à celui ou celle... A+

7 réponses

1 2
Avatar
j-pascal
Bonsoir Jacky et merci pour cette réponse rapide, courte et efficace.

J'ai découvert de nouveaux "petits problèmes"... :
1 - si dans "A1" on met la formule "=si(B1=0;"toto";"")", "toto" s'inscrit
dans A1 quand B1=0, mais cela ne provoque pas de MEFC !
2 - si on saisie "toto" dans A1 et que l'on fait une recopie en bas (par
ex), seule la première cellule provoque la MEFC !
3 - si on saisit successivement "toto" dans A1, A2, A3, etc, la MEFC
s'applique, mais si on efface la zone précédemment saisie, la MEFC ne change
pas alors que "toto" ne figure plus dans la cellule cible ! Et pire, si on
supprime le contenu de cette zone et de cellule adjacentes, cela provoque
des MEFC !!!

Rappel du code en cours (légèrement modifé en fonction de tes réponses) :

Private Sub Worksheet_Change(ByVal Target As Range)

Application.ScreenUpdating = False
On Error Resume Next
If Target.Column = 1 Then
If Target.Value = "toto" Then
Target(1, 4).Interior.ColorIndex = 30
Target(1, 5).Interior.ColorIndex = 28
'Target.Font.ColorIndex = 2 (modifie cellule de saisie !)
ElseIf Target.Value = "titi" Then
Target(1, 4).Interior.ColorIndex = 32
Target(1, 5).Interior.ColorIndex = 29
'Target.Font.ColorIndex = 2
Else
Target(1, 4).Interior.ColorIndex = Null
Target(1, 5).Interior.ColorIndex = Null
Target.Font.ColorIndex = 1
End If
End If
End Sub
D'avance, un grand merci
Avatar
Jacky
Re..
Puisque tu tiens à un code événementiel.......
Ceci pourrait convenir,
Les 'Offset' sont à adapter..
'---------
Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Column = 1 Then
For Each c In Range("A1:A" & Range("A65536").End(xlUp).Row)
If c.Value = "toto" Then
c.Offset(0, 4).Interior.ColorIndex = 30
c.Offset(0, 5).Interior.ColorIndex = 28
c.Font.ColorIndex = 2 '(modifie cellule de saisie !)
ElseIf c.Value = "titi" Then
c.Offset(0, 4).Interior.ColorIndex = 32
c.Offset(0, 5).Interior.ColorIndex = 29
c.Font.ColorIndex = 2
Else
c.Offset(0, 4).Interior.ColorIndex = Null
c.Offset(0, 5).Interior.ColorIndex = Null
c.Font.ColorIndex = 1
End If
Next
End If
End Sub
'-----------
Bon courage
JJ


"j-pascal" a écrit dans le message de
news:%
Bonsoir Jacky et merci pour cette réponse rapide, courte et efficace.

J'ai découvert de nouveaux "petits problèmes"... :
1 - si dans "A1" on met la formule "=si(B1=0;"toto";"")", "toto" s'inscrit
dans A1 quand B1=0, mais cela ne provoque pas de MEFC !
2 - si on saisie "toto" dans A1 et que l'on fait une recopie en bas (par
ex), seule la première cellule provoque la MEFC !
3 - si on saisit successivement "toto" dans A1, A2, A3, etc, la MEFC
s'applique, mais si on efface la zone précédemment saisie, la MEFC ne
change

pas alors que "toto" ne figure plus dans la cellule cible ! Et pire, si on
supprime le contenu de cette zone et de cellule adjacentes, cela provoque
des MEFC !!!

Rappel du code en cours (légèrement modifé en fonction de tes réponses) :

Private Sub Worksheet_Change(ByVal Target As Range)

Application.ScreenUpdating = False
On Error Resume Next
If Target.Column = 1 Then
If Target.Value = "toto" Then
Target(1, 4).Interior.ColorIndex = 30
Target(1, 5).Interior.ColorIndex = 28
'Target.Font.ColorIndex = 2 (modifie cellule de saisie !)
ElseIf Target.Value = "titi" Then
Target(1, 4).Interior.ColorIndex = 32
Target(1, 5).Interior.ColorIndex = 29
'Target.Font.ColorIndex = 2
Else
Target(1, 4).Interior.ColorIndex = Null
Target(1, 5).Interior.ColorIndex = Null
Target.Font.ColorIndex = 1
End If
End If
End Sub
D'avance, un grand merci




Avatar
Jacky
Re..Re..
1 - si dans "A1" on met la formule "=si(B1=0;"toto";"")", "toto"
s'inscrit


dans A1 quand B1=0, mais cela ne provoque pas de MEFC !



Pour egalement tenir compte de la colonne B, modifie cette ligne
'---------
If Target.Column = 1 Or Target.Column = 2 Then
'----------

JJ

"Jacky" a écrit dans le message
de news:%23$
Re..
Puisque tu tiens à un code événementiel.......
Ceci pourrait convenir,
Les 'Offset' sont à adapter..
'---------
Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Column = 1 Then
For Each c In Range("A1:A" & Range("A65536").End(xlUp).Row)
If c.Value = "toto" Then
c.Offset(0, 4).Interior.ColorIndex = 30
c.Offset(0, 5).Interior.ColorIndex = 28
c.Font.ColorIndex = 2 '(modifie cellule de saisie !)
ElseIf c.Value = "titi" Then
c.Offset(0, 4).Interior.ColorIndex = 32
c.Offset(0, 5).Interior.ColorIndex = 29
c.Font.ColorIndex = 2
Else
c.Offset(0, 4).Interior.ColorIndex = Null
c.Offset(0, 5).Interior.ColorIndex = Null
c.Font.ColorIndex = 1
End If
Next
End If
End Sub
'-----------
Bon courage
JJ


"j-pascal" a écrit dans le message de
news:%
Bonsoir Jacky et merci pour cette réponse rapide, courte et efficace.

J'ai découvert de nouveaux "petits problèmes"... :
1 - si dans "A1" on met la formule "=si(B1=0;"toto";"")", "toto"
s'inscrit


dans A1 quand B1=0, mais cela ne provoque pas de MEFC !
2 - si on saisie "toto" dans A1 et que l'on fait une recopie en bas (par
ex), seule la première cellule provoque la MEFC !
3 - si on saisit successivement "toto" dans A1, A2, A3, etc, la MEFC
s'applique, mais si on efface la zone précédemment saisie, la MEFC ne
change

pas alors que "toto" ne figure plus dans la cellule cible ! Et pire, si
on


supprime le contenu de cette zone et de cellule adjacentes, cela
provoque


des MEFC !!!

Rappel du code en cours (légèrement modifé en fonction de tes réponses)
:



Private Sub Worksheet_Change(ByVal Target As Range)

Application.ScreenUpdating = False
On Error Resume Next
If Target.Column = 1 Then
If Target.Value = "toto" Then
Target(1, 4).Interior.ColorIndex = 30
Target(1, 5).Interior.ColorIndex = 28
'Target.Font.ColorIndex = 2 (modifie cellule de saisie !)
ElseIf Target.Value = "titi" Then
Target(1, 4).Interior.ColorIndex = 32
Target(1, 5).Interior.ColorIndex = 29
'Target.Font.ColorIndex = 2
Else
Target(1, 4).Interior.ColorIndex = Null
Target(1, 5).Interior.ColorIndex = Null
Target.Font.ColorIndex = 1
End If
End If
End Sub
D'avance, un grand merci









Avatar
j-pascal
Bonsoir Jacky et merci. Sur ce dernier point, je me suis mal expliqué. Dans
l'exemple : si dans "A1" on met la formule "=si(B1=0;"toto";""), alors on
est d'accord que "toto" s'inscrit dans A1 si B1=0 ! Mais le "toto" (qui
apparait bien dans la colonne 1) n'entraine pas de MEFC ! Et dans
l'application que je veux traiter, les "toto" apparaissent tjs en fonction
d'une formule et jamais après saisie ! En fait, selon vba, le toto saisi
n'est pas égal à un toto formule... Par contre la MEFC pour cette ligne
fonctionne si on saisit un "toto" dans une autre ligne !
Par ailleurs, quand je supprime les toto (suppr), la MEFC ne change pas
spontanément mais sous l'effet d'une autre action, sur une autre ligne...

Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Column = 1 Then
For Each c In Range("A1:A" & Range("A65536").End(xlUp).Row)
If c.Value = "toto" Then
c.Offset(0, 4).Interior.ColorIndex = 30
c.Offset(0, 5).Interior.ColorIndex = 28
c.Font.ColorIndex = 2 '(modifie cellule de saisie !)
ElseIf c.Value = "titi" Then
c.Offset(0, 4).Interior.ColorIndex = 32
c.Offset(0, 5).Interior.ColorIndex = 29
c.Font.ColorIndex = 2
Else
c.Offset(0, 4).Interior.ColorIndex = Null
c.Offset(0, 5).Interior.ColorIndex = Null
c.Font.ColorIndex = 1
End If
Next
End If
End Sub
Peut-être à bientôt... en espérant que mes explications soient "claires"...




Avatar
Jacky
Re..

l'exemple : si dans "A1" on met la formule "=si(B1=0;"toto";""), alors on
est d'accord que "toto" s'inscrit dans A1 si B1=0 ! Mais le "toto" (qui
apparait bien dans la colonne 1) n'entraine pas de MEFC


Normal, l'excecution du code se fait selon le controle de la colonne target,
ici colonne A.
Avec une entrée conditionnelle en colonne B target devient B, d'ou la
necessité de faire le controle sur la colonne d'entrée(target) et non pas
sur la colonne cible(A)
If Target.Column = 1 Then doit être la colonne d'entrée, ici colonne A

Par ailleurs, quand je supprime les toto (suppr), la MEFC ne change pas
spontanément mais sous l'effet d'une autre action, sur une autre ligne...


Si, si avec le dernier code, à condition que 'toto' soit en colonne A et que
le controle de target soit la / les colonne(s) d'entrée.

JJ

"j-pascal" a écrit dans le message de
news:%
Bonsoir Jacky et merci. Sur ce dernier point, je me suis mal expliqué.
Dans

l'exemple : si dans "A1" on met la formule "=si(B1=0;"toto";""), alors on
est d'accord que "toto" s'inscrit dans A1 si B1=0 ! Mais le "toto" (qui
apparait bien dans la colonne 1) n'entraine pas de MEFC ! Et dans
l'application que je veux traiter, les "toto" apparaissent tjs en fonction
d'une formule et jamais après saisie ! En fait, selon vba, le toto saisi
n'est pas égal à un toto formule... Par contre la MEFC pour cette ligne
fonctionne si on saisit un "toto" dans une autre ligne !
Par ailleurs, quand je supprime les toto (suppr), la MEFC ne change pas
spontanément mais sous l'effet d'une autre action, sur une autre ligne...

Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Column = 1 Then
For Each c In Range("A1:A" & Range("A65536").End(xlUp).Row)
If c.Value = "toto" Then
c.Offset(0, 4).Interior.ColorIndex = 30
c.Offset(0, 5).Interior.ColorIndex = 28
c.Font.ColorIndex = 2 '(modifie cellule de saisie !)
ElseIf c.Value = "titi" Then
c.Offset(0, 4).Interior.ColorIndex = 32
c.Offset(0, 5).Interior.ColorIndex = 29
c.Font.ColorIndex = 2
Else
c.Offset(0, 4).Interior.ColorIndex = Null
c.Offset(0, 5).Interior.ColorIndex = Null
c.Font.ColorIndex = 1
End If
Next
End If
End Sub
Peut-être à bientôt... en espérant que mes explications soient


"claires"...







Avatar
j-pascal
Normal, l'excecution du code se fait selon le controle de la colonne
target,

ici colonne A.
Avec une entrée conditionnelle en colonne B target devient B, d'ou la
necessité de faire le controle sur la colonne d'entrée(target) et non pas
sur la colonne cible(A)
If Target.Column = 1 Then doit être la colonne d'entrée, ici colonne A


C'est dur pour mon petit cerveau...
Tu veux dire que si les valeurs de la colonne A sont "dépendantes" d'une
autre colonne, c'est cette autre colonne qui est la target ?? Ca devient
compliqué ! Je te résume mon application. (très synthétiquement) : j'ai un
tableau de 10 colonnes. Dans la colonne 5, j'ai des dates. Dans la colonne 4
j'affiche "FIN" si la date de la colonne 5 est antérieure à la date
d'aujourd'hui, etc pour toute la colonne... En D1 (D2, etc) j'ai
=(si(E1<aujourdhui();"FIN";"")). J'ai besoin d'une MEFC pour toute la ligne
(10 colonnes, mais pas plus !), un motif, si la colonne 4 affiche "FIN".
Précision, quand je génére un tri de mon tableau, les lignes n'apparaissent
pas dans le même ordre, la MEFC ne doit donc pas "persister" car pour la
nouvelle ligne, la condition n'est peut-être plus remplie pour avoir le mot
"FIN".
Tu vas peut-être me dire que dans ce cas, je dois faire une requête non plus
sur un mot ("FIN") mais directement sur la date ?
Dans l'attente fébrile de ta réponse (éventuelle), je te souhaite une bonne
journée. A+






Par ailleurs, quand je supprime les toto (suppr), la MEFC ne change pas
spontanément mais sous l'effet d'une autre action, sur une autre
ligne...



Si, si avec le dernier code, à condition que 'toto' soit en colonne A et
que

le controle de target soit la / les colonne(s) d'entrée.

JJ

"j-pascal" a écrit dans le message de
news:%
Bonsoir Jacky et merci. Sur ce dernier point, je me suis mal expliqué.
Dans

l'exemple : si dans "A1" on met la formule "=si(B1=0;"toto";""), alors
on


est d'accord que "toto" s'inscrit dans A1 si B1=0 ! Mais le "toto" (qui
apparait bien dans la colonne 1) n'entraine pas de MEFC ! Et dans
l'application que je veux traiter, les "toto" apparaissent tjs en
fonction


d'une formule et jamais après saisie ! En fait, selon vba, le toto saisi
n'est pas égal à un toto formule... Par contre la MEFC pour cette ligne
fonctionne si on saisit un "toto" dans une autre ligne !
Par ailleurs, quand je supprime les toto (suppr), la MEFC ne change pas
spontanément mais sous l'effet d'une autre action, sur une autre
ligne...



Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Column = 1 Then
For Each c In Range("A1:A" & Range("A65536").End(xlUp).Row)
If c.Value = "toto" Then
c.Offset(0, 4).Interior.ColorIndex = 30
c.Offset(0, 5).Interior.ColorIndex = 28
c.Font.ColorIndex = 2 '(modifie cellule de saisie !)
ElseIf c.Value = "titi" Then
c.Offset(0, 4).Interior.ColorIndex = 32
c.Offset(0, 5).Interior.ColorIndex = 29
c.Font.ColorIndex = 2
Else
c.Offset(0, 4).Interior.ColorIndex = Null
c.Offset(0, 5).Interior.ColorIndex = Null
c.Font.ColorIndex = 1
End If
Next
End If
End Sub
Peut-être à bientôt... en espérant que mes explications soient


"claires"...











Avatar
Jacky
Re..
A mon avis pas besoin de code, MFC suffit.

Mais, euh pas très clair. Questions:
un motif, si la colonne 4 affiche "FIN".
Si tu veux un motif quand colonne 4 affiche "fin", sur les dix colonnes ou


sur la colonne 4 ??
J'ai besoin d'une MEFC pour toute la ligne (10 colonnes, mais pas plus !),
Dans quelle condition cette MFC ??


Regarde ici
http://cjoint.com/?cjvIKxSVLk

Si ce n'est pas cela, fait de même avec ton fichier.

JJ

"j-pascal" a écrit dans le message de
news:

Normal, l'excecution du code se fait selon le controle de la colonne
target,

ici colonne A.
Avec une entrée conditionnelle en colonne B target devient B, d'ou la
necessité de faire le controle sur la colonne d'entrée(target) et non
pas


sur la colonne cible(A)
If Target.Column = 1 Then doit être la colonne d'entrée, ici colonne A


C'est dur pour mon petit cerveau...
Tu veux dire que si les valeurs de la colonne A sont "dépendantes" d'une
autre colonne, c'est cette autre colonne qui est la target ?? Ca devient
compliqué ! Je te résume mon application. (très synthétiquement) : j'ai un
tableau de 10 colonnes. Dans la colonne 5, j'ai des dates. Dans la colonne
4

j'affiche "FIN" si la date de la colonne 5 est antérieure à la date
d'aujourd'hui, etc pour toute la colonne... En D1 (D2, etc) j'ai
=(si(E1<aujourdhui();"FIN";"")). J'ai besoin d'une MEFC pour toute la
ligne

(10 colonnes, mais pas plus !), un motif, si la colonne 4 affiche "FIN".
Précision, quand je génére un tri de mon tableau, les lignes
n'apparaissent

pas dans le même ordre, la MEFC ne doit donc pas "persister" car pour la
nouvelle ligne, la condition n'est peut-être plus remplie pour avoir le
mot

"FIN".
Tu vas peut-être me dire que dans ce cas, je dois faire une requête non
plus

sur un mot ("FIN") mais directement sur la date ?
Dans l'attente fébrile de ta réponse (éventuelle), je te souhaite une
bonne

journée. A+






Par ailleurs, quand je supprime les toto (suppr), la MEFC ne change
pas



spontanément mais sous l'effet d'une autre action, sur une autre
ligne...



Si, si avec le dernier code, à condition que 'toto' soit en colonne A et
que

le controle de target soit la / les colonne(s) d'entrée.

JJ

"j-pascal" a écrit dans le message de
news:%
Bonsoir Jacky et merci. Sur ce dernier point, je me suis mal expliqué.
Dans

l'exemple : si dans "A1" on met la formule "=si(B1=0;"toto";""), alors
on


est d'accord que "toto" s'inscrit dans A1 si B1=0 ! Mais le "toto"
(qui



apparait bien dans la colonne 1) n'entraine pas de MEFC ! Et dans
l'application que je veux traiter, les "toto" apparaissent tjs en
fonction


d'une formule et jamais après saisie ! En fait, selon vba, le toto
saisi



n'est pas égal à un toto formule... Par contre la MEFC pour cette
ligne



fonctionne si on saisit un "toto" dans une autre ligne !
Par ailleurs, quand je supprime les toto (suppr), la MEFC ne change
pas



spontanément mais sous l'effet d'une autre action, sur une autre
ligne...



Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Column = 1 Then
For Each c In Range("A1:A" & Range("A65536").End(xlUp).Row)
If c.Value = "toto" Then
c.Offset(0, 4).Interior.ColorIndex = 30
c.Offset(0, 5).Interior.ColorIndex = 28
c.Font.ColorIndex = 2 '(modifie cellule de saisie !)
ElseIf c.Value = "titi" Then
c.Offset(0, 4).Interior.ColorIndex = 32
c.Offset(0, 5).Interior.ColorIndex = 29
c.Font.ColorIndex = 2
Else
c.Offset(0, 4).Interior.ColorIndex = Null
c.Offset(0, 5).Interior.ColorIndex = Null
c.Font.ColorIndex = 1
End If
Next
End If
End Sub
Peut-être à bientôt... en espérant que mes explications soient


"claires"...















1 2