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 :

Executer une macro lorsqu'une cellule se modifie suite à un calcul


Sujet :

Macros et VBA Excel

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Juin 2010
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2010
    Messages : 13
    Points : 6
    Points
    6
    Par défaut Executer une macro lorsqu'une cellule se modifie suite à un calcul
    Bonjour à tous,

    Je suis nouveau sur ce forum, je m'y suis inscrit car on y trouve des tas de choses intéressantes et c'est vraiment utile pour des débutants comme moi.


    Avec le code ci dessous, dès que A1 est modifié suite à un calcul, une fenetre s'affiche:"hello". Imaginons que A1=B1*C1, donc quand on change B1 ou C1, cela change bien sur A1 automatiquement.

    Je voudrai qu'une Macro se lance à la place de la fenêtre "hello" mais je n'y arrive pas, il y a toujours un message d'erreur et excel se plante. Je ne sais pas quelle ligne de code inscrire à la place de MSgBox.

    Avec la fonction Target, cela fonctionne mais seulement si on change A1 "manuellement". Le but est de déclencher une macro lorsque A1 est modifiée suite à un calcul, d'où Worksheet_calculate.


    Dans le module objet de Feuil1 :

    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
     
     
    Public ValPrec
     
    Private Sub Worksheet_Calculate()
    Vérif
    End Sub
     
    Private Sub Worksheet_Change(ByVal Target As Excel.Range)
    If Intersect(Target, Range("A1")) Is Nothing Then Exit Sub
    Vérif
    End Sub
     
    Private Sub Vérif()
    If VarType(Range("A1")) = VarType(ValPrec) Then _
    If ValPrec = Range("A1") Then Exit Sub
    MsgBox "hello"
    ValPrec = Range("A1")
    End Sub
    ' Dans le module de code ThisWorkbook :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
     
    Private Sub Workbook_Open()
    Feuil1.ValPrec = Feuil1.Range("A1")
    End Sub
    Autre point, imaginons qu'en A1, nous ayons la valeur A1=1, lorsque la valeur est changée suite à un calcul pour donner la valeur A1=2, une fenêtre s'ouvre : "hello".
    Maintenant, si un nouveau calcul nous donne encore la valeur A1=2, la fenêtre ne s'ouvre pas.
    Effectivement, la valeur n'a pas été modifiée MAIS il y a eu un nouveau calcul qui n'est pas pris en compte. Comment remédier à ce second problème?

    En résumé:
    comment déclencher une macro quand une cellule se modifie suite à un calcul?
    comment gérer le problème lorsque 2 calculs consécutifs donnent le même résultat?


    Merci à vous!

    J'ai posé la question sur plusieurs forum, mais je n'ai pas encore eu de réponse.

  2. #2
    Membre éclairé
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    682
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 682
    Points : 723
    Points
    723
    Par défaut
    Bonjour,

    Je te propose de commencer par la base. Pour cela, tu as pleins de tutos disponibles sur le site ! Prends les dans l'ordre

    Ce que tu essaies de déclencher automatiquement s'appelle une procédure (Sub). Pour appeler une procédure, on écrit Call NomDeLaProcédure().

    Dans ton cas, ce sera donc Call Vérif(). Enlève l'accent sur le é de Vérif d'ailleurs.

    Tu dois donc l'appeler dans ton événement :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Private Sub Worksheet_Calculate()
    Call Vérif()
    End Sub
    Vérifie que ça fonctionne avant de passer à la suite.

    Bonne chance.
    DeaD

  3. #3
    Expert éminent sénior Avatar de mercatog
    Homme Profil pro
    Inscrit en
    Juillet 2008
    Messages
    9 435
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations forums :
    Inscription : Juillet 2008
    Messages : 9 435
    Points : 31 877
    Points
    31 877
    Par défaut
    peut être comme ceci
    dans un module général
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Public ValIni As Double
    Dans le module de la feuille
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    Private Sub Worksheet_Activate()
    ValIni = Range("A1").Value
    End Sub
     
    Private Sub Worksheet_Change(ByVal Target As Range)
    If Range("A1") <> ValIni Then
        MsgBox "kuku" 'ou ta macro
        ValIni = Range("A1")
    End If
    End Sub
    éventuellement, tu peux utiliser
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    application.EnableEvents=false
    avant ta macro et
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    application.EnableEvents=true après
    au cas ou ta macro change aussi A1 et que tu veux pas détecter. avec une gestion d'erreur appropriée
    Cordialement.
    J'utilise toujours le point comme séparateur décimal dans mes tests.

  4. #4
    Futur Membre du Club
    Profil pro
    Inscrit en
    Juin 2010
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2010
    Messages : 13
    Points : 6
    Points
    6
    Par défaut
    Merci, ça marche, j'ai mis un call Verif et j'ai juste mis Macro1 à la fin de Private Sub Verif.

    merci à tous!!


    Dans le module objet de Feuil1 :


    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
     
    Public ValPrec
     
    Private Sub Worksheet_Calculate()
    Call Verif
    End Sub
     
    Private Sub Worksheet_Change(ByVal Target As Excel.Range)
    If Intersect(Target, Range("A1")) Is Nothing Then Exit Sub
    Verif
    End Sub
     
    Private Sub Verif()
    If VarType(Range("A1")) = VarType(ValPrec) Then _
    If ValPrec = Range("A1") Then Exit Sub
     
    ValPrec = Range("A1")
     
    Macro1
     
    End Sub
    ' Dans le module de code ThisWorkbook :




    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    Private Sub Workbook_Open()
    Feuil1.ValPrec = Feuil1.Range("A1")
    End Sub

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

Discussions similaires

  1. Executer une macro lorsqu'une cellule se modifie suite à un calcul
    Par gregoozz dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 06/11/2011, 10h54
  2. Réponses: 2
    Dernier message: 24/02/2009, 17h40
  3. afficher une valeur sur une feuille lorsqu'une checkbox est cochée
    Par chrnoe dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 23/12/2008, 14h39
  4. executer des macros depuis une macro
    Par lolo93 dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 19/05/2008, 10h29
  5. [VBA Excel] Appliquer une macro sur une celulle contenant une valeur
    Par tchauviere dans le forum Macros et VBA Excel
    Réponses: 7
    Dernier message: 21/01/2008, 10h21

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