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 :

Execution de macro automatique quand modification de valeur


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Mai 2009
    Messages
    29
    Détails du profil
    Informations forums :
    Inscription : Mai 2009
    Messages : 29
    Par défaut Execution de macro automatique quand modification de valeur
    Bonjour,

    Mon problème est le suivant :

    J'ai besoind e faire l'analyse de plusieurs feuilles identiques dans la mise en forme d'un classeur.
    L'analyse consiste à identifier les écart de valeur entre 3 données et pour mieux les visualiser, elles seront colorées en rouge.

    exemple : "G20" = 20 , "K20"=21 alors elle seront colorées en rouge (seulement la police) etc...
    ainsi, j'ai codé ceci (J'utilise le VBA avec parcimonie et je n'ai appris son existence il n'y a qu'un mois, je sais je me suis déjà auto-flagellé ^^)

    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
    Sub difference()
        Dim WS As Worksheet
     
    For Each WS In Worksheets
        If WS.Name <> "liste des produits" Then
            If Cells(20, 7).Value <> Cells(20, 11) Then
            Range(Cells(20, 6), Cells(20, 7)).Font.ColorIndex = 3
            Range(Cells(20, 10), Cells(20, 11)).Font.ColorIndex = 3
            End If
     
            If Cells(20, 7).Value <> Cells(20, 17) Then
            Range(Cells(20, 6), Cells(20, 7)).Font.ColorIndex = 3
            Range(Cells(20, 16), Cells(20, 17)).Font.ColorIndex = 3
            End If
     
            If Cells(20, 11).Value <> Cells(20, 17) Then
            Range(Cells(20, 10), Cells(20, 11)).Font.ColorIndex = 3
            Range(Cells(20, 16), Cells(20, 17)).Font.ColorIndex = 3
            End If
        End If
    Next WS
     
     
    End Sub
    Ce que je voudrais c'et que lorsqu'on modifie une valeur d'une cellule exemple "G20" qui était égal à 20 devient 21 elle sera alors egal à "k20" et automatiquement elle repasse du rouge à la couleur automatique.

    Et je ne comprend pas non plus c'est que la macro ne s'éxécute que sur une feuille alors que normalement si j'ai bien compris la chose, lorsque l'on met ""For et "next ws", alors la macro s'execute sur la feuille suivante non?
    Il n'y a que la 1ere feuille sur laquelle la macro ne doit pas s'éxécuter.

    pourriez vous m'éclairer sur ce problème?

    Merci

    Yoann

  2. #2
    Membre Expert Avatar de aalex_38
    Inscrit en
    Septembre 2007
    Messages
    1 631
    Détails du profil
    Informations forums :
    Inscription : Septembre 2007
    Messages : 1 631
    Par défaut
    alors la macro s'execute sur la feuille suivante non?
    Dans ton code malgré ton test, il calcule les range sur la feuille active pour agir sur la feuille de ton choix :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    With WS
        If .Cells(20, 7).Value <> .Cells(20, 11) Then
    '...
    end with

  3. #3
    Membre émérite
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    682
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 682
    Par défaut
    Change comme aalex_38 vient de te le proposer et cela marchera. En revanche, et je dis ça d'après le titre de ton post, cela ne sera pas fait automatiquement lorsque tu auras modifié une valeur dans une cellule.

    Pour que cela soit le cas, il faut mettre ton code dans l'événement SheetChange de ton Workbook.

    A+

  4. #4
    Membre averti
    Inscrit en
    Mai 2009
    Messages
    29
    Détails du profil
    Informations forums :
    Inscription : Mai 2009
    Messages : 29
    Par défaut
    Merci pour vos réponse!

    cela fonctionne très bien aalex_38 et DeaD78

    En effet il fallait mettre la fonction "with" et mettre le code dans l'événement SheetChange du Workbook...

    Le code final donne cela :


    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
    42
     
    Option Explicit
     
     
    Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Excel.Range)
        Dim WS As Worksheet
     
    For Each WS In Worksheets
        With WS
            If Cells(20, 7).Value <> Cells(20, 11) Then
                Range(Cells(20, 6), Cells(20, 7)).Font.ColorIndex = 3
                Range(Cells(20, 10), Cells(20, 11)).Font.ColorIndex = 3
                Range(Cells(20, 16), Cells(20, 17)).Font.ColorIndex = 3
            Else
                Range(Cells(20, 6), Cells(20, 7)).Font.ColorIndex = xlAutomatic
                Range(Cells(20, 10), Cells(20, 11)).Font.ColorIndex = xlAutomatic
                Range(Cells(20, 16), Cells(20, 17)).Font.ColorIndex = xlAutomatic
            End If
     
            If Cells(20, 7).Value <> Cells(20, 17) Then
                Range(Cells(20, 6), Cells(20, 7)).Font.ColorIndex = 3
                Range(Cells(20, 16), Cells(20, 17)).Font.ColorIndex = 3
                Range(Cells(20, 10), Cells(20, 11)).Font.ColorIndex = 3
            Else
                Range(Cells(20, 6), Cells(20, 7)).Font.ColorIndex = xlAutomatic
                Range(Cells(20, 16), Cells(20, 17)).Font.ColorIndex = xlAutomatic
                Range(Cells(20, 10), Cells(20, 11)).Font.ColorIndex = xlAutomatic
            End If
     
            If Cells(20, 11).Value <> Cells(20, 17) Then
                Range(Cells(20, 10), Cells(20, 11)).Font.ColorIndex = 3
                Range(Cells(20, 16), Cells(20, 17)).Font.ColorIndex = 3
                Range(Cells(20, 6), Cells(20, 7)).Font.ColorIndex = 3
            Else
                Range(Cells(20, 10), Cells(20, 11)).Font.ColorIndex = xlAutomatic
                Range(Cells(20, 16), Cells(20, 17)).Font.ColorIndex = xlAutomatic
                Range(Cells(20, 6), Cells(20, 7)).Font.ColorIndex = xlAutomatic
            End If
        End With
    Next WS
     
    End Sub
    Peut-être qu'il n'est pas optimal ou bien codé mais il fonctionne ^^

    Merci pour votre aide! résolu!

  5. #5
    Membre averti
    Inscrit en
    Mai 2009
    Messages
    29
    Détails du profil
    Informations forums :
    Inscription : Mai 2009
    Messages : 29
    Par défaut
    Modification du code pour que cela fonctionne dans toutes les situations :

    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
     
    Option Explicit
     
     
    Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Excel.Range)
        Dim WS As Worksheet
     
    For Each WS In Worksheets
        With WS
    'Affiche les modifications pour la Largeur de bord
            If Cells(20, 7).Value <> Cells(20, 11).Value Or Cells(20, 7).Value <> Cells(20, 17).Value Or Cells(20, 11).Value <> Cells(20, 17).value Then
                Range(Cells(20, 6), Cells(20, 7)).Font.ColorIndex = 3
                Range(Cells(20, 10), Cells(20, 11)).Font.ColorIndex = 3
                Range(Cells(20, 16), Cells(20, 17)).Font.ColorIndex = 3
            Else
                Range(Cells(20, 6), Cells(20, 7)).Font.ColorIndex = xlAutomatic
                Range(Cells(20, 10), Cells(20, 11)).Font.ColorIndex = xlAutomatic
                Range(Cells(20, 16), Cells(20, 17)).Font.ColorIndex = xlAutomatic
            End If
     
    'Affiche les modification pour la Hauteur de boîte
            If Cells(22, 7).Value <> Cells(22, 11).Value Or Cells(22, 7).Value <> Cells(22, 17).Value Or Cells(22, 11).Value <> Cells(22, 17).value Then
                Range(Cells(22, 6), Cells(22, 7)).Font.ColorIndex = 3
                Range(Cells(22, 10), Cells(22, 11)).Font.ColorIndex = 3
                Range(Cells(22, 16), Cells(22, 17)).Font.ColorIndex = 3
            Else
                Range(Cells(22, 6), Cells(22, 7)).Font.ColorIndex = xlAutomatic
                Range(Cells(22, 10), Cells(22, 11)).Font.ColorIndex = xlAutomatic
                Range(Cells(22, 16), Cells(22, 17)).Font.ColorIndex = xlAutomatic
            End If
     
        End With
    Next WS
     
    End Sub

  6. #6
    Membre Expert Avatar de aalex_38
    Inscrit en
    Septembre 2007
    Messages
    1 631
    Détails du profil
    Informations forums :
    Inscription : Septembre 2007
    Messages : 1 631
    Par défaut
    Modification du code pour que cela fonctionne dans toutes les situations
    il y a quelque chose qui ne va pas ddans le code, la tu ne vas pas appliquer sur la feuille choisie il faut mettre un point avant les range() et les cell()

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

Discussions similaires

  1. Macro automatique en fonction de la valeur d'une cellule
    Par ElPibeOro dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 17/07/2012, 13h52
  2. executer une macro quand on change la valeur d'une cellule
    Par Benwad dans le forum Macros et VBA Excel
    Réponses: 17
    Dernier message: 23/02/2009, 18h54
  3. Réponses: 2
    Dernier message: 18/08/2008, 18h53
  4. Réponses: 5
    Dernier message: 18/07/2008, 09h50
  5. Réponses: 4
    Dernier message: 19/05/2005, 11h51

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