Mise en forme conditionnelle des cellules d'une plage de données

Karim_1972

Habitué
Bonsoir à tous,

Dans mon programme, j’ai introduit dans la colonne « H » une fonction qui test à la fois la colonne « B » et « G » et met en conclusion dans « H » des observations (Texte)..
1- Reco
2- Test
3- Demo
En fonction de ces observations j’ai programmé une couleur sur toute la ligne allant de (B :H)
Par ailleurs, la formule renvoi des erreurs dans la collonne « H » #VALEUR! Si elle ne trouve rien dans la colonne « b » (le premier test), c’est normal..
J’ai pensé donc, de mettre une couleur de fond « Blanc »pour ces erreurs de formules afin de les dissimulées et parfaire l’affichage.
Le programme fonctionne à merveille sur mon PC sous Excel 2010, mais sur d’autres (sous Excel 2007 & 97) sa beug, il renvoi une erreur ‘1004’.. ?? à la ligne 28 :.ThemeColor = xlThemeColorDark1

Ci-après le code:

Code:
Range("H2").Select
    ActiveCell.FormulaR1C1 = _
        "=IF(SEARCH(""total"",C[-6], 1), IF(RC[-1]=0, ""Reco "", IF(RC[-1]>0, ""TEST"",""Demo"")))"
        Do While Not (IsEmpty(ActiveCell))
    Cells(ActiveCell.Row, 8).Formula = "=IF(SEARCH(""total"",C[-6], 1), IF(RC[-1]=0, ""Reco "", IF(RC[-1]>0, ""TEST"",""Demo"")))"
    Selection.Offset(1, 0).Select
    Loop  
    Sheets("Feuil5").Select
    lig = Cells.Find("*", , xlFormulas, , xlByRows, xlPrevious).Row
    col = Cells.Find("*", , xlFormulas, , xlByColumns, xlPrevious).Row
    Dim derlig As Long
    derlig = Range("A65536").End(xlUp).Row
    Range(Cells(1, 2), Cells(derlig, 8)).Select
    With Selection
    .FormatConditions.Delete
    .FormatConditions.Add Type:=xlExpression, Formula1:="=$H1=""Reco"""
    .FormatConditions(1).Interior.ColorIndex = 15
    .FormatConditions.Add Type:=xlExpression, Formula1:="=$H1=""Demo"""
    .FormatConditions(2).Interior.ColorIndex = 40
    .FormatConditions.Add Type:=xlExpression, Formula1:="=$H1=""TEST"""
    .FormatConditions(3).Interior.ColorIndex = 35
    End With
    Columns("H:H").Select
    Selection.FormatConditions.Add Type:=xlExpression, Formula1:= _
        "=ESTERREUR(H1)"
    Selection.FormatConditions(Selection.FormatConditions.Count).SetFirstPriority
    With Selection.FormatConditions(1).Font
        .ThemeColor = xlThemeColorDark1
        .TintAndShade = 0
    End With


Est-ce que c’est un problème de version ?? si Oui, comment dois-je l'écrire pour qu'il soit déroulé même sur des anciennes versions?

Je vous remercie par avance pour votre aide.

 

Karim_1972

Habitué
Bonsoir,
A priori, sa ne peux etre qu'un problème lié au nombre de mise en forme conditionnelle autorisées!! mais je ne suis pas convaincu, car sa fonctionne sur mon PC..!
A suivre..
 

zeb

Modérateur
Salut Karim,

Oh le beau message bien formaté ;)
Ton problème est effectivement dû au versionning.

En effet, les propriétés ThemeColor et TintAndShade n'existent pas dans ces versions inférieures.

-------------------------------

Sinon, bouh que ce code est laid !
A chaque fois que tu utilises Select ou Activate, il y a une erreur de conception.
Veux-tu vraiment sélectionner ces objects ? Non, tu veux y faire référence !
Alors fais les choses bien.

A chaque fois que tu écris :
Code:
' Pas bon
Truc.Select
Selection.Machin()
remplace par :
Code:
' Ah, là c'est mieux
Truc.Machin()
T'inquiète pas, t'es pas le 1er, si je ne l'ai pas fait remarquer 500 fois sur ce site, c'est que je ne l'ai jamais dit !

Ça donne :
Code:
Dim ta_cellule As Range
Dim ta_derlig  As Range

Set ta_cellule = Worksheets("???").Range("H2")
Set f5 = Worksheet("Feuil5")

ta_cellule.FormulaR1C1 = "=IF(SEARCH(""total"",C[-6], 1), IF(RC[-1]=0, ""Reco "", IF(RC[-1]>0, ""TEST"",""Demo"")))"
Do While Not (IsEmpty(ta_cellule))
    ta_cellule.Cells(ActiveCell.Row, 8).Formula = "=IF(SEARCH(""total"",C[-6], 1), IF(RC[-1]=0, ""Reco "", IF(RC[-1]>0, ""TEST"",""Demo"")))"
    Set ta_cellule = ta_cellule.Offset(1, 0)
Loop

lig = f5.Cells.Find("*", , xlFormulas, , xlByRows, xlPrevious).Row
col = f5.Cells.Find("*", , xlFormulas, , xlByColumns, xlPrevious).Row

Set derlig = f5.Range("A65536").End(xlUp)
With f5.Range(f5.Cells(1, 2), derlig.Cells(8))
    .FormatConditions.Delete
    .FormatConditions.Add Type:=xlExpression, Formula1:="=$H1=""Reco"""
    .FormatConditions(1).Interior.ColorIndex = 15
    .FormatConditions.Add Type:=xlExpression, Formula1:="=$H1=""Demo"""
    .FormatConditions(2).Interior.ColorIndex = 40
    .FormatConditions.Add Type:=xlExpression, Formula1:="=$H1=""TEST"""
    .FormatConditions(3).Interior.ColorIndex = 35
End With
With f5.Columns("H")
    .FormatConditions.Add Type:=xlExpression, Formula1:="=ESTERREUR(H1)"
    .FormatConditions(.FormatConditions.Count).SetFirstPriority
End With
f5.Columns("H").FormatConditions(1).Font.ColorIndex = 3
Il y a mille bonnes raisons pour faire comme ça ;)

Revenons à ta solution qui consiste à changer les couleurs pour cacher tes erreurs !
Et si à la place, tu compliquais tes formules avec un =IF(ISERROR(formule);"";formule) ?
 

Karim_1972

Habitué
Bonsoir Zeb;
Merci infiniment pour ces éclaircissements, car là j'apprends vraiment des choses... De fait, le programme est devenu très souple et facile à lire..Merci encore.
J'ai pas pu tester la solution que tu m'a proposée car je viens de rentrer d'une mission en France.. je le ferais dès demain et je te tiendrais au courant.
J'espere que je vais réussir à compliquer encore plus la fonction;)

A bientôt.
 

Karim_1972

Habitué
Bonsoir Zeb,
Je n'arrive toujours pas à compliquer la formule comme proposé (=IF(ISERROR(formule);"";formule) ), Faudrait-il copier toute la formule au lieu et place de (Formule)??

Merci par avance pour ton aide.
 

zeb

Modérateur
Eh, ce n'est plus de la programmation VB, mais de l'art d'utiliser ton tableur.
Ce qui est ici hors sujet. :o

Qu'importe si on n'en abuse pas ;)

Tu as ton résultat, éventuellement en erreur dans une cellule de la colonne A.
Dans la colonne B, tu ajoute une formule telle que cette que je te proposais et qui fait référence à la cellule de la colonne A.
Et tu caches la colonne A.
 

Karim_1972

Habitué
Merci Zeb, mais dans mon cas c'est impossible..!
J'ai tout essayé, je trouverais bien une autre solution car dans la colonne B j'ai des données à tester qu'il faut pas remplacé..
 

Karim_1972

Habitué
J'ai réussi tout de même à faire quelque chose en VB :na:
mais il reste à le parfaire avec ton aide:
J'ai mis à la place:
Code:
With Selection
    Columns("H:H").Select
    .SpecialCells(xlCellTypeFormulas, xlErrors).Value = 0
     End With
    On Error GoTo 0
J'aimerais affiché à la place du "0" un caractère blanc (Espace) comment pourais-je l'écrire en VB??

Merci par avance.
 

Karim_1972

Habitué
Bingoooo..:bounce::bounce::bounce: J'ai réussi..pas possible!!!
J'ai écris:
Code:
With Selection
Columns("H:H").Select
.SpecialCells(xlCellTypeFormulas, xlErrors).Value = "  " 
End With
On Error GoTo 0
Et sa marche. Qu'elle satisfaction je te dis rien..
Merci en tout cas
 

zeb

Modérateur
Eh, c'est cool !!!
:)

--------------------

A chaque fois que tu utilises Select, Selection ou Activate, il y a une erreur de conception !
(Mais je crois l'avoir déjà dis)
 
Vous devez vous inscrire ou vous connecter pour répondre ici.
Derniers messages publiés
Statistiques globales
Discussions
730 128
Messages
6 717 848
Membres
1 586 373
Dernier membre
https://forum.tomshardwar
Partager cette page
Haut