VBA:Mise en forme conditionelle (xl(Not)Between) à la souri

Bonjour,

Je débute sur VBA et j'aurais voulu déboguer mon code afin de réaliser des mises en forme conditionnelles.

J'ai un tableau avec 6 colonnes : les 2 premières correspondent à des valeurs requises respectivement minimale et maximale, et les 4 dernières sont des mesures.

Je voudrais que les colonnes de mesures se colorent en vert ou en rouge selon que les mesures sont comprises ou non dans les spec (min et max).

Etant donné que j'ai beaucoup de lignes, je voudrais pouvoir sélectionner à la souris une ligne de mesures (exemple : A1 à D1) que je voudrais voir colorée, puis les cellules correspondant au min et au max.

Mon code est le suivant :

Sub MacroTableauVertOuRouge()
'
' MacroTableauVertOuRouge Macro
' Illustre la conformité ou non d'une mesure par rapport à une spec en colorant la cellule en vert ou en rouge
'

Dim Plage As Range
Set Plage = Application.InputBox("Choix de cellules", Type:=8)
MsgBox Plage.Address
MsgBox Plage.Worksheet.Name

Dim StrAdressCellMin As String
Set CellMin = Application.InputBox("Choix du min", Type:=8)

Dim StrAddressCellMax As String
Set CellMax = Application.InputBox("Choix du max", Type:=8)

 Selection.FormatConditions.Add Type:=xlCellValue, Operator:=xlBetween, _
        Formula1:="=INDIRECT(" & CellMin & ")", Formula2:="=INDIRECT(" & CellMax & ")"
    Selection.FormatConditions(Selection.FormatConditions.Count).SetFirstPriority
    With Selection.FormatConditions(1).Font
        .Color = -16752384
        .TintAndShade = 0
    End With

    With Selection.FormatConditions(1).Interior
        .PatternColorIndex = xlAutomatic
        .Color = 13561798
        .TintAndShade = 0
    End With
    Selection.FormatConditions(1).StopIfTrue = False
    Selection.FormatConditions.Add Type:=xlCellValue, Operator:=xlNotBetween, _
        Formula1:="=INDIRECT(" & CellMin & ")", Formula2:="=INDIRECT(" & CellMax & ")"
    Selection.FormatConditions(Selection.FormatConditions.Count).SetFirstPriority
    With Selection.FormatConditions(1).Font
        .Color = -16777024
        .TintAndShade = 0
    End With
    With Selection.FormatConditions(1).Interior
        .PatternColorIndex = xlAutomatic
        .Color = 13421823
        .TintAndShade = 0
    End With
    Selection.FormatConditions(1).StopIfTrue = False
End Sub

J'ai obtenu la partie "traitement de la couleur" des cellules sélectionnées avec l'enregistreur de macro.

Pour l’exécuter, je clique sur un bouton à côté du tableau.

Je n'obtiens pas de message d'erreur après avoir lancé le programme et fait les 3 sélections (plage de cellules, min et max), mais rien ne se passe !

Avant d'avoir tenté de modifier ce qu'il y avait dans "Formula1" et "Formula2", tout fonctionnait très bien. C'est le fait de vouloir sélectionner ces cellules à la souris qui empêche le résultat espéré.

Je vous remercie pour toute aide que vous pourriez m'apporter !

EDIT : Je l'ai fait fonctionner à moitié. J'utilisais les =INDIRECT() pour rien, je les ai remplacés directement par mes &CellMin& et &CellMax&.

Résultat : j'obtiens bien mes cases colorées en rouge pour la ligne sur laquelle j'ai testé le macro et où les mesures n'étaient pas dans les spec. Seulement lorsque je modifie mes spec pour que les mesures soient comprises dedans, les cellules ne deviennent pas vertes. Je ne vois pas d'où ça vient pour le moment.

Après avoir mis en commentaire la seconde partie du code, j'en ai déduit que c'est la première partie qui a un souci étant donné qu'il ne se passe rien, alors que tout fonctionne quand je fais l'inverse (c'est-à-dire mettre en commentaire la première partie pour n'exécuter que la seconde --> les cases deviennent rouges dans les bonnes conditions).

Et dernier souci : j'aimerais modifier le code de façon à ce que les cellules traitées par le code du macro soient bien celles que je sélectionne au début à la souris, et non comme c'est le cas actuellement que ce soit la ou les cellules que j'ai sélectionnée(s) avant son exécution qui soient traitées ?

Merci !

EDIT2 : fichier rajouté.

20classeur1.xlsm (20.47 Ko)

Bonjour,

Sans fichier, la lecture est moins aisée.

Bonjour,

Tout d'abord merci de votre réponse.

Je joins un fichier "écourté" par souci de simplification.

18classeur1.xlsm (20.47 Ko)

Bonsoir,

Première question, pourquoi ne pas utiliser les MFC ?

jpbt84,

Je les utilisais au départ mais il s'avère que je dois mettre en forme plusieurs centaines de lignes, pour des mesures traduites par des grandeurs physiques bien souvent différentes à chaque ligne. Avec les échéances que j'ai, je cherche à gagner du temps.

D'habitude je gérais des données sous TOPCAT ou MATLAB lors de précédents stages, mais ce n'est plus le cas ici et je n'ai jamais eu l'occasion d'utiliser les MFC.

Au départ j'utilisais les conditions "entre", "inférieure à" [...] mais je ne sais même pas s'il est possible de, par exemple, simplement sélectionner les données que je souhaite mettre en forme et, pour chaque ligne, de sélectionner chaque spec au cas par cas en une seule manipulation. D'où ma volonté d'au moins gagner un peu de temps en raccourcissant ces étapes.

S'il existe une solution optimisée, par les MFC excel ou par VBA, je suis bien entendu preneur !

Je vous prépare cela (en MFC) pour, au plus tard, demain dans la matinée.


Soyons fou !!!!

Voici le fichier à tester.

Vous pouvez reproduire la MFC sur des milliers de lignes sans soucis.

21mesures-v1.xlsm (18.69 Ko)

Je vous remercie sincèrement pour votre réponse !

Je vous ferai savoir au plus tard dimanche soir si cela a réglé mon problème.


D'abord merci déjà d'avoir pris votre temps pour m'aider.

J'obtiens cependant ce résultat en ouvrant le fichier (cf. image).

La première ligne correspond parfaitement. Cependant, les deux suivantes devraient être totalement colorées en vert étant donné qu'elles sont comprises entre les spec de la ligne correspondante. D'après les règles des MFC, je lis qu'elles ont été définies par les spec de la première ligne, est-ce la raison ?

Il faudrait en effet que chaque mesure soit comparée à la spec de la ligne correspondante (exemple : mesures sur la pièce 3 comparée avec les min et max de la ligne correspondante - soit C5 et D5). Et c'est effectivement tout mon problème, à savoir qu'il faudrait que je définisse autant de règles de MFC qu'il existe de lignes (en réalité le double car il y a deux couleurs).

Je m'excuse si j'ai mal formulé mon problème dans mon premier message.

capture1

Non, 2 règles suffisent pour tout un tableau, j'ai juste merdouille dans les $, je règle cela demain matin.

Bonsoir le forum,

Avant la MFC : E3:H5 avec un fond rouge.

[b][u]Une seule règle :

[/u][/b]

=NB.SI.ENS($E3:$H3;">="&$C3;$E3:$H3;"<="&$D3)=4

S'applique à : =$E$3:$H$5

mfc

Bonsoir mbbp,

Si j'ai bien compris ton message, j'ai d'abord appliqué un fond rouge à mes cases, puis j'ai tenté de définir une nouvelle règle à partir de ta formule, en changeant le format afin de mettre du vert.

Cependant, une fois la règle validée, rien ne change dans mon tableau. Peux-tu me détailler comment tu t'y es pris, stp ?

Merci à vous deux pour votre aide.

Bonjour Rom75,

Il faut supprimer toutes les règles presentes dans ton fichier et n'utiliser que celle proposée.

Bonjour mbbp,

Merci de ta réponse. Après re-vérification, je n'obtiens malheureusement pas de changement après définition de la nouvelle règle et suppression de toutes celles existantes dans la feuille.

Et pourtant :

13mfc.xlsm (63.06 Ko)

mbbp,

Merci infiniment ! Cela fonctionne parfaitement avec la formule prise de ton fichier. Il devait y avoir un souci dans la première, que je n'ai pas su corriger.

EDIT : j'ai parlé trop vite. En effet, j'ai testé la solution en mettant, sur une ligne, une valeur parmi les mesures qui est n'est pas comprise dans les spec, et du coup c'est TOUTE la ligne qui devient rouge, alors que les valeurs non modifiées sont bien comprises dans les spec. Y a-t-il moyen d'y remédier ?

=ET(E3>=$C3;E3<=$D3)

J'ai modifié ce message pour dire que j'en reviens au même problème avec cette formule qu'avec celle que m'avait proposée jpbt84, à savoir que si je fais ceci je suis obligé de sélectionner ce que je veux mettre en forme ligne par ligne (donc trop long) étant donné que si je l'utilise pour tout le tableau tout est défini par rapport à la première spec (première ligne) et non par rapport à chaque spec qui est spécifique à une série de mesures (sur la même ligne que la série de mesures que je souhaite mettre en forme).

A tout hasard, mon code VBA marche à moitié donc s'il y a quelqu'un suceptible de pouvoir me débloquer sur cet aspect-là également, je suis bien entendu preneur.

J'ai cherché (en me résignant un peu à procéder ligne par ligne pour aujourd'hui) et je me demandais pourquoi il semblerait qu'il suffise à certaines personnes de sélectionner tout leur tableau pour que la règle de leur MFC "se décale à chaque ligne" alors que dans mon cas, non. J'ai essayé en remplaçant par exemple les "$C$" par seulement "$C", etc, mais rien n'y fait, il n'y a toujours que ma première ligne de sélection qui est prise pour référence.

Petit up.

Ce n'est pas une question de "personne" :

mfc

Bonjour à tous,

je travaille avec excel 2016 ,

je suis bloquer au niveau ''nouvelle règle'' quand il s'agit de Commencez votre formule avec un =, entrez ensuite la première cellule à tester (ici, B1) et finissez avec le test =$B$8 (avec des $ pour "fixer" la cellule).

quand je fixe la formule rien ne se passe j’espère que l'un des membres forum pourras m'aider.

je vous envoie aussi mon fichier en pièces jointe en espérant que vous pourriez directement le corriger et m'expliquer pourquoi ma formule ne tiens pas.

Cordialement

10classeur2.xlsx (9.24 Ko)
Rechercher des sujets similaires à "vba mise forme conditionelle between souri"