Sélection de cellule avec varible [débutant]
Bonjour à tous,
J'ai un tout petit problème, j'aimerai utiliser la fonction " Formula1:="=ESTVIDE(....) " mais je n'arrive pas à définir corectement les bornes. j'aimerai que la formule s'applique de la cellule A1 à la cellule i avec i variable déja définie avant
Soit quelque chose comme : Formula1:="=ESTVIDE(A1:"H & i & ")" mais ce n'est apparement pas la bonne formulation
j'ai essayé aussi avec Formula1:="=ESTVIDE(Cells(1, 1), Cells(1, i)) ça ne semble pas marcher non plus, quelqu'un saurait il la bonne formulation ?
Merci d'avance
Bonjour,
Il me semble que tu ne peux pas tester une plage avec cette formule mais une cellule. Si tu expliquais bien ton besoin, on pourra te conseiller de façon efficace.
Merci pour ta réponse je ne savais pas,
En fait j'aimerai appliquer une couleur à différentes cellules d'une ligne allant de (Cells(1, 1) à Cells(1, i)) avec 'i variable
Cependant j'ai déja effectué sur cette ligne une opération de mise en forme conditionnelle comme quoi si les valeurs des cellules sont supérieures à une valeur de référence alors elles s'affichent en rouge ou alors si elles sont inférieure à une autre valeur de référence elles saffichent aussi en rouge
Le problème est que du coup les cellules s'affichent aussi en rouge alors qu'elles sont vide et je cherchais donc a éviter cela ...
Désolé si ce n'est pas très clair, mais si quelqu'un à une idée je suis preneur
Bonjour,
Si tu opères en VBA, Formula1 est un argument d'une méthode, et il serait bon que tu précises laquelle !
La façon de faire peut varier selon, mais dans tous les cas ta syntaxe est bancale...
Et comme l'a déjà dit Raja [Salut !] ESTVIDE s'applique à une cellule. Appliqué à une plage ça te renverra systématiquement Faux.
Cordialement.
edit: je n'avais pas vu ta réponse. Il te faut ajouter une condition dans ta formule MFC : <>"", toutes les conditions étant dans un ET, et s'appliquant à la cellule supérieure gauche de la plage d'application.
Mais tu n'as pas à utiliser de variable : mets ton fichier ou ton code ou les deux !
Merci pour ta réponse,
Oui j'opère en VBA,
Qu'entends tu par méthode ?Si tu entends toute la partie utile du programme ça donne :
Selection.FormatConditions.Add Type:=xlExpression, Formula1:="=ESTVIDE((Cells(1, 1):Cells(1, 1)))"
Selection.FormatConditions(Selection.FormatConditions.Count).SetFirstPriority
With Selection.FormatConditions(1).Interior
.PatternColorIndex = xlAutomatic
.ThemeColor = xlThemeColorDark1
.TintAndShade = -0.14996795556505
End With
Selection.FormatConditions(1).StopIfTrue = False
Mais j'ai bien pris consicence que ce n'était pas la bonne façon de procéder et je cherchais donc comme je l'ai expliqué avant comment faire pour que si les cellules sont vides éviter que la couleur rouge s'applique ?
Pour te répondre voila mon programme tel qu'il est :
Range(Cells(1, 1), Cells(1, i)).Select
Selection.FormatConditions.Add Type:=xlCellValue, Operator:=xlGreater, _
Formula1:="=$F$17"
Selection.FormatConditions(Selection.FormatConditions.Count).SetFirstPriority
With Selection.FormatConditions(1).Font
.Color = -16383844
.TintAndShade = 0
End With
With Selection.FormatConditions(1).Interior
.PatternColorIndex = xlAutomatic
.Color = 13551615
.TintAndShade = 0
End With
Selection.FormatConditions(1).StopIfTrue = False
Range(Cells(1, 1), Cells(1, i)).Select
Selection.FormatConditions.Add Type:=xlCellValue, Operator:=xlLess, _
Formula1:="=$G$17"
Selection.FormatConditions(Selection.FormatConditions.Count).SetFirstPriority
With Selection.FormatConditions(1).Font
.Color = -16383844
.TintAndShade = 0
End With
With Selection.FormatConditions(1).Interior
.PatternColorIndex = xlAutomatic
.Color = 13551615
.TintAndShade = 0
End With
Selection.FormatConditions(1).StopIfTrue = False
Comme je l'ai expliqué avant bien que ma syntaxe soit bancale si les valeurs des cellules sont supérieures à une valeur de référence alors elles s'affichent en rouge ou alors si elles sont inférieure à une autre valeur de référence elles saffichent aussi en rouge or je voudrais juste qu'elle s'affiche en grises si elles sont vides ce qui n'est pas le cas car j'ai du mal avec la MFC en intégrant toutes les conditions dans un ET, comment procéder ?
Désolé du double post
Re,
Question 1 : Pourquoi utiliser VBA ?
Question 2 : La seule raison d'utiliser VBA pour une MFC est que celle-ci peut être altérée par certaines manip et qu'il est bon de la reconstruire régulièrement, par exemple à l'ouverture du fichier.
Selection dénote toujours est code mal défini, pas assez précis... (du mauvais VBA issu d'enregistrement !) donc l'écrire mieux et plus correctement, en remplaçant Selection par la plage d'application, sans la sélectionner, laquelle peut être définie de façon variable...
Dans un tel cas, on supprime toujours avec de recréer...
Et pour ce qui est de la mise en forme, la définition de la couleur par RGB est suffisante. Tu peux aussi éliminer les paramètres optionnels sauf StopIfTrue.
Ton code devra avoir l'allure suivante :
With plage.FormatConditions
.Delete
With .Add(xlExpression, formule)
.Interior.Color = RGB(r, g, b)
.StopIfTrue = False
End With
With .Add(xlExpression, formule)
.Interior.Color = RGB(r, g, b)
.StopIfTrue = False
End With
End Withplage correspond à ta plage d'application, elle peut être ciblée directement, ou définie préalablement dans une variable.
formule est la formule à mettre, que je n'ai pas indiquée car tu n'as pas fourni tous les éléments pour la construire.
Si tu as deux couleurs, ça fait 2 mises en forme... J'ai remplacé les paramètres de RGB par r g b qu'il faut indiquer.
Par ailleurs en VBA tu travailles avec des Propriétés et Méthodes d'objets. La Méthode était la méthode Add de l'objet FormatConditions, et Formula1 un argument (ou paramètre) de la méthode, que tu n'es pas obligé de nommer en le passant par position...
Il y a deux problèmes en fait !
Le code VBA pour mettre une MFC d'une part,
La formule conditionnelle de cette MFC, qui au cas particulier est la même que tu mettrais manuellement.
Apparemment ta formule serait donc :
=ET(A1<>"";A1>$F$17;A1<$G$17)
à confirmer
et : =A1="" ou =ESTVIDE(A1) [ce n'est pas tout à fait la même chose !] pour affichage en gris.
En fonction des indications de ton dernier post :
With ActiveSheet.Range("A1").Resize(, i).FormatConditions
.Delete
With .Add(xlExpression, "=ET(A1<>"";A1>$F$17;A1<$G$17)")
.Interior.Color = RGB(255, 199, 206)
.Font.Color = RGB(156, 0, 6)
End With
With .Add(xlExpression, formule)
.Interior.Color = RGB(128, 128, 128)
End With
End WithNB-Les 2 conditions étant alternatives, on peut négliger la propriété StopIfTrue...
Re,
Merci beaucoup pour ta réponse détaillée mais étant débutant sur VBA je t'avoue que j'ai pas encore réussi pour l'instant
Et bien je souhaité utiliser VBA déja pour apprendre et car je n'ai pas trouvé d'autres solutions étant donnée que le nombre de cellules à colorer est variable, partant de la cellule A1 et allant jusqu'a une cellule inconnue sur la meme ligne situé a i case, le i étant un nombre
J'ai donc copié collé le dernier code que tu m'as proposé sans rien changer cependant j'ai eu une erreur d'execution 449 du type argument non facultatif sur cette ligne : With .Add(xlExpression, "=ET(A1<>"";A1>$F$17;A1<$G$17)")
Saurais tu pourquoi ? De plus a quoi sert le Resize je ne comprends pas trop, et pourquoi avoir juste la cellule A1 dans ta formule ? Est ce que cela fait une sorte de "sélection partant de A1 jusqu'a i ?
Globalement il faudrait en fait que mes cellules se colorent en gris si leurs valeurs sont comprises entre les deux valeurs indiquées ou qu'elles se colorent en rouge si leurs valeurs et supérieurs a $F$17 ou inférieur a $G$17 comme tu l'as compris
Le code que j'avais fait marché jusque la pour tout ça, c'est juste que du coup si les cellules étaient vides, donc sans valeurs elles se colorées en rouges alors que je les voulais grises.
Merci beaucoup pour l'aide apporté en tout cas j'espère que l'on parviendra à trouver une solution
Au temps pour moi, il manque une virgule dans chaque MFC ! Et j'avais omis la seconde formule ! Et des guillemets manquants dans les formules !
With ActiveSheet.Range("A1").Resize(, i).FormatConditions
.Delete
With .Add(xlExpression,,"=ET(A1<>"""";A1>$F$17;A1<$G$17)")
.Interior.Color = RGB(255, 199, 206)
.Font.Color = RGB(156, 0, 6)
End With
With .Add(xlExpression,,"=A1=""""")
.Interior.Color = RGB(128, 128, 128)
End With
End WithMais c'est la première virgule qui déclenchait l'erreur, mal qualifiée par ailleurs car ces arguments sont facultatifs (mais cela arrive fréquemment en la matière).
Désolé et bonne suite. Cela devrait marcher maintenant.
Le code se compil bien sans faute cette fois si, les cellules sont grises quand il n'y pas de valeurs, cependant lorsque des valeurs sont rajoutées dans les cellules elles deviennent alors blanches ...
J'ai peut etre oublié de te dire que les valeurs sont rajoutées après manuellement dans chaque case sauf les deux de référence, meme si je doute que ça est une importance sur le code
Le code se contente de mettre en place les MFC...
Tu dis que la couleur est blanc quand la condition est réuniie ! Oups !
Ta condition initiale est un OU et non ET !!!
Substitue la formule : "=ET(A1<>"""";OU(A1>$F$17;A1<$G$17))" à la précédente.
Secondes excuses !! J'espère les dernières.
Cette fois quand les valeurs des cellules sont au dessus ou inférieures elles sont bien rouges comme il le faut mais quand elles sont entre les deux valeurs de références elles sont toujours blanches
Ah ! ça normal !
Tu as dit : rouge si plus grand que F17 ou plus petit que G17
gris si vide
et c'est tout !
Donc si compris entre les deux valeurs (ou égal à elles) rien ne change. Si tu veux que ça change, il faut une 3e MFC pour ce cas.
Cordialement.
Ah oui effectivement au temps pour moi cette fois ci
serait ce trop compliqué de mettre en forme pour toi une 3 ème MFC pour ce cas avec disons une nuance de gris un peu plus clair ?
Je sais que je t'en demande beaucoup je suis vraiment désolé mais je débute avec tout ça et je te remercierai jamais assez pour l'aide que tu m'as apporté jusqu'a maintenant
Tu rajoutes une MFC :
With ActiveSheet.Range("A1").Resize(, i).FormatConditions
.Delete
With .Add(xlExpression, , "=ET(A1<>"""";A1>$F$17;A1<$G$17)")
.Interior.Color = RGB(255, 199, 206)
.Font.Color = RGB(156, 0, 6)
End With
With .Add(xlExpression, , "=ET(A1<=$F$17;A1>=$G$17)")
.Interior.Color = RGB(224, 224, 224)
End With
With .Add(xlExpression, , "=A1=""""")
.Interior.Color = RGB(128, 128, 128)
End With
End WithTu vois le mécanisme !
Je commence en effet à comprendre un peu le mécanisme merci beaucoup, c'est juste que cette fois j'ai copié ton code et les cellules supérieures et inférieures sont re blanches et non rouges, j'imagine donc qu'il y a du encore y avoir un petit OU ou Et qui se baladent ?
Sinon le reste était parfait
J'ai recopié une version où la première formule n'était pas rectifiée ! Décidément !
Bonne continuation.
Effectivement j'ai vu ça et je l'avais modifié,
Tout est parfait en tout cas merci beaucoup j'y serai jamais arrivé sans toi, je ne te dérange pas plus, j'essayerai de reprendre tout seul chaque ligne pour bien comprendre tout le code
Je te souhaite une continuation à toi aussi