mise en forme conditionnelle

lectave

XLDnaute Nouveau
Bonjour,
j'ai une base de données (excel 2003) contenant une dizaine de colonnes. La premières colonne contient le nom de la personne les autres colonnes des données diverses. Toute les semaines cette base s'enrichit, quelques fois de noms déjà existants quelques fois de nouveaux noms. Le tableau est trié par ordre alphabétique. Je voudrais griser un nom sur 2 (alternance gris - blanc) pour rendre le tableau plus lisible. Il faut griser toute la ligne (10 colonnes) sachant que le nombre de ligne pour chaque nom est variable.
Pour être plus explicite voici un exemple (n = nom):
n1 : gris
n1 : gris
n1 : gris
n2 : blanc
n2 : blanc
n3 : gris
n3 : gris
n4 : blanc
n5 : gris
n5 : gris
n5 : gris
n6 : blanc
etc ...
J'ai réflechi à pas mal de solutions, mais je n'ai pas trouvé pour le moment ...
Merci d'avance.
 
N

Nanard

Guest
Bonjour lectave,

comme tu l'indique dans ton message tu veux pour abtenir une meilleure lisibilité, que les ligne s soient grisée à concurence de 1 sue 2
sauf que ton exemple défini les N1,N3... en gris et d'autres en blanc, le VBA peut aider:

Sub gris()
Range('1:1,3:3,5:5,7:7,9:9,11:11,13:13,15:15').Select
With Selection.Interior
.ColorIndex = 15
End with
Range('A1').select
End sub

la sélection de la macro ci-dessus sélectionne la ligne 1 à 15, une sur deux, à modifier

@+
Nanard
 

lectave

XLDnaute Nouveau
effectivement, lors de la prochaine mise à jour de la base de données on peut très bien avoir :
n1 : gris
n1 : gris
n1 : gris
n1 : gris
n2 : blanc
n2 : blanc
n3 : gris
n3 : gris
n4 : blanc
n4 : blanc
n4 : blanc
n5 : gris
n5 : gris
n5 : gris
n6 : blanc
n6 : blanc
à la place de l'exemple du premier post
Le code ne doit donc pas être figé mais évolutif ...
 

andré

XLDnaute Barbatruc
Salut,

Par le truchement d'une colonne supplémentaire, il n'y a aucun problème, mais j'essaie (déjà depuis un moment) à le faire sans cette colonne !

En attendant, je te donne cette version, mais qui sera améliorée, je' e'spère bien .

Â+



[file name=MFC_lectave_V1.zip size=2332]http://www.excel-downloads.com/components/com_simpleboard/uploaded/files/MFC_lectave_V1.zip[/file]
 

Gael

XLDnaute Barbatruc
Bonjour Lectave, nanard, André,

J'ai trouvé une formule en MFC qui a l'air de bien marcher:

=MOD(ARRONDI(SOMME(1/NB.SI($A$1:$A1;$A$1:$A1));0);2)=0

La formule va compter le nombre de valeurs différentes jusqu'à la ligne en cours ( la plage s'agrandit au fur et à mesure des n°s de lignes) et prendre le modulo 2.

Cela ne fonctionne correctement que si toutes les lignes d'un même nom se trouvent à la suite les unes des autres.

Voir fichier joint.

@+

Gael [file name=Affichage_20050829185332.zip size=1777]http://www.excel-downloads.com/components/com_simpleboard/uploaded/files/Affichage_20050829185332.zip[/file]
 

Pièces jointes

  • Affichage_20050829185332.zip
    1.7 KB · Affichages: 18

andré

XLDnaute Barbatruc
Salut Gael,

J'avais trouvé la formule de MFC suivante, sur base d'une formule de Monique :

=MOD(SOMMEPROD(1/NB.SI(A$2:A2;A$2:A2));2)=0

Elle ressemble étrangement à ta tienne, mais j'attendais une réaction de lectave avant de la publier.

L'avantage de cette formule, c'est qu'elle ne nécessite pas de colonne supplémentaire.
Son désavantage, c'est qu'elle ne fonctionne que si la liste est triée.

Â+
 

Gael

XLDnaute Barbatruc
Rebonjour André,

J'ai du rajouter la fonction Arrondi pour que ça marche dans tous les cas, sinon, j'obtenais quelques aberrations mais je n'ai pas compris pourquoi. J'ai essayé en utilisant Sommeprod et c'est la même chose, le résultat à la ligne 19 sans Arrondi est:

-0,0000000000000008881784 et non pas 0.

Si la formule doit fonctionner sur plusieurs colonnes, le $A est nécessaire.

Pour la liste, il n'est pas nécessaire qu'elle soit triée mais seulement que les lignes concernant un même nom soient contigües.

@+

Gael
 

pat1545.

XLDnaute Accro
Salut,

moi j'ai pondu ceci qui devrait aller :

Option Explicit
Sub UnesurX()
On Error Resume Next
Dim i As Long, n As Long
Dim Rngdelete2, Rng2, Valeurs
Sheets(1).Select
n = Cells(65536, 1).End(xlUp).Row
Range('A1:J' & n + 2).ClearFormats
For i = 2 To n
If (Cells(i, 1) = Cells(i + 1, 1)) Then
Range(Cells(i, 1), Cells(i, 10)).Interior.ColorIndex = 15
Else
Range(Cells(i, 1), Cells(i, 10)).Interior.ColorIndex = 15
Valeurs = Cells(i + 1, 1)
While Cells(i + 1, 1) = Valeurs
i = i + 1
Wend
Range(Cells(i + 1, 1), Cells(i + 1, 10)).Interior.ColorIndex = 15
End If
suivant:
Next
End Sub

Patrick
 

lectave

XLDnaute Nouveau
Boujour à tous,
j'ai essayé les différentes méthodes que vous m'avez proposées.
J'ai retenu au final :

'=MOD(ARRONDI(SOMMEPROD(1/NB.SI($B$3:$B3;$B$3:$B3));0);2)=0'
Selection.FormatConditions(1).Interior.ColorIndex = 15

dans une petite macro de mef, ça à l'air de fonctionner pour le moment.
Merci pour vos conseils en tous cas.
@+
Lectave
 

Discussions similaires

Statistiques des forums

Discussions
312 570
Messages
2 089 768
Membres
104 271
dernier inscrit
acuponctus