Format conditionnel spécifique!besoin de macro ou pas?

idimpact

XLDnaute Nouveau
Salut le forum!

Voici mon soucis :

Aujourd'hui dans mon tableau j'utilise la mise en forme conditionnelle pour colorier ma ligne si la valeur de la colonne E correspond à "test".

Si la ligne 5 est coloriée et que A4=A5 alors je veux colorier la ligne 4 et ainsi de suite:cool:

Vous trouverez un exemple en piece jointe
 

david84

XLDnaute Barbatruc
Re : Format conditionnel spécifique!besoin de macro ou pas?

Re
A tester :
Code:
Sub ColorierLigne()
Dim DerLigne As Long, c As Long
DerLigne = Range("A" & Rows.Count).End(xlUp).Row
For c = DerLigne To 2 Step -1
    If Range(Range("A" & c), Range("E" & c)).Interior.ColorIndex <> xlColorIndexNone Then
        If Range("A" & c).Value = Range("A" & c - 1).Value Then
            Range(Range("A" & c - 1), Range("E" & c - 1)).Interior.ColorIndex = 7
        End If
    End If
Next c
End Sub
A+
 
Dernière édition:

job75

XLDnaute Barbatruc
Re : Format conditionnel spécifique!besoin de macro ou pas?

Bonsoir idimpact, salut David,

Une solution par formules.

1) Nom défini Plage (en A2) :

Code:
=Sheet1!$A2:DECALER(Sheet1!$A$1;LIGNE()-2+EQUIV("test";Sheet1!$E2:$E$1000;0);)
2) Formule de la MFC (en A2) :

Code:
=NB.SI(Plage;$A2)=NBVAL(Plage)
Fichier joint.

A+
 

Pièces jointes

  • test(1).xls
    35 KB · Affichages: 63
  • test(1).xls
    35 KB · Affichages: 64
  • test(1).xls
    35 KB · Affichages: 63

job75

XLDnaute Barbatruc
Re : Format conditionnel spécifique!besoin de macro ou pas?

Re,

J'avais compliqué inutilement la formule du nom Plage :

Code:
=DECALER(Sheet1!$A2;;;EQUIV("test";Sheet1!$E2:$E$1000;0))
Fichier (2).

A+
 

Pièces jointes

  • test(2).xls
    35 KB · Affichages: 64
  • test(2).xls
    35 KB · Affichages: 64
  • test(2).xls
    35 KB · Affichages: 67

Gorfael

XLDnaute Barbatruc
Re : Format conditionnel spécifique!besoin de macro ou pas?

Salut idimpact et le forum
Si tu expliquais le but ? On peut sans doute le faire par macro, mais aussi pas MFC. Mais avec juste les indications que tu donnes, il y a trop de possibilités de fonctionnement.
Pour ce que tu donnes : on colorie si la ligne ou la ligne du dessus contient "test" en E
A+
 

david84

XLDnaute Barbatruc
Re : Format conditionnel spécifique!besoin de macro ou pas?

Re
histoire d'adapter le code à des tableaux de différentes grandeurs (et de m'exercer par la même occasion:rolleyes:), une autre manière de l'écrire :
Code:
Sub ColorierLigne2()
Dim DerLigne As Long, c As Long, Plage As Range
DerLigne = Range("A" & Rows.Count).End(xlUp).Row
Set Plage = [A1].CurrentRegion.Offset(1, 0).Resize(DerLigne - 1)
    For c = DerLigne To 2 Step -1
        If Range(Cells(c, 1), Cells(c, Plage.Columns.Count)).Interior.ColorIndex _
        <> xlColorIndexNone Then
            If Cells(c, 1).Value = Cells(c - 1, 1).Value Then
               Range(Cells(c - 1, 1), Cells(c - 1, Plage.Columns.Count)).Interior.ColorIndex = 7
            End If
        End If
    Next c
End Sub
Ne pas hésiter à me corriger ou me conseiller si nécessaire:cool:.
A+
 

Gorfael

XLDnaute Barbatruc
Re : Format conditionnel spécifique!besoin de macro ou pas?

Salut job75 et le forum
David a donné une solution VBA et moi par formules.
En es-tu sûr ?
La solution VBA s'appuie sur
Code:
If Range(Range("A" & c), Range("E" & c)).Interior.ColorIndex <> xlColorIndexNone Then
Mais la coloration est due à une MFC => la propriété ColorIndex reste donc à la valeur xlNone.

Ta solution s'appuie sur la formule
Code:
=DECALER(Sheet1!$A2;;;EQUIV("test";Sheet1!$E2:$E$1000;0))
Pour définir la plage. J'avoue ne pas comprendre ta formule (sans parler de sheet1)
cellule de référence A2
décalée de 0 ligne, 0 colonne (cellule de référence, (toujours A2 pour réf)
Pour la hauteur, tu prends le numéro de la ligne de la première occurrence de "test" et E
Déjà, je mettrais une largeur de 1 colonne, mais là n'est pas le problème (j'ai dit que je ne comprenais pas tout).
Par contre, si tu mets un deuxième "test", en E11 (et rien n'indique qu'il n'y aura qu'un seul "test"), je ne suis pas sûr du résultat.

De plus, la demande laisse planer le doute :
- Doit-on colorier toute les lignes comportant AAA en A ou seulement celle précédant "test" ?
- Est-ce que dans le fichier de travail les compagnies (colonne A) seront classées par ordre croissant ?

C'est pas une critique pour critiquer, juste une explication du pourquoi je demande des précisions.
Personnellement, je trouve qu'un sujet qui dépasse les dix postes, signifie que je n'ai pas su répondre correctement à la demande (sauf, si on étoffe la demande initiale).
A+
 

idimpact

XLDnaute Nouveau
Re : Format conditionnel spécifique!besoin de macro ou pas?

Merci à tous pour vos réponses! J'ai opté pour la solution formule, mes données en colonne A seront toujours classées par ordre croissant afin que la forumule fonctionne. La solution formule semble fonctionner correctement mais je souhaite encore faire quelques tests pour l'adapter à mon fichier.

Pour chaque compagnie dans mon fichier il existe des codes, codes d'avancement de projet! Certains sont définitifs et d'autres non! Quand un projet est terminé, je souhaite que toutes les lignes ou apparait le nom de la compagnie soient de la couleur du code définitif.

J'espère que la solution fonctionnera, je me pose la question des conflits entre différentes MFC. Je vais travailler dessus et vous tiens informé!! En tout cas merci pour vos solutions et vos conseils.

Pour éviter le soucis du classement par ordre croissant des compagnies, il me faudrait une macro qui : si le code "test" apparait dans la colonne E10 alors toutes les lignes qui ont la meme valeur que A10 se colorient de la couleur de la ligne 10. il faut que je regarde ca mais je debute en macro.

Merci a tous
 

idimpact

XLDnaute Nouveau
Re : Format conditionnel spécifique!besoin de macro ou pas?

RE le forum!!

Il s'avère que le système de formules ralentisse pas mal la machine... J'ai plusieurs codes possibles avec différentes couleurs (5 couleurs pour une dizaine de codes):p

Alors je pensais faire un mix des deux solutions : je garde mes MFC pour colorier la ligne si dans la colonne E j'ai la valeur "test".

et je souhaite dire à ma macro:

Regarde dans mon joli tableau les lignes qui sont coloriées. Lorsque tu trouves une ligne coloriée tu regardes la valeur présente dans la colonne A, si tu retrouves cette valeur ailleurs dans cette meme colonne A alors colorie moi la ligne entière ou la valeur se trouve... et ainsi de suite sachant que je vais avoir 5 couleurs de lignes différentes...

Ca se traduit en langage Visual Basic???:confused:
 

job75

XLDnaute Barbatruc
Re : Format conditionnel spécifique!besoin de macro ou pas?

Re,

A priori, il suffit de compléter où il faut la colonne E :

Code:
Sub EtendreTest()
Dim plage As Range, cel As Range, txt As String
Application.ScreenUpdating = False
On Error Resume Next
Set plage = [E2:E65536].SpecialCells(xlCellTypeConstants, 2)
For Each cel In plage
  txt = cel.Offset(, -4)
  [A:A].Replace txt, 1, LookAt:=xlWhole
  Set plage = Nothing
  Set plage = [A:A].SpecialCells(xlCellTypeConstants, 1)
  plage.Offset(, 4) = "test"
  plage = txt
Next
End Sub
Fichier (3) joint.

Edit : il n'y a ici qu'une seule couleur de MFC, on pourrait en mettre jusqu'à 3 en traitant 3 colonnes E F G.

A+
 

Pièces jointes

  • test(3).xls
    47.5 KB · Affichages: 54
  • test(3).xls
    47.5 KB · Affichages: 59
  • test(3).xls
    47.5 KB · Affichages: 58
Dernière édition:

job75

XLDnaute Barbatruc
Re : Format conditionnel spécifique!besoin de macro ou pas?

Re,

Cette macro sera plus rapide s'il y a des valeurs "test" redondantes (c'est le cas une fois la colonne E complétée) :

Code:
Sub EtendreTest()
Dim plage As Range, d As Object, cel As Range, txt
Application.ScreenUpdating = False
On Error Resume Next
Set plage = [E2:E65536].SpecialCells(xlCellTypeConstants, 2)
Set d = CreateObject("Scripting.Dictionary")
For Each cel In plage.Offset(, -4)
  d(cel.Value) = cel.Value
Next
For Each txt In d.items
  [A:A].Replace txt, 1, LookAt:=xlWhole
  Set plage = Nothing
  Set plage = [A:A].SpecialCells(xlCellTypeConstants, 1)
  plage.Offset(, 4) = "test"
  plage = txt
Next
End Sub
A+
 

Pièces jointes

  • test(4).zip
    15.7 KB · Affichages: 27
  • test(4).zip
    15.7 KB · Affichages: 30
  • test(4).zip
    15.7 KB · Affichages: 27

Discussions similaires

Statistiques des forums

Discussions
312 520
Messages
2 089 294
Membres
104 092
dernier inscrit
karbone57