IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Macros et VBA Excel Discussion :

MFC dépendant de la ligne ET de la colonne: lenteur exécution


Sujet :

Macros et VBA Excel

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    26
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2004
    Messages : 26
    Points : 27
    Points
    27
    Par défaut MFC dépendant de la ligne ET de la colonne: lenteur exécution
    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

  2. #2
    Membre averti Avatar de tomy7
    Profil pro
    Étudiant
    Inscrit en
    Janvier 2008
    Messages
    540
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2008
    Messages : 540
    Points : 391
    Points
    391
    Par défaut re
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    With .FormatConditions(1)
                .Interior.Color = RGB("10" & NoDuChantier, 0, '10" & NoDuChantier)
    tu fais Chantier = inputbox
    if Chantier = ..... then NoDuChantier = "09"

    par exemple
    je ne suis pas sure que sa fonctionne je n ai pas le temps de verifier mais l idee est la.

  3. #3
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    26
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2004
    Messages : 26
    Points : 27
    Points
    27
    Par défaut
    Merci pour ta réponse Tomy. Je ne comprends pas bien pourquoi tu saisis les données R, G et B sous forme de string. Tu peux m'en dire plus ?

    En fait, l'inputbox (ou équivalent) ne sert pas dans mon cas.

    J'ai adapté la fin de mon code (voir en bas de message).
    Ca marche pas trop mal. Mais pour environ 20 chantiers, une dizaine d'ouvriers, et 31 jours du mois (soit entre 5.000 et 10.000 cellules), cela prend 3-4 minutes.
    C'est clair que la mise en forme ne sera pas à exécuter souvent, je trouve tout de même cela peu efficace... Donc si quelqu'un(e) voit comment améliorer, je suis preneuse !

    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
    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)
     
        For n = 1 To PlageChantier.Rows.Count
        With PlageChantier.Cells(n, 1)
            '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
            NoChantier = Int(n / 14 + 1)
                Select Case NoChantier Mod 5
                    Case 0
                        RGBvaleur = RGB(0, 0, 255)  'bleu
                    Case 1
                        RGBvaleur = RGB(0, 255, 0)  'vert
                    Case 2
                        RGBvaleur = RGB(255, 0, 255)    'magenta
                    Case 3
                        RGBvaleur = RGB(255, 255, 0)    'jaune
                    Case 4
                        RGBvaleur = RGB(255, 180, 80)    'orange ?
                End Select
     
            With .FormatConditions(1)
                .Interior.Color = RGBvaleur '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 n
    Next i

  4. #4
    Membre averti Avatar de tomy7
    Profil pro
    Étudiant
    Inscrit en
    Janvier 2008
    Messages
    540
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2008
    Messages : 540
    Points : 391
    Points
    391
    Par défaut re
    j ai lu en diagonale ton prob alors j ai mise a cote .

    dsl


    pk sa rame, la j en ai aucune idee je pense qu il te faut l aide de quelqu un de plus doue que moi.
    je manque d experience.



    je m en excuse.

Discussions similaires

  1. MFC dépendant d'un autre contrôle
    Par Smint dans le forum Access
    Réponses: 10
    Dernier message: 24/06/2006, 18h09
  2. Listview selection d'une ligne et d'une colonne
    Par PierreBord dans le forum Composants VCL
    Réponses: 1
    Dernier message: 13/02/2006, 13h56
  3. [MFC] CListView, liste en ligne
    Par MarieMtl dans le forum MFC
    Réponses: 10
    Dernier message: 01/02/2006, 22h58
  4. [MFC]retour a la ligne dans une EditBox
    Par bibi_64 dans le forum MFC
    Réponses: 2
    Dernier message: 15/12/2005, 12h35
  5. Alias colonne dépendant de la valeur d'une autre colonne
    Par daijoubu dans le forum Langage SQL
    Réponses: 6
    Dernier message: 31/08/2005, 09h17

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo