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

  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 : 40
    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()

  7. #7
    Membre averti
    Inscrit en
    Mai 2009
    Messages
    29
    Détails du profil
    Informations forums :
    Inscription : Mai 2009
    Messages : 29
    Par défaut
    la tu ne vas pas appliquer sur la feuille choisie
    C'est à dire?

    Car là, apparement cela fonctionne bien, quand je modifie une cellule et que la valeur n'est plus la même que les autres références alors la couleur devient rouge. Cela fonctionne sur toutes les feuilles du classeur.

    Quels sont les bénéfices d'ajouter des "."?

    Merci pour ta réponse.

  8. #8
    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
    je n'avais pas vu :
    Ce qui signifie que le code est lancè chaque fois que tu changes de feuille et le code s'applique donc "naturellement" sur la feuille en cours, dans ce cas il ne sert à rien de parcourir toutes les feuilles car à chaque modification tu d'une feuille, tu boucles sur tout !

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

    Informations forums :
    Inscription : Juin 2008
    Messages : 682
    Par défaut
    Salut,

    Si tu mets With WS c'est pour travailler sur tes feuilles WS non ? Il faut donc écrire .Range et .Cells pour que cela soit appliqué aux feuilles WS. C'est comme ça c'est la syntaxe. Si tu ne mets pas le points, ça ne marchera que sur la feuille courante sans tenir compte de ton With.

    Cependant (!), cela marche dans ton cas vu que tu as mis le code dans l'événement SheetChange qui prend en paramètre le nom de la feuille courante. Bref, quand tu changeras quelque chose, ton code sera parcouru pour la feuille courante.

    Du coup, tu peux virer, à mon avis :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    For Each WS In Worksheets
        With WS
        End With
    Next WS
    Tes tests continueront à être faits pour la feuille que tu viens de changer. Si tu vas en changer une autre, ils seront aussi faits sur l'autre etc. etc. Dans l'état actuel des choses, lorsque tu fais un changement tu testes ta feuille changée en boucle (le nombre de fois que t'as de feuilles dans ton classeur). Si tu rajoutes le ., tu testeras TOUTES tes feuilles et pas seulement celle que tu changes.

    Bref, dans l'état actuel des choses, ce n'est pas bon. Ton With ne sert à rien et tu fais le même test plusieurs fois sur la même feuille. Si tu rajoutes le point, à mon avis, ce n'est pas bon aussi vu que tu dois vouloir seulement tester la feuille qui change.

    Bref, teste sans For each et sans With (et sans le ".") et regarde si ça fait ce que tu veux

    EDIT : bon, la prochaine fois je ne dis plus rien...

  10. #10
    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
    EDIT : bon, la prochaine fois je ne dis plus rien...
    si si DeaD, merci pour ces explicaitons lumineuses

    et je rajouterai on perd souvent beaucoup de temps en programmation quand on n'a pas définni on lorsque l'on ne sait pas exactement ce que l'on veut faire.

    Il pourrait y avoir une macro qui modifie les couleurs de la feuille, avec le nom de la feuille passée en paramètre, ce qui permetrai de l'appeler de plusieurs façons:

    - Dans une boucle sur les feuilles, pour tout faire au début
    - au changement de selection de la feuille ensuite
    ....

  11. #11
    Membre averti
    Inscrit en
    Mai 2009
    Messages
    29
    Détails du profil
    Informations forums :
    Inscription : Mai 2009
    Messages : 29
    Par défaut
    Merci Dead78 pour tes explications!

    J'ai seulement oublier de faire une chose, c'est que je voulais que cela s'applique à toutes les feulles du classeurs sauf la 1ere feuille qui est le sommaire avec les liens vers les autres feuilles.

    Mais voilà maintenant je n'arrive pas/plus à le faire

    j'ai essayé :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    For Each WS In Worksheets
        With WS <> "Liste des produits"
    et

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    For Each WS <> "Liste des produits" In Worksheets
        With WS ...
    mais cela ne fonctionne pas... je dois repasser plutôt par une condition :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     if Ws <> Liste des produits
    Merci pour l'attention que vous portez à mon problème ^^

  12. #12
    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
    Bonjour,


    Il ne faut pas test Ws mais Ws.Name

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

    Informations forums :
    Inscription : Juin 2008
    Messages : 682
    Par défaut
    Voilà ce que ton code doit donner à la fin (et sans la boucle et le With on a dit ) :
    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 Excel.Range)
     
        If Sh.Name <> "Liste des produits" Then
     
    '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 If
     
    End Sub
    EDIT : Sh est le nom de la feuille passé en paramètre à la procédure Workbook_SheetChange. Plus besoin du reste

  14. #14
    Membre averti
    Inscrit en
    Mai 2009
    Messages
    29
    Détails du profil
    Informations forums :
    Inscription : Mai 2009
    Messages : 29
    Par défaut
    Merci DeaD78,

    Je vois nettement l'erreur que je faisais!!

    Le Sheet_change remplie déjà une de mes demande donc plus besoin du For et With et le "if sh <>" remplie ma deuxième demande!

    Merci beaucoup de votre suivi et de vos réponses!!

+ 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, 14h52
  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, 19h54
  3. Réponses: 2
    Dernier message: 18/08/2008, 19h53
  4. Réponses: 5
    Dernier message: 18/07/2008, 10h50
  5. Réponses: 4
    Dernier message: 19/05/2005, 12h51

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