Bonjour

Pour info, je continue la mise en place d'un planning visuel de présences sur chantier (voir post Résolu http://www.developpez.net/forums/sho...d.php?t=485595 )

Je crée un planning par mois, avec en abscisses les dates (du 1 au 31 du mois), et en ordonnées, les chantiers avec pour chacun la liste de tous les ouvriers (1 ligne résumé pour le chantier, et 13 lignes pour les ouvriers).
Le remplissage de ce tableau-planning est déjà fait ("1" quand un tel ouvrier est présent sur un tel chantier à une telle date). Merci Pierre !
Vous verrez dans le code suivant que je souhaite colorer les cellules indiquant une présence (">=1").
J'avais d'abord créé une boucle sur les lignes, puis comme l'exécution de la macro était horriblement lente, je boucle sur la colonne (plus rapide car la date de référence reste la même dans chaque boucle).
Par contre, je ne peux changer de couleur de remplissage selon le chantier (premier chantier : planning en vert; 2è chantier: planning en bleu; etc).
Ou alors, il faut que je boucle sur chaque cellule, et non plus par ligne ou par colonne; ce qui allonge encore le temps d'éxécution.

Dans le code suivant, j'aimerais donc par exemple que le code RGB ne soit pas fixe comme ici:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
        'Définit la couleur de fond de la cellule lorsque les conditions sont respectées
        With .FormatConditions(1)
            .Interior.Color = RGB(190, 0, 190)  'changer de couleur par chantier
        End With
mais bien qu'il varie selon le chantier, donc selon la ligne dans laquelle on se trouve. Par exemple comme ici:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
        'Définit la couleur de fond de la cellule lorsque les conditions sont respectées
        With .FormatConditions(1)
            .Interior.Color = RGB(10*NoDuChantier, 0, 10*NoDuChantier)  'changer de couleur par chantier
        End With
Quelqu'un a une idée pour améliorer les performances de cette procédure (même si elle n'est sensée être exécutée qu'une seule fois par mois) ?



Voici le code complet:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
Sub MFCparColonne()
 
Const ColonneDebutDate  As Integer = 6  'Variable qui devra être déclarée publiquement, dans tout le projet
Const LigneDate As Integer = 3
Dim FormuleConditionnelle As String
Dim PlageChantier As Range
Dim ContenuCelluleDate As String
Dim DateAComparer As Long
Dim i As Integer
Dim NbreDeChantiers As Integer
Dim NoLigne As Integer
 
NbreDeChantiers = Worksheets("Chantiers").Range("G1").Value
 
For i = ColonneDebutDate To (ColonneDebutDate + 30) 'Remplacer 30 par le nombre de jours du mois -1 (moins 1)
    Set PlageChantier = Range(Cells(5, i), Cells(NbreDeChantiers * 14 + 5, i)) 'De F5 à Fxxx où xxx = la dernière ligne de chantier
    ContenuCelluleDate = Cells(LigneDate, i).Value
    DateAComparer = DateValue(ContenuCelluleDate)
 
    With PlageChantier
        'Supprime les MFC existantes
        .FormatConditions.Delete
 
        'Ajoute la condition d'avoir au moins 1 ouvrier présent
        .FormatConditions.Add Type:=xlCellValue, Operator:=xlGreaterEqual, Formula1:="1"
 
        'Ajoute une condition permettant de repérer les samedis et dimanches
        FormuleConditionnelle = "=ou(joursem(" & DateAComparer & ";2)=6;joursem(" & DateAComparer & ";2)=7)"
        .FormatConditions.Add Type:=xlExpression, Formula1:=FormuleConditionnelle
 
        'Définit la couleur de fond de la cellule lorsque les conditions sont respectées
        With .FormatConditions(1)
            .Interior.Color = RGB(190, 0, 190)  'changer de couleur par chantier
        End With
        With .FormatConditions(2)
            .Interior.Color = RGB(240, 240, 240)    'grise les samedis et dimanches
        End With
    End With
Next i
 
End Sub