Mise en forme conditionnelle ne prend pas le bon numéro de ligne

Juntad

XLDnaute Nouveau
Bonjour,

J'ai écrit une macro Excel qui ajoute des mises en forme conditionnelle sur une plage de cellule selon la valeur de la cellule "D#" avec # le numéro de la ligne.
  1. Si la valeur de la cellule en cours est égal à celle de "D#", la cellule est verte,
  2. si elle est égale à "Non installé", la cellule est rouge,
  3. si elle est différente de "D#", la cellule est orange.

ma macro modifie les mises en forme conditionnelle mais parfois (souvent même), le numéro de ligne n'est pas le bon (exemple, "=$D19" sur une cellule de la ligne 15).

Voici ma macro, je posterai un exemple si besoin est

Code:
Sub insertConditions()
    Dim row As Integer
    Dim col As Integer
    Dim formula As String
    Dim cell
    row = 8
    On Error Resume Next
    While row < 25
        formula = "=$D" & Trim(Str(row))
        col = 5
        While col < 16
            If Cells(row, col).FormatConditions(1).Formula1 <> formula Or _
               Cells(row, col).FormatConditions(3).Formula1 <> formula Then
                Call modifyConditions(row, col, formula)
            End If
            col = col + 1
        Wend
        row = row + 1
    Wend
    On Error GoTo 0
End Sub

Private Sub modifyConditions(row As Integer, col As Integer, formula As String)
    Cells(row, col).FormatConditions.Delete
    Cells(row, col).FormatConditions.Add Type:=xlCellValue, Operator:=xlEqual, _
        Formula1:=formula
    Cells(row, col).FormatConditions(1).Font.ColorIndex = 51
    Cells(row, col).FormatConditions(1).Interior.ColorIndex = 35
    Cells(row, col).FormatConditions.Add Type:=xlCellValue, Operator:=xlEqual, _
        Formula1:="=""Non installé"""
    Cells(row, col).FormatConditions(2).Font.ColorIndex = 2
    Cells(row, col).FormatConditions(2).Interior.ColorIndex = 3
    Cells(row, col).FormatConditions.Add Type:=xlCellValue, Operator:=xlNotEqual, _
        Formula1:=formula
    Cells(row, col).FormatConditions(3).Interior.ColorIndex = 40
End Sub


Merci de votre aide =D
 
G

Guest

Guest
Re : Mise en forme conditionnelle ne prend pas le bon numéro de ligne

Re,

Peut-être qu'en remplaçant le nom de ta variable ligne 'row' qui est un nom révervé du langage par 'ligne'.

Les variables de lignes ou colonnes sont de type 'Long' et non Integer.

De plus il n'est pas forcément utile de boucler sur les 16 colonnes:

Cells(ligne, col).Resize(, 16).FormatConditions(1).......



A+
 

Juntad

XLDnaute Nouveau
Re : Mise en forme conditionnelle ne prend pas le bon numéro de ligne

Peut-être qu'en remplaçant le nom de ta variable ligne 'row' qui est un nom révervé du langage par 'ligne'.
ça ne change rien, apparemment, la ligne de la cellule sélectionnée se met correctement en forme mais pas les autres :eek:

De plus il n'est pas forcément utile de boucler sur les 16 colonnes:
Cells(ligne, col).Resize(, 16).FormatConditions(1).......
Cette méthode me retourne une erreur quand je fais Cells(ligne, col).Resize(, 16).FormatConditions.delete :confused:

Je joins un fichier de test avec ma macro.

Merci beaucoup pour votre aide =)
 

Pièces jointes

  • Classeur1.xls
    32.5 KB · Affichages: 51
  • Classeur1.xls
    32.5 KB · Affichages: 49
  • Classeur1.xls
    32.5 KB · Affichages: 51
G

Guest

Guest
Re : Mise en forme conditionnelle ne prend pas le bon numéro de ligne

Re,

Je ne vois pas la nécessitée d'une boucle, tes références de cellules étant connues par avance.

Code:
Sub insertConditions()
      With Range("E8:O24")
        .FormatConditions.Delete
        With .FormatConditions.Add(Type:=xlCellValue, Operator:=xlEqual, Formula1:="=$D8")
            .Font.ColorIndex = 51
            .Interior.ColorIndex = 35
        End With
        With .FormatConditions.Add(Type:=xlCellValue, Operator:=xlEqual, Formula1:="=""Non installé""")
            .Font.Color = 2
            .Interior.ColorIndex = 3
        End With
        .FormatConditions.Add Type:=xlCellValue, Operator:=xlNotEqual, Formula1:="="$D8""
        .FormatConditions(3).Interior.ColorIndex = 40
    End With
End Sub

A+
 
Dernière modification par un modérateur:

Juntad

XLDnaute Nouveau
Re : Mise en forme conditionnelle ne prend pas le bon numéro de ligne

Re,

Je boucle car la condition est différente selon la ligne, donc, à la limite, boucler seulement sur les lignes.
Dans ton exemple, le "$D8" n'est valide que pour la ligne 8, pour la ligne 9, il faut "$D9" etc...

Mais ça ne fonctionne pas bien, ça me met "$D19" sur la ligne 20 et parfois même "$D65523" sur la ligne 8 o_o

Merci du temps que tu m'accordes, c'est sympa ^^
 
G

Guest

Guest
Re : Mise en forme conditionnelle ne prend pas le bon numéro de ligne

Re,

Non, c'est là où il y a erreur, il suffit dans la condition de mettre un $ devant D et pas devant 8 pour qu'excel adapte automatiquement le numéro de ligne même si tu les fais en macro.

Attention: dans le code donné précédement j'avais oublié d'enlever certain guillemets: ok ci-dessous

Code:
      With Range("E8:O24")
        .FormatConditions.Delete
        With .FormatConditions.Add(Type:=xlCellValue, Operator:=xlEqual, Formula1:="=$D8")
            .Font.ColorIndex = 51
            .Interior.ColorIndex = 35
        End With
        With .FormatConditions.Add(Type:=xlCellValue, Operator:=xlEqual, Formula1:="=""Non installé""")
            .Font.Color = 2
            .Interior.ColorIndex = 3
        End With
        .FormatConditions.Add Type:=xlCellValue, Operator:=xlNotEqual, Formula1:="=$D8"
        .FormatConditions(3).Interior.ColorIndex = 40
    End With

A+
 
Dernière modification par un modérateur:

Juntad

XLDnaute Nouveau
Re : Mise en forme conditionnelle ne prend pas le bon numéro de ligne

Re re ^^

Oui, tu as raison, ta sub marche très bien...à condition d'avoir sélectionné une cellule de la première ligne à "formatter" ! =/
Du coup, j'ai juste ajouté "Cells(8, 5).Select" pour que ça fonctionne où qu'on soit...oui, pas très propre mais ça marche =p

Merci beaucoup Hasco de ton aide =D
 
G

Guest

Guest
Re : Mise en forme conditionnelle ne prend pas le bon numéro de ligne

Re,

Ce sont les formats conditionnels qui fonctionnent comme ça. A ce propos, tu n'as pas besoin non plus d'utiliser 3 conditions. Si tu mets tes cellules à un format orange par défaut. Il te suffit de ne mettre que les deux premières.

Si tu veux vraiment une boucle (ce qui alourdit les temps de traitements), pour traiter chaque ligne indépendament:

Code:
Sub insertConditions()
    Dim r As Range
      For Each r In Range("$E$8:$O$24").Rows
        r.FormatConditions.Delete
        With r.FormatConditions.Add(Type:=xlCellValue, Operator:=xlEqual, Formula1:="=$D$" & r.Row)
            .Font.ColorIndex = 51
            .Interior.ColorIndex = 35
        End With
        With r.FormatConditions.Add(Type:=xlCellValue, Operator:=xlEqual, Formula1:="=""Non installé""")
            .Font.Color = 2
            .Interior.ColorIndex = 3
        End With
        r.FormatConditions.Add Type:=xlCellValue, Operator:=xlNotEqual, Formula1:="=$D$" & r.Row
        r.FormatConditions(3).Interior.ColorIndex = 40
    Next
End Sub

A+
 

Discussions similaires

Réponses
2
Affichages
693

Statistiques des forums

Discussions
312 317
Messages
2 087 189
Membres
103 493
dernier inscrit
Vidal Salvador