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 :

Mise en forme conditionnelle


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Inscrit en
    Août 2007
    Messages
    170
    Détails du profil
    Informations forums :
    Inscription : Août 2007
    Messages : 170
    Par défaut Mise en forme conditionnelle
    Bonjour,

    je me permets de vous demander de l'aide sur une macro vba qui a pour objectif de réaliser une mise en forme conditionnelle en fonction des critères affichés dans les cellules d'une colonne.

    Ainsi si la valeur de la cellule est 1 alors la cellule est rouge et le texte aussi
    Si la valeur est 0 alors la cellule est blanche et le texte blanc.

    Je souhaite faire une macro car je réalise ce tableau de bord sur excel 2007 et lorsque mes collègues l'ouvre sur 2003 la mise en forme conditionnelle saute?!?.

    j'ai donc trouver le code suivant qui fonctionne mais ....

    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
    Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)
    Dim Plage As Range, c As Range
    Dim Klr As Integer
    Dim Fnt As Byte
     
    If InStr("Fusion NPC", Sh.Name) > 0 Then   'adapter le nom des feuilles concernées
        Set Plage = Intersect(Target, Range("F3:F20000"))         'Range("F3:F20000") à adapter
        If Not Plage Is Nothing Then
            For Each c In Plage
                Select Case c.Value
                    Case "1": Klr = 3: Fnt = 3
                    Case "0": Klr = 2: Fnt = 2
     
                    '....
                    Case Else: Klr = xlNone: Fnt = 0
                End Select
                c.Interior.ColorIndex = Klr
                c.Font.ColorIndex = Fnt
            Next c
        End If
        Set Plage = Nothing
    End If
    End Sub
    Le problème est que mes valeurs qui s'affiche dans mes celulles (1 ou 0) sont issues d'un calcul et que la macro ne fonctionne pas sauf si je tape directement la valeur (1 ou 0) dans la celllule ?????

    Par avance merci pour votre aide

    Cordialement

  2. #2
    Membre Expert
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    2 130
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 2 130
    Par défaut
    Salut ANTMA et le forum
    Moi, je ferais une MFC sur 2003, et les nouvelles versions la comprendront.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)
        Set Plage = Intersect(Target, Range("F3:F20000"))         'Range("F3:F20000") à adapter
    elle fonctionnera si c'est le contenu d'une des cellules F3:F20000 qui est modifié. Pas la valeur affichée, comme celle issue d'une MFC, d'une formule ou d'un format, qui ne modifient que l'apparence, sans toucher au contenu réel de la cellule.
    Il faut donc mofifier ton range source. soit en mettant à la place de F la/les vraies colonnes modifiées, manuellement dans le code, soit en utilisant la propriété Precedant.
    ou, à l'extrême limite, nous donner la formule de la colonne F. Mais je comprends que mettre une formule si secrète sur un forum peut entraîner un grave souci au niveau de la sécurité...
    A+

  3. #3
    Membre confirmé
    Inscrit en
    Août 2007
    Messages
    170
    Détails du profil
    Informations forums :
    Inscription : Août 2007
    Messages : 170
    Par défaut
    Bonjour,

    merci pour ta réponse. Voici ma formule qui calcule la valeur qui s'affiche dans ma colonne F (colonne au sein de laquelle la mise en forme conditionnelle doit s'afficher).

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    =SI(E3<AUJOURDHUI();1;0)*ET(SI(G3="En cours";1;0))


    Cette formule affiche donc la valeur 1 ou 0. Cependant la macro ne fonctionne que si je tape moi même une des deux valeurs au sein de la cellule.

    Par avance merci

    Désolé mais j'ai bien relu ton message et je n'arrive pas à trouver la solution.

    Effectivement, la valeur affichée est issue de la formule (cette valeur s'affiche dans la colonne F à partir de la ligne 3) et lorsque je modifie un des critères qui permet de calculer cette valeur rien ne se passe. Contrairement à ce qui se passe lorsque je rentre manuellement les valeurs ?????

    Help !!!

  4. #4
    Membre Expert
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    2 130
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 2 130
    Par défaut
    Salut ANTMA et le forum
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    =SI(E3<AUJOURDHUI();1;0)*ET(SI(G3="En cours";1;0))
    Pas sûr de tout comprendre. Si ça correspond à cette formule :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    =(E3<AUJOURDHUI())*(G3="En cours")
    Si G3 est égal à "en cours" et E3 inférieur à la date système, mettre 1, sinon mettre 0.
    Si c'est bien la formule prévue, sur un fonctionnement de travail normal, il faut mettre un test de toutes les lignes à l'ouverture du fichier (en considérant qu'on ne change pas de date pendant que le fichier est ouvert) et limiter la macro évènementielle Worksheet_Change(), non pas à la colonne F, mais à la colonne E : le seul changement véritable du contenu d'une cellule, c'est quand tu modifies la cellule E, et c'est la seule action qui lance la macro.

    Le select case n'est pas la fonction la plus appropriée dans ton cas : la cellule F ne peut recevoir que 2 valeurs => un simple If...else...endif rempli parfaitement ce rôle :
    If F=1 then
    les actions si la condition est vraie
    else
    les actions si la condition est fausse (F<>1)
    endif
    A+

  5. #5
    Membre confirmé
    Inscrit en
    Août 2007
    Messages
    170
    Détails du profil
    Informations forums :
    Inscription : Août 2007
    Messages : 170
    Par défaut
    Bonjour,

    je viens d'essayer vos solutions mais étant un débutant en VBA j'ai un peu de mal à m'y retrouver.

    Je vais réexpliquer mon idée. Le truc est que je souhaite faire une mise en forme conditionnelle dynamique pour ce faire j'ai trois colonne .

    Une colonne E ou une date de fin est saisie,

    une colonne G ou un statut est saisie (Terminé, En cours, En attente).

    La colonne F est la colonne où je souhaite appliquer la mise en forme conditionnelle ==> cette colonne affiche deux valeurs (1 ou 0). La valeur est affiché est fonction de cette formule

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    =SI(E3<AUJOURDHUI();1;0)*ET(SI(G3="En cours";1;0))
    Le précieux code VBA que j'ai trouvé sur ce forum fonctionne effectivement mais pas pour le fonctionnement de mon tableau de bord. En effet la saisie des dates de fin et des statuts se réalise lorsque le fichier est ouvert et je souhaiterai que lorsque la condition suivante est réalisé l'opération se réalise en direct :

    Date de fin < date du jour et statut en cours ==> donc valeur =1 case en rouge

    Sinon valeur =0 donc case blanche


    Par avance merci pour votre aide

  6. #6
    Membre chevronné Avatar de delphine35
    Femme Profil pro
    Analyste BO
    Inscrit en
    Novembre 2009
    Messages
    265
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Canada

    Informations professionnelles :
    Activité : Analyste BO

    Informations forums :
    Inscription : Novembre 2009
    Messages : 265
    Par défaut
    Essaye ceci : (et supprime les formules de la colonne F)

    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
    Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)
    Dim Plage As Range, c As Range
    Dim Klr As Integer
    Dim Fnt As Byte
    Dim aujourdhui
     
    aujourdhui = Date
    NbreLigne = Range("E65536").End(xlUp).Row
     
    Set P2 = Intersect(Target, Range("F3:F" & NbreLigne))
     
    If InStr("Fusion NPC", Sh.Name) > 0 And P2 Is Nothing Then
        Set Plage = Range("F3:F" & NbreLigne)
            For Each c In Plage
                If (Format(c.Offset(0, -1), "yyyymmdd") < Format(aujourdhui, "yyyymmdd")) And c.Offset(0, 1) = "En cours" Then
                    c = 1
                    Klr = 3
                    Fnt = 3
                Else
                    c = 0
                    Klr = 2
                    Fnt = 2
                End If
                c.Interior.ColorIndex = Klr
                c.Font.ColorIndex = Fnt
            Next c
         Set Plage = Nothing
     End If
    End Sub

Discussions similaires

  1. mise en forme conditionnelle et vba
    Par malabar92 dans le forum Access
    Réponses: 4
    Dernier message: 26/04/2006, 14h18
  2. Mise en forme conditionnelle
    Par the big ben 5 dans le forum Composants VCL
    Réponses: 4
    Dernier message: 23/12/2005, 15h20
  3. [VBA][Excel] mise en forme conditionnelle
    Par titflocon dans le forum Access
    Réponses: 9
    Dernier message: 19/12/2005, 10h13
  4. Réponses: 4
    Dernier message: 15/11/2005, 18h53
  5. Mise en forme conditionnelle en VBA / Cut-Paste
    Par priest69 dans le forum IHM
    Réponses: 4
    Dernier message: 03/09/2005, 13h54

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