Mise en forme conditionnelle

Signaler
Messages postés
159
Date d'inscription
jeudi 7 septembre 2006
Statut
Membre
Dernière intervention
30 septembre 2011
-
Messages postés
2065
Date d'inscription
lundi 11 avril 2005
Statut
Membre
Dernière intervention
14 mars 2016
-
Bonjour,

Je souhaite ajouter via macro une mise en forme conditionnelle.
Si j'utilise ce code et que je recopie la mise en forme tout va bien (la cellule est incrémentée):

'*************************************************
    Selection.FormatConditions.Delete
    Selection.FormatConditions.Add Type:= xlCellValue, Operator:=xlNotEqual, _
        Formula1:="=D19"
    With Selection.FormatConditions(1).Font
        .Bold = True
        .Italic = False
    End With
    Selection.FormatConditions(1).Interior.ColorIndex = 36
    Selection.Copy
    Application.CutCopyMode = False
'*************************************************

Ainsi D19 pour la ligne 19, D20 pour la ligne 20 etc.
En revanche le code suivant qui est plus général ne fonctionnera pas:

'*************************************************
    Selection.FormatConditions.Delete
    Selection.FormatConditions.Add Type:=xlCellValue, Operator:=xlNotEqual, _
        Formula1:= ActiveCell.Offset(0, -5).Address(RowAbsolute:=False, ColumnAbsolute:=False)
    With Selection.FormatConditions(1).Font
        .Bold = True
        .Italic = False
        .ColorIndex = xlAutomatic
    End With
    Selection.FormatConditions(1).Interior.ColorIndex = 36
'*************************************************
   
En effet dans ce code si je l'éxecute sur la ligne 19 j'aurai comme condition ="D19" donc en copiant la mise en forme, la cellule de référence restera toujours D19.

Es-ce que quelqu'un peut me venir en aide?
Merci

Ludo

9 réponses

Messages postés
2065
Date d'inscription
lundi 11 avril 2005
Statut
Membre
Dernière intervention
14 mars 2016
10
Bonjour,

Pour le 1er code, tu as la condition :
Formula1:="=D19"

donc Formula1 demande un type "string" (texte)

Dans le second code tu écris :
 Formula1:=ActiveCell.Offset(0, -5).Address(RowAbsolute:=False, ColumnAbsolute:=False)

Or activecell... n'est pas un texte (string). De plus, sa syntaxe est franchement compliqué...

Que veux-tu faire vraiment avec ce code ? Que doit-il faire vraiment ?
... car il existe des moyens surment plus simple que ce que tu entrevois... et à priori, difficile une boucle, mais bon...

A+
Amicalement,
Us.
Messages postés
159
Date d'inscription
jeudi 7 septembre 2006
Statut
Membre
Dernière intervention
30 septembre 2011

Je veux simplement appliquer une mise en forme conditionnelle (et non pas une mise en forme via macro en fonction de certains paramètres). En effet selon les valeurs de certaines cellule je voudrais que la mise en forme change. J'ai choisi "si valeur de la cellule est différent de " et je compare à la cellule qui se trouve 5 colonnes avant.

Les cellules contiennent des nombres. Comment faire pour transformer la valeur de la formule: ActiveCell.Offset(0, -5).Address(RowAbsolute:=False, ColumnAbsolute:=False)
En valeur de type texte (string)?


Merci
Messages postés
2065
Date d'inscription
lundi 11 avril 2005
Statut
Membre
Dernière intervention
14 mars 2016
10
Bonjour les ambiguités de tes propos... Je puis dire qu'on peut faire au moins 3 interprétations...

Je te propose ceci :

Sub MiseEnFormeConditionnelle()



If ActiveCell = ActiveCell.Offset(0, -5) Then
    With Selection
        .Interior.ColorIndex = 36
            With .Font
            .Bold = True
            .Italic = False
            End With
    End With
End If



End Sub



Amicalement,
Us.
Messages postés
159
Date d'inscription
jeudi 7 septembre 2006
Statut
Membre
Dernière intervention
30 septembre 2011

Us,


Merci pour ton aide mais c'est exactement ce que je ne veux pas faire. :-)


Je veux appliquer une mef (mise en forme) conditionnelle afin que la mef de la cellule change si on change la valeur de la cellule (la caractéristque principale d'une mef conditionnelle!).

Je vais détailler un peu plus.
Mes colonnes D et I contiennent des nombres. L'utilisateur, après avoir utilisé cette macro, va éventuellement modifier certaines valeurs dans la colonne I. Je souhaite, si la valeur en D et I sont différentes, le mettre en évidence en changeant la mise en forme de la cellule I.

Comment faire, sachant que je ne connais pas la ligne actuelle?
J'ai essayé ceci mais ça ne marche pas:
'*************************************************
    Selection.FormatConditions.Delete
    Selection.FormatConditions.Add Type:=xlCellValue, Operator:=xlNotEqual, _
        'Formula1:="=D19"
        Formula1:="=D" & Activecell.Row
[...]
'*************************************************

Merci
Messages postés
2065
Date d'inscription
lundi 11 avril 2005
Statut
Membre
Dernière intervention
14 mars 2016
10
Ou est le pb ? je cherche encore, désolé...

Si tu applique la mise en forme conditionnelle à une cellule, elle reste présente ensuite... ?!

Que veux-tu dire par : "que je ne connais pas la ligne actuelle ?" ... La mise en forme conditionnelle se met là où tu applique... Est-ce que tu veux appliquer automatiquement la mise en forme conditionnelle à l'ensemble d'une plage ? sans le faire manuellement... ?

Amicalement,
Us.
Messages postés
159
Date d'inscription
jeudi 7 septembre 2006
Statut
Membre
Dernière intervention
30 septembre 2011

Us,


Ce code fait partie d'une macro qui se déroule de la manière suivante (et est exécuté sur la colonne I):


- inputbox pour récupérer un paramètre


- calcul d'une valeur pour la cellule actuelle à partir du paramètre récupéré


- application de la mef conditionnelle selon critères cités précédemment (si différent de D alors mef spéciale, sinon rien).

Après cette macro dans certains cas l'utilisateur peut vouloir changer la valeur de la cellule, dans ce cas je veux toujours continuer à appliquer la mef c'est pourquoi cette mef doit être conditionnelle (comme on le ferait manuellement via le menu Format > Mise en forme conditionnelle dans excel).

Ce code peut être exécuté sur n'importe quelle ligne c'est pourquoi j'ai écris "que je ne connais pas la ligne actuelle ?"

Désolé de ne pas avoir été très claire jusque là. J'espère que c'est mieux.
Messages postés
2065
Date d'inscription
lundi 11 avril 2005
Statut
Membre
Dernière intervention
14 mars 2016
10
Non. C'est même dramatique. On tourne en rond.

- Pourquoi n'appliques-tu pas la mise en forme conditionnelle, une fois pour toute ?
Réponds directement à cette question.

-

Je m'explique, car il me semble que quelque chose m'échappe (ou à toi)...
Il semble que la colonne I contient des nombres calculés à partir d'un Inpubox.
Si la cellule Ix (x remplace le n° de ligne) est différent à Dx alors Dx doit être mise en forme (couleur fond jaune)
Est-ce bien cela ?
Si oui... alors pourquoi ne pas mettre la mise en forme conditionnelle (fond jaune, par exemple) sur l'ensemble de la colonne D ? (ou du moins sur le groupe de cellule concerné)

En clair, si tu fais cela, tu obtiendrais ce que tu veux. (ou semble vouloir)... Où est-ce que cela coince pour toi.

-

Amicalement,
Us.
Messages postés
159
Date d'inscription
jeudi 7 septembre 2006
Statut
Membre
Dernière intervention
30 septembre 2011

"Il semble que la colonne I contient des nombres calculés à partir d'un Inpubox."



C'est ça.

"Si la cellule Ix (x remplace le n° de ligne) est différent à Dx alors Dx doit être mise en forme (couleur fond jaune)
Est-ce bien cela ?"
C'est presque ça, sauf que c'est Ix qui doit être mis en forme.

"Si oui... alors pourquoi ne pas mettre la mise en forme conditionnelle (fond jaune, par exemple) sur l'ensemble de la colonne D ? (ou du moins sur le groupe de cellule concerné)"
Ok pour le groupe de cellules concernées, c'est ce que je voudrais faire mais comment?
Messages postés
2065
Date d'inscription
lundi 11 avril 2005
Statut
Membre
Dernière intervention
14 mars 2016
10
Bonjour,

Bon, c'est tout simple...

Explication guidée pas à pas...
1 / Met dans D4 un nombre. Par exemple : 32
2 / Met dans I4 un nombre. Par exemple : 33
3 / Sélectionne I4. Va dans le menu : FORMAT>MISE EN FORME CONDITIONELLE
dans condition1 : garde : "La valeur de la cellule est", puis "différente de", puis clique sur D4... Ici tu dois avoir la formule =$D$4 ... Comme tu le vois il y a les dollars "$", ce qui indique une référence absolue, ou dit autrement "fixe"... Il faut retirer ces dollars, pour avoir " = D4 "...
4 / Choisi le format de la cellule (fond jaune)... La prévisualisation devrait aider à choisir.
5 / OK.

Maitenant, si tu rentre dans I4, la valeur 32, le fond est Standard (blanc en général), si tu rentres autre chose, le fond sera jaune...

Utilise maintenant on peut recopier la mise en forme aux autres cellules :
1 / Selectionne I4
2 / Copie la cellule I4
3 / Utilise l'icône pinceau... pour cela clique dessus, ton curseur se change en " flèche avec un +", puis selectionne la plage de cellule concernée. Par exemple, de I5 à I10...
4 / Fini. Tu peux tester que si tu rentre dans D7 et dans I7, deux  contenus différents, la mise en forme est automatique...

Voilà.

Amicalement,
Us.