1. #1
    Candidat au Club
    Femme Profil pro
    Étudiant
    Inscrit en
    février 2018
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 19
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : février 2018
    Messages : 6
    Points : 2
    Points
    2

    Par défaut Changer couleur de police selon proximité d'une date date butoire

    Bonjour,

    J'ai vu que des questions assez similaires à la mienne avaient été posées, mais elles ne répondaient pas exactement à ma question, et je ne suis pas assez douée pour comprendre comment utiliser ces éléments de réponse pour les adapter à mon problème...
    Je suis toute nouvelle sur Excel et dans l'univers magique qu'est VBA : une minorante de mon cursus universitaire a le code VBA au programme, je n'ai donc vu que des choses extrêmement simple, et je me suis imaginée pouvoir faire quelque chose de plus compliqué avec mes maigres connaissances ! Après moult recherches, j'appelle à l'aide :

    J'ai un tableau avec plusieurs évènements en colonne B, la date correspondant à l'évènement en C, et le nombre de jours restant avant l'évènement (ou le nombre de jours écoulés depuis) calculés grâce à une fonction VBA en D.
    Je voudrais "simplement" que si la date de l'évènement est dans 10 jours ou moins, ou que si la date est déjà passée, alors la police d'écriture de toute la ligne passe en rouge. Si la date est dans plus de 10 jours, tout reste en noir, et si possible, mais j'en demande peut-être trop, si la date de l'évènement est aujourd'hui, alors que la ligne passe en vert.

    J'ai tenté plusieurs méthodes différentes, mais à chaque fois soit toute la colonne changeait de couleur, soit seule la cellule dans laquelle je faisais "Entrée" changeait de couleur, etc.

    Bien évidemment, je voudrais pouvoir étendre cette fonction, et donc qu'à chaque fois elle ne concerne que la ligne où est la cellule qui calcule (je ne connaissais pas le système de "Range", et même en tentant une boucle for avec des i et des j au niveau des paramètres de la cellule, Excel a rigolé et m'a brusquement tout mis en rouge).

    Est-ce qu'il est possible d'intégrer ça à ma fonction qui me calcule mon nombre de jours restant/passés ?

    Je tente de vous mettre ce que j'ai déjà fait dans ma fonction (et qui donc est problématique à cause de mon Selection, que je ne sais pas par quoi remplacer) :

    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
     
    Function Nb_jours(D)
     
    If Date = D Then
        Nb_jours = "Aujourd'hui !"
        Selection.Font.ColorIndex = 10
    Else
        If Date - D > 0 Then
            Nb_jours = "Il y a " & Date - D & " jours"
            Selection.Font.ColorIndex = 3
        Else
            Nb_jours = "Dans " & -(Date - D) & " jours"
            If D - Date < 10 Then
                Selection.Font.ColorIndex = 3
            Else
                Selection.Font.ColorIndex = 1
            End If
        End If
    End If
     
    End Function
    Pour être sûre que ce soit clair, Date est la date du jour, qui se calcule automatiquement, et D est la date de l'évènement, que j'ai rentré dans la colonne C.

    Un grand merci par avance pour votre aide !
    Felinora

  2. #2
    Expert éminent sénior Avatar de Menhir
    Homme Profil pro
    Ingénieur
    Inscrit en
    juin 2007
    Messages
    10 597
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur

    Informations forums :
    Inscription : juin 2007
    Messages : 10 597
    Points : 20 011
    Points
    20 011

    Par défaut

    Citation Envoyé par felinora Voir le message
    J'ai un tableau avec plusieurs évènements en colonne B, la date correspondant à l'évènement en C, et le nombre de jours restant avant l'évènement (ou le nombre de jours écoulés depuis) calculés grâce à une fonction VBA en D.
    Je ne comprends pas trop pourquoi tu as utilisé une fonction personnalisée en VBA pour faire une opération qui peut se résoudre avec deux SI() (s'il n'y avait pas de texte, ça pourrait même se limiter à une simple soustraction).
    En supposant que tes donnés commencent en ligne 2, il suffit de mettre en D2 la formule :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    =SI(C2=AUJOURDHUI())<1;"Aujourd'hui !";SI(C2<AUJOURDHUI();"Il y a "&(AUJOURDHUI()-C2)&" jours";"Dans "&(C2-AUJOURDHUI()-C2)&" jours"))
    Je voudrais "simplement" que si la date de l'évènement est dans 10 jours ou moins, ou que si la date est déjà passée, alors la police d'écriture de toute la ligne passe en rouge. Si la date est dans plus de 10 jours, tout reste en noir, et si possible, mais j'en demande peut-être trop, si la date de l'évènement est aujourd'hui, alors que la ligne passe en vert.
    Là encore, pas besoin de VBA. Les mises en forme conditionnelles font ça plus facilement (même si ça aurait été plus simple en mettant en colonne D une simple valeur plutôt que des textes).
    Tu sélectionnes toute ta colonne D > Ruban Accueil > Icone mise en forme conditionnelle > Nouvelle règle > Utiliser une formule...
    Dans le champs Formule, tu écris =C1>AUJOURDHUI()-10.
    Cliques sur le bouton Format > Onglet Police > Couleur = Rouge > Ok > Ok

    Et le tour est joué.
    Merci de cliquer sur pour chaque message ayant aidé puis sur pour clore cette discussion.

  3. #3
    Candidat au Club
    Femme Profil pro
    Étudiant
    Inscrit en
    février 2018
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 19
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : février 2018
    Messages : 6
    Points : 2
    Points
    2

    Par défaut

    Merci pour la rapidité de ta réponse !

    Je voulais m'entraîner à utiliser des VBA, et en comprendre vraiment le mécanisme, c'est pour ça que je voulais passer par ça, et passer par des SI ou par ma fonction VBA (sans le problème des couleurs) ne change rien ;-)

    Pour la mise en forme conditionnelle, c'est déjà les réponses que j'avais vu, le problème est que ça ne met en rouge que la cellule où il y a le "Dans X jours", et en appliquant exactement ce que tu viens de me proposer, toute ma colonne se met en rouge...

    Encore merci pour avoir pris le temps de m'écrire une réponse aussi détaillée !

  4. #4
    Membre éprouvé Avatar de BENNASR
    Homme Profil pro
    Responsable comptable & financier
    Inscrit en
    décembre 2013
    Messages
    805
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Responsable comptable & financier
    Secteur : Finance

    Informations forums :
    Inscription : décembre 2013
    Messages : 805
    Points : 1 195
    Points
    1 195

    Par défaut

    bonsoir
    as tu essayez avec la MFC (Mise en Forme Conditionnelle) ?? surtout que tes connaissances en VBA sont limitées !!
    “Développe en toi l'indépendance à tout moment, avec bienveillance, simplicité et modestie.”

  5. #5
    Candidat au Club
    Femme Profil pro
    Étudiant
    Inscrit en
    février 2018
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 19
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : février 2018
    Messages : 6
    Points : 2
    Points
    2

    Par défaut

    Oui, j'ai déjà tenté de plusieurs manières avec la mise en forme conditionnelle, sans succès. Et j'aimerais vraiment comprendre la solution pour l'inclure dans la VBA...

  6. #6
    Expert éminent
    Homme Profil pro
    Inscrit en
    août 2010
    Messages
    2 988
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : août 2010
    Messages : 2 988
    Points : 6 082
    Points
    6 082

    Par défaut

    Bonjour,

    Il te faut savoir qu’une fonction retourne une valeur ou un tableau de valeurs (dans ce cas, elle est dites matricielle) mais elle n’effectue pas d’action donc, pas de coloration de fonte ou tout autre truc dans le genre !
    Si tu veux exécuter des actions, il te faut utiliser des procédures (Sub) et si tu veux que cela se fasse automatiquement, tu as les procédures événementielles dans les modules feuilles et classeur !

  7. #7
    Candidat au Club
    Femme Profil pro
    Étudiant
    Inscrit en
    février 2018
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 19
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : février 2018
    Messages : 6
    Points : 2
    Points
    2

    Par défaut

    Merci pour ton explication, mais pourtant ma fonction change bien ma couleur, dans la bonne ligne, actuellement ?, le problème étant qu'elle ne la change que dans la cellule où il y a la date de l'évènement, et uniquement lorsque je fais "Entrée" dans cette cellule, et non pas dans la cellule où il y a ma fonction (comme je l'aurais pensé), ni de manière automatique.

    Je peux parfaitement faire une Sub que j'appelle ensuite dans ma fonction si ça fonctionnera mieux, ce n'est qu'une question d'écriture, mais dans tous les cas, ma question est : Par quoi dois-je remplacer "Selection" pour que ce soit "Cellule où la formule est entrée + les deux cellules à sa gauche", et que tout se fasse bien ligne par ligne ?

  8. #8
    Expert éminent sénior Avatar de Menhir
    Homme Profil pro
    Ingénieur
    Inscrit en
    juin 2007
    Messages
    10 597
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur

    Informations forums :
    Inscription : juin 2007
    Messages : 10 597
    Points : 20 011
    Points
    20 011

    Par défaut

    Citation Envoyé par felinora Voir le message
    Je voulais m'entraîner à utiliser des VBA, et en comprendre vraiment le mécanisme
    Ca donne plutôt l'impression que tu demandes qu'on fasse tes devoirs...

    passer par des SI ou par ma fonction VBA (sans le problème des couleurs) ne change rien ;-)
    A part que c'est plus rapide, plus souple, moins dépendant de la mise à jour des données et que ça ne demande pas de connaissances en VBA.

    Pour la mise en forme conditionnelle, c'est déjà les réponses que j'avais vu,
    Ce qui signifie que tu as déjà posé la question sur d'autre forum en contradiction avec les règles de celui-ci.

    le problème est que ça ne met en rouge que la cellule où il y a le "Dans X jours", et en appliquant exactement ce que tu viens de me proposer, toute ma colonne se met en rouge...
    Non. La procédure que j'ai indiqué, seule la cellule concernée se met en rouge si la condition est remplie pour cette seule cellule.
    En mettant un $ devant le C dans la formule de la MFC et en étendant la zone d'affectation de la règle à tout ton tableau, on peut même faire en sorte que toute la ligne (et seulement cette ligne) passe en rouge.
    Je pense que tu n'as pas une vision très juste de ce qu'il est possible de faire avec une MFC.

    ni de manière automatique.
    Comme je l'ai dit plus haut, une fonction personnalisée est capricieuse : elle n'est mise à jour que si les données sources (celles transmises en paramètre) sont modifiées.
    Par exemple, pour ta fonction, tu utilises la date du jour.
    Mais si tu laisses ta feuille ouverte pendant plusieurs jours sans modifier les dates en colonne C, les résultat ne se mettront pas à jour parce que les données sources n'ont pas changées.

    Par quoi dois-je remplacer "Selection" pour que ce soit "Cellule où la formule est entrée + les deux cellules à sa gauche", et que tout se fasse bien ligne par ligne ?
    Dans une fonction, on n'utilise pas Selection (qui n'a pas vraiment de signification dans un tel contexte) mais ThisCell.
    https://msdn.microsoft.com/fr-fr/VBA...property-excel

    Avec la propriété Row, tu peux avoir son numéro de ligne que tu appliqueras à un Range qui désignera la zone d'application.
    Mais, comme a dit Theze ( ), fonction et action ne font pas bon ménage. Donc, c'est à tes risques et périls...
    Merci de cliquer sur pour chaque message ayant aidé puis sur pour clore cette discussion.

  9. #9
    Candidat au Club
    Femme Profil pro
    Étudiant
    Inscrit en
    février 2018
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 19
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : février 2018
    Messages : 6
    Points : 2
    Points
    2

    Par défaut

    Non, j'espérais juste en apprendre un peu plus sur le fonctionnement des VBA pour une utilisation personnelle, mon programme de VBA est fini et ce n'est pas au programme, sinon je ne vous embêterai pas
    Quant aux forums, non, j'ai juste lu les réponses à des questions plus ou moins similaire à la mienne, sur différents sites...
    Je ne pensais pas avoir à me justifier de poser cette question, ni d'être curieuse du fonctionnement sous forme de VBA !

    Effectivement, je n'ai pas une vision très juste des Mises en formes conditionnelles, c'est encore plus nouveau pour moi que la VBA ;-) Après plusieurs tests, la formule qui marche chez moi est "C1<AUJOURDHUI()+10)
    Je vais essayer de faire en sorte d'avoir toute la ligne avec la méthode que tu as dit !

    Merci beaucoup pour le ThisCell, c'est exactement ce que je cherchais ! Je vais voir pour passer tout ça sous forme de Sub que j'appellerais dans la fonction. Je note pour le "à mes risques et périls", si c'est capricieux, tant pis, mais je saurais au moins comment faire.

  10. #10
    Expert éminent sénior Avatar de Menhir
    Homme Profil pro
    Ingénieur
    Inscrit en
    juin 2007
    Messages
    10 597
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur

    Informations forums :
    Inscription : juin 2007
    Messages : 10 597
    Points : 20 011
    Points
    20 011

    Par défaut

    Citation Envoyé par felinora Voir le message
    Je vais voir pour passer tout ça sous forme de Sub que j'appellerais dans la fonction.
    Ca ne changera rien : le parent reste une fonction dans ce qui ne fonctionne pas dans une fonction ne fonctionne pas non plus dans un Sub appelé par une fonction.
    Ce serait trop facile.
    Merci de cliquer sur pour chaque message ayant aidé puis sur pour clore cette discussion.

  11. #11
    Membre régulier
    Profil pro
    Inscrit en
    mai 2002
    Messages
    192
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : mai 2002
    Messages : 192
    Points : 113
    Points
    113

    Par défaut

    Utilise une macro du genre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    Sub truc()
            .FormatConditions.Delete
            .FormatConditions.Add Type:=xlExpression, Formula1:="=$C1<0"                      ' Condition 1 - La date est dépassée
            .FormatConditions.Add Type:=xlExpression, Formula1:="=ET($C1<10;$C1>0)"    ' Condition 2 - La date est dans moins de 10 jours
            .FormatConditions.Add Type:=xlExpression, Formula1:="=$C1=0"                       ' Condition 3 - C'est la date du jour
     
            .FormatConditions(1).Font.Color = RGB(255, 0, 0)    ' Ligne en rouge
            .FormatConditions(2).Font.Color = RGB(255, 192, 0)  ' Ligne en orange
            .FormatConditions(3).Font.Color = RGB(0, 255, 0)  ' Ligne en vert
     
        End With
    End sub
    Ici, on considère que ton tableau entier est A1:C10 et que le nombre de jours qui séparent la date de l'évènement et la date butoir est en C1
    En exécutant cette macro 1 seule fois, tu appliques les conditions définitivement.

  12. #12
    Candidat au Club
    Femme Profil pro
    Étudiant
    Inscrit en
    février 2018
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 19
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : février 2018
    Messages : 6
    Points : 2
    Points
    2

    Par défaut

    Oh, merci pour la précision Menhir ! Et j'ai réussi à "étaler" à toute la ligne avec la mise en forme conditionnelle comme tu disais, merci.

    Merci beaucoup pour ce code, je n'avais pas pensé à chercher un autre système que des If/Else !

    Un grand merci à tous pour vos réponses !

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Changer couleur de fond selon 2 criteres
    Par benzot dans le forum Macros et VBA Excel
    Réponses: 10
    Dernier message: 14/12/2013, 00h44
  2. Changer la couleur de police en cliquant sur une cellule
    Par jacfld49 dans le forum Macros et VBA Excel
    Réponses: 22
    Dernier message: 30/01/2010, 16h40
  3. Changer couleur de police d'un Border
    Par ArnaudDev dans le forum AWT/Swing
    Réponses: 2
    Dernier message: 12/05/2009, 10h59
  4. Changer la couleur de police selon critere
    Par guidzit dans le forum Access
    Réponses: 5
    Dernier message: 01/09/2006, 11h09
  5. Réponses: 3
    Dernier message: 21/06/2005, 08h25

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