Problème de mise en forme conditionnelle

Résolu
SERIEUXETCOOL Messages postés 336 Date d'inscription dimanche 3 avril 2011 Statut Membre Dernière intervention 12 juin 2012 - 9 oct. 2011 à 12:41
SERIEUXETCOOL Messages postés 336 Date d'inscription dimanche 3 avril 2011 Statut Membre Dernière intervention 12 juin 2012 - 11 oct. 2011 à 16:31
Bonjour le Forum,

Je me retourne vers vous une nouvelle fois car je bloque sur un petit problème de mise en forme conditionnelle.

Voici la description du problème :

-Dans une première feuille Excel, j'ai une valeur dans la cellule A1. Une valeur décimale. Ici on va la noter "a" pour simplifier le problème.

-Dans une deuxième feuille Excel, j'ai une valeur dans la cellule A1. Une valeur décimale. Ici on va la noter "b" pour simplifier le problème.

-J'aimerais appliquer une mise en forme conditionnelle à la cellule A1 de ma deuxième feuille avec Excel 2007. Mise en forme avec jeux d’icônes, les 3 drapeaux que propose Excel.

-"b" peut être plus grand que "a" tout comme il peut être plus petit que "a".

-J'aimerais aider l'utilisateur dans sa prise de décision et le guider à faire son choix concernant la valeur de "b".

Voici les conditions qui s'appliquent à la cellule A1 de la feuille 2 ("b"):

-Si "a"-2<"b"<"a"+2 alors drapeau Vert
-Si "a"-4<"b"<"a"+4 alors drapeau Orange
-Si "a"-6<"b"<"a"+6 alors drapeau Rouge


Le problème c'est que je ne sais pas comment coder tout sa, et de plus je vois bien qu'il y a un problème d'intervalle car le "drapeau Rouge" englobe à la fois l'intervalle "drapeau Orange et "drapeau Vert"

Je suis perdu pour le coup. La finalité de mon objectif étant grosso-modo, de faire afficher le drapeau Vert si la valeur absolue de la différence entre "a" et "b" est inférieur à 2, drapeau Orange si la valeur absolue de la différence comprise entre 2 et 4, puis drapeau Rouge si la valeur absolue de la différence supérieur à 4.


Si vous avez des idées, des conseils je suis preneur.

Bien cordialement,

André qui se casse la tête lol


PS : Je désire programmer la mise en forme conditionnelle sous VBA (Macro Excel). De plus, j'ai bien compris que pour faire appel à une valeur qui se trouve sur une autre feuille il faut nommer la plage. Du coup on peut dire que la cellule A1 de la feuille 1 est une plage nommée "MaPlage"

29 réponses

cs_GG72 Messages postés 94 Date d'inscription vendredi 13 mai 2005 Statut Membre Dernière intervention 30 octobre 2011
10 oct. 2011 à 18:35
Bonjour,

Il te suffit maintenant d'appeler cette procédure à partir des événements Worksheet_Change de tes feuilles "Feuil1" et "Feuil2" après avoir vérifié l'adresse des Ranges modifiés (Target.Address).

C'est ce que te disait ucfoutu dans sa 2ème méthode.

Bonne soirée.
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
10 oct. 2011 à 18:54
Je voudrais vraiment que tu relises attentivement cette phrase, André :
2) utiliser l'évènement Worksheet_Change et la fonction Intersect (par rapport au paramètre Target présent dans Worksheet_Change)

Elle est ta solution à :
Ma question est simple : Comment pourrais-je améliorer mon code de façon à ce que dès que la cellule A1 de la feuille 1 ou la cellule A1 de la feuille 2 change, alors sa met à jour tout seul ???

L'évènement Change d'une feuille intervient spontanément dès que tu modifies une valeur.
Le paramètre Target qui figure dans cet évènement définit la cellule modifiée.
Alors ?
Je voudrais que tu réfléchisses à ce que fait cet EXEMPLE (EXEMPLE, hein, afin que tu réfléchisses à comment utiliser adroitement cet évènement)

Tu ouvres un nouveau projet ===>> tu vas sur Feuil1 ===>> tu cliques sur l'onglet développeur ===>> puis editeur visual basic ==>>> tu es maintenant face à une fenêtre qui n'est plus ta feuille ===>> regarde-la bien : dans la grande "zone" blanche dans la partie droite : tu as deux colonnes ===>> dans celle de gauche : choisis WorkSheet. Dans celmle de droite, choisis l'évènement Change ===>> regarde bien.
Mets-y ensuite ceci :
Private Sub Worksheet_Change(ByVal Target As Range)
 If Target.Column = 1 Then
    MsgBox "tu biens de modifier une cellule de la colonne A de la feuille " & ActiveSheet.Name
  End If
End Sub

retourne à tes Feuilles de calcul ===>> active Feuil2 ===>> fais la même chose dans son évènement Change ===>> même code
Private Sub Worksheet_Change(ByVal Target As Range)
 If Target.Column = 1 Then
    MsgBox "tu biens de modifier une cellule de la colonne A de la feuille " & ActiveSheet.Name
  End If
End Sub

retourne à tes feuilles ===>> sors du mode création (si tu y es encore) ===>> va sur Feuil1 ===>> modifie une cellule de la colonne A et va sur une autre cellule ===>> observe
=>> va sur Feuil2 ===>> modifie une cellule en colonne A ===> va sur une autre cellule ===>> Observe
Intéressant ?
Voilà ! Ce sont les premiers pas à faire et je tiens à ce que tu les fasses, car ils t'ouvrent une porte en grand (et ce sont des gestes simples).




____________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches d'autres forumeurs.
Pas d'aide en ligne installée ? ==> ne comptez pas sur moi pour simplement vous dire ce qu'elle contient
0
SERIEUXETCOOL Messages postés 336 Date d'inscription dimanche 3 avril 2011 Statut Membre Dernière intervention 12 juin 2012 1
10 oct. 2011 à 19:20
Je vais tester tes conseils Ucfoutu. Ils me semblent bons !
GG72 merci aussi de tes conseils ;)

J'avais déjà entendu parler à plusieurs reprises de cet événement "whorsheet_Change" mais je ne m'y étais encore jamais frotté car sa me faisait peur. Cette fois-ci, plus d'autre solution que de me pencher sur cet événement.

Je vais découvrir une nouvelle chose sur les Macro Excel lol. Je vous ferait un retour dès que j'aurais un résultat probant.
Je vais tester sa ce soir, et je devrais vous dire sa demain matin^^

Au moins, je sais que je suis presque au bout de la solution. Ne me reste plus qu'a travailler cet événement et hop sa devrait rouler tout seul sans que sa soit lourd à gérer. Enfin j'espère^^...

A toute, et merci pour vos conseils. Je les prends tous.

Bien cordialement,

André
0
SERIEUXETCOOL Messages postés 336 Date d'inscription dimanche 3 avril 2011 Statut Membre Dernière intervention 12 juin 2012 1
11 oct. 2011 à 02:51
J'ai suivis tes conseils Ucfoutu et je suis arrivé à 2 codes possibles qui fonctionnent. Mais il ne sont pas opérationnels à 100%.

Voici le premier code :

Option Explicit

Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Address =   "$A$1" Then
    Call Macro1
  End If
End Sub


Je colle ce code dans la feuille 1 ET la feuille 2. Sa marche bien. L'inconvénient de cette méthode est que dans mon cas à moi, je pars d'un classeur Excel ne contenant qu'une seule feuille au début. Ensuite via une macro je créer 2 nouvelles feuilles. Et je dois placer ce fameux code dans les deux nouvelles feuilles qui viennent d'être créées via la macro.

Bilan comment dois-je m'y prendre pour placer ce code dans une feuille qui n'existe pas à l'ouverture du classeur Excel mais qui est créée en cours de route ???

La je bloque, et je ne trouve pas de pistes. Comment fait-on cela ?


Enfin une autre solution que j'ai mis en place. C'est une petite variante de la solution précédente. Je me suis dit, puisque je ne dispose pas des deux feuilles au début de la macro alors je vais essayer de travailler avec le seul élément présent à l'ouverture d'un classeur...Le Workbook !

Voici le deuxième code :

Option Explicit

'Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)
'If Target.Address   "$A$1" Or Target.Address   "$A$1" Then
'    Call Macro1
'        MsgBox "Vous venez de modifier la cellule " & Target.Address & _
'        " (" & Target.Value & ")"
'  End If
'End Sub



La encore sa marche bien. Sa marche même mieux que le code précédent. C'est plus simple à coder et plus logique en fait. Malheureusement, sa ne fonctionne que si je travaille sur la cellule "A1" pour les deux feuilles ! C'est à dire que si j'utilise "A1" de la feuille 1 et "C4" de la feuille 2 sa ne fonctionne plus. Il faut pour cela que j'intègre le nom des feuilles respectives.

Mais je ne sais pas faire cela ! Et sa m'agace. Je me casse la tête dessus depuis des heures maintenant. Comment fait-on cela ???

Alors en cherchant des solutions pour mon problème j'ai créé le code suivant qui fonctionne bien lui aussi.

Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)
If Target.Value Sheets("Feuil2").Range("A1") Or Target.Value Sheets("Feuil1").Range("A1") Then
    Call Macro1
        MsgBox "Vous venez de modifier la cellule " & Target.Address & _
        " (" & Target.Value & ")"
  End If
End Sub



Le problème c'est que je ne veux pas un "Target.Value" mais un "Target.Address" car je ne sais pas pourquoi mais sa fonctionne moins bien en "Target.Value". Et je ne sais pas faire avec "Target.Address".


En conclusion :

Il suffit de corriger cette expression pour que le code fonctionne bien. Le travail est mâché à 90 %. Ce n'est plus qu'un problème de syntaxe maintenant.

If Target.Address   "'Feuil1'!$A$1" Or Target.Address "'Feuil2'!$A$1" Then



Merci de votre aide. Je pensais que c'était un problème simple, mais finalement il est bien plus compliqué qu'il n'en a l'air !

André

PS : Ucfout, je n'ai pas compris la fonction "Intersect". Dans mon cas j'utilise une cellule sur une feuille, et une autre cellule appartenant à une autre feuille. L'intersection des deux est forcément nul non ?
0

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

Posez votre question
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
11 oct. 2011 à 07:28
Allons allons, André !
N'as-tu pas comme l'impression que tu connais la solution ?
C'est quoi, d'après toi ActiveSheet dans cette ligne de code que tu as essayée :
 MsgBox "tu biens de modifier une cellule de la colonne A de la feuille " & ActiveSheet.Name

Et c'est quoi, sa propriété Name ?
Alors ===>> essaye donc !

____________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches d'autres forumeurs.
Pas d'aide en ligne installée ? ==> ne comptez pas sur moi pour simplement vous dire ce qu'elle contient
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
11 oct. 2011 à 07:33
Et d'ailleurs :
C'est quoi, ce paramètre Sh dans :
Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)

pas d'idée ?
Essaye donc
 msgbox Sh.Name

pour voir

____________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches d'autres forumeurs.
Pas d'aide en ligne installée ? ==> ne comptez pas sur moi pour simplement vous dire ce qu'elle contient
0
cs_GG72 Messages postés 94 Date d'inscription vendredi 13 mai 2005 Statut Membre Dernière intervention 30 octobre 2011
11 oct. 2011 à 07:33
Bonjour,

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

tu récupères le nom de la feuille modifiée (Sh.Name) et l'adresse du range modifié (Target.Address)

Il te suffit de "regarder" les valeurs retournées pour savoir, si oui ou non, tu viens de modifier les cellules concernées par ta MFC.
0
cs_GG72 Messages postés 94 Date d'inscription vendredi 13 mai 2005 Statut Membre Dernière intervention 30 octobre 2011
11 oct. 2011 à 13:32
Comment faire en sorte que l'évènement ne se déclenche que si le contenu de ma cellule A1 de ma feuille 1 ET A1 de ma feuille 2 sont des nombres au bon formats ?

L'événement se déclenchera obligatoirement.

Par contre, il te faut tester la validité de la saisie par Target.Value dès l'entrée dans la procédure et en sortir par Exit Sub si saisie non valide.

Mais comment gères-tu une modification dans les 2 nouvelles feuilles que tu ajoutes par le code?
Le code que tu nous montres ne teste que Feuil1 et Feuil2.

Même question si Range autre que "A1"
0
SERIEUXETCOOL Messages postés 336 Date d'inscription dimanche 3 avril 2011 Statut Membre Dernière intervention 12 juin 2012 1
11 oct. 2011 à 16:28
Merci pour l'info GG72. J'ai suivis ton conseil et sa ma amené sur une bonne solution. Nice !

Pour répondre à tes questions... En effet, le code que j'ai montré ne fait pas apparaître la création ou la suppression de nouvelles feuilles. Ce qui est normal car le code que j'ai proposé juste au dessus, n'est pas dans un module mais dans un WorkBook. Il ne s'agit que d'un évènement qui contrôle deux cellules : une cellule "A1" dans une feuille "Feuil1" et une cellule "A1" dans une feuille "Feuil2" suite au changements des ces cellules, on affecte une mise en forme conditionnelle particulière.

La suppression et la création des feuilles se fait dans mon module principal, ma Macro. Je n'ai pas mis ces détails car c'est de la programmation lourde pour rien.
Ma macro ajoute 2 feuilles et les renommes. Ce sont ces 2 nouvelles feuilles fraichement créés et renommées que mon évènement WorkBook va surveiller par la suite.
J'ai testé et sa fonctionne bien. Que les feuilles excitent ou pas encore sa marche.


Voili voila. En ce qui concerne les cellules, j'ai modifier radicalement mon code. Je le post juste après. Il gère le nom des feuilles, ET le nom des cellules en question ;)

Pratique hein^^

Merci pour ton aide GG72
0
Rejoignez-nous