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 :

lancer macro si changement valeur cellule + condition


Sujet :

Macros et VBA Excel

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    34
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 34
    Points : 22
    Points
    22
    Par défaut lancer macro si changement valeur cellule + condition
    Hello, hello,


    j'ai une question, je voudrais lancer une macro lorsque que la valeur de cellule change au delà d'un certain seuil.

    J'ai commencé par écrire ce bout de code qui ne marche pas

    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
     
     
    Private Sub Worksheet_Change(ByVal Target As Range)
     
    Dim seuil As Double
     
     
       If Target.Previous = 0 Then
          MsgBox ("pas de valeur précédente")
          Exit Sub
       End If
     
       seuil = Target / Target.Previous
     
       If seuil > 0.01 Then
           MsgBox ("big move")
       Else
           MsgBox ("no big change")
       End If
     
    End Sub

    la variable target.previous est toujours vide
    Je pensais que target.previous renvoyait la valeur avant le changement.

    Une idée quelqu'un?

    Merci.

  2. #2
    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
    Si la cellule est sélectionnée avant d'être changée, je propose ceci:
    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
    Public preced As Double
    Private Sub Worksheet_Change(ByVal Target As Range)
    Dim seuil As Double
       If preced = 0 Then
          MsgBox ("pas de valeur précédente")
          Exit Sub
       End If 
       seuil = (Target - preced) / preced   'REGARDE ICI
       If seuil > 0.01 Then
           MsgBox ("big move")
       Else
           MsgBox ("no big change")
       End If  
    End Sub
     
    Private Sub Worksheet_SelectionChange(ByVal Target As Range)
       preced = Target.Value
    End Sub

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    34
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 34
    Points : 22
    Points
    22
    Par défaut
    hey mercatog once again,

    merci pour ta réponse

    j'ai testé ça marche bien,

    En revanche, je ne sais si les cellules seront sélectionnées avant d'être modifiées.

    Une autre question comment faire si les changement portent sur toute une plage à la fois?

    Encore merci de ton aide.

  4. #4
    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
    La proposition précédente concerne uniquement la sélection et le changement d'une seule cellule. je n'ai pas mis le test sur Target.


    PS (sans liaison)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    seuil = Abs(Target - preced) / preced

  5. #5
    Membre chevronné Avatar de Krovax
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    1 888
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 888
    Points : 2 168
    Points
    2 168
    Par défaut
    Pour la deuxième question

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    dim c as range
     
    for each c in target
    'ton code avec c a la place de target
     
    next c
    Mais je ne sais pas comment tu pourra adapter ca avec le preced. mais ca doit être jouable en rusant bien

  6. #6
    Membre expérimenté Avatar de laetitia
    Profil pro
    Inscrit en
    Décembre 2002
    Messages
    1 281
    Détails du profil
    Informations personnelles :
    Âge : 34
    Localisation : France

    Informations forums :
    Inscription : Décembre 2002
    Messages : 1 281
    Points : 1 512
    Points
    1 512
    Par défaut
    bonjour le fil le forum.. peut être partir sur un truc comme cela!!

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Private Sub Worksheet_Change(ByVal Target As Range)
    If Not Application.Intersect(Target, Range("A1:A10")) Is Nothing Then
    On Error Resume Next
    'ton code
    End If
    End Sub
    [/CODE]

  7. #7
    Membre à l'essai
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    34
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 34
    Points : 22
    Points
    22
    Par défaut
    merci à vous pour vos réponses,

    @Laetitia:

    si je comprends bien, le code que tu proposes va faire se déclencher la macro dès qu'une cellule de la plage A1:A10 va changer? Mais, je cherchais quelque chose qui déclenche la macro seulement si le changement est supérieur à un certain seuil.

    Je pense que je vais partir sur la piste proposée par Krovax.


    Bonne soirée à tous

  8. #8
    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
    Une autre question comment faire si les changement portent sur toute une plage à la fois?
    si tu peux expliciter le comment des choses?
    le changement sur la plge survient suite à une copier/coller de données, userform, formules...etc

  9. #9
    Membre à l'essai
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    34
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 34
    Points : 22
    Points
    22
    Par défaut
    Hello gang,


    en fait, je continue, j'ai du modifier un peu pour prendre en compte l'éventualité d'un changement portant sur toute une plage.

    En gros deux routines:

    la première chronologiquement place dans une collection les valeurs sélectionnées et une seconde routine compare les valeurs de la collection avec les nouvelles valeurs.

    ça ne plante pas, mais ça ne marche pas non plus.
    (après d'autres test si ça plante parfois).

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    Option Explicit
    Public preced As New Collection

    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
     
    Private Sub Worksheet_Change(ByVal Target As Range)
     
    Dim seuil As Double
    Dim i As Integer
    Dim c As Range
    i = 1
     
      For Each c In Target
     
       seuil = (c.Value / preced.Item(i)) - 1 'REGARDE ICI
       i = i + 1
             If seuil > 0.01 Or seuil < -0.01 Then
                MsgBox ("big move")
             Else
                MsgBox ("shitty move")
             End If
     
      Next c
     
    End Sub
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
     
    Private Sub Worksheet_SelectionChange(ByVal Target As Range)
     
    Dim c As Range
    Dim i, j As Integer
     
    'vide la collection preced au cas où
    On Error Resume Next
    If Not i = preced.Count = 0 Then
       For j = 1 To i
       preced.Remove (j)
       Next j
    End If

    hé bien, les résultats sont erratiques, parfois conformes à mes attentes parfois non.


    Par ailleurs, je pense que la solution consistant à passer pour l'événement selection n'est pas la bonne solution pour ce que j'avais en tête.
    Je pensais à des données provenant en temps réel depuis une base de données (je n'ai pas à me soucier de l'appel). Tout ce que je sais, c'est que les données pourront changer toutes les secondes.

    D'ailleurs, je vois que Mercatog vient de poser une question en ce sens pendant que je rédigeais mon message.

    @Mercatog: ça répond à ta question? Où tu as besoin de plus de détails?

  10. #10
    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
    J'ai besoins de détails
    à propos du changement des données dans ta feuille

  11. #11
    Membre expérimenté Avatar de laetitia
    Profil pro
    Inscrit en
    Décembre 2002
    Messages
    1 281
    Détails du profil
    Informations personnelles :
    Âge : 34
    Localisation : France

    Informations forums :
    Inscription : Décembre 2002
    Messages : 1 281
    Points : 1 512
    Points
    1 512
    Par défaut
    re,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    Private Sub Worksheet_Change(ByVal Target As Range)
    If Not Application.Intersect(Target, Range("A1:A10")) Is Nothing Then
    On Error Resume Next
    Dim C As Range
    For Each C In Range("A1:a10")
    If C.Value > 100 Then MsgBox "action.."
     Next C: End If
    End Sub

  12. #12
    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
    Bonsoir Laetitia,
    en fait, il désire comparer la nouvelle valeur d'une cellule avec l'ancienne valeur contenu dans la même cellule (avant changement)

  13. #13
    Membre expérimenté Avatar de laetitia
    Profil pro
    Inscrit en
    Décembre 2002
    Messages
    1 281
    Détails du profil
    Informations personnelles :
    Âge : 34
    Localisation : France

    Informations forums :
    Inscription : Décembre 2002
    Messages : 1 281
    Points : 1 512
    Points
    1 512
    Par défaut
    re, le fil ok l' ami mercatog je l'avais pas interprete comme cela!!!!
    en partant sur cette base des fois

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    Option Explicit
    Private Sub Worksheet_Change(ByVal Target As Range)
    If Not Application.Intersect(Target, Range("A1:A10")) Is Nothing Then
    If Target.Value > i Then MsgBox "valeur >..." & Target.Value - i
    End If
    End Sub
    Private Sub Worksheet_SelectionChange(ByVal Target As Range)
    If Not Application.Intersect(Target, Range("A1:A10")) Is Nothing Then
    On Error Resume Next
    i = Target.Value
    End If
    End Sub
    dans un module standard

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Option Explicit
    Public i As Variant

    autrement une autre piste a etudier??

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Static cp As Range
    If Not cp Is Nothing Then MsgBox cp.Value
    Set cp = Target

  14. #14
    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
    Re bonjour,
    Je pensais à des données provenant en temps réel depuis une base de données (je n'ai pas à me soucier de l'appel). Tout ce que je sais, c'est que les données pourront changer toutes les secondes.
    C'est plus logique de voir là (mon avis personnel qui n'engage que moi).
    le test doit être exécuté juste avant import (tu as simultanément les anciennes données et les nouvelles). en temps réel ou en différé c'est pas là pour l'instant le problème.

    PS. les anciennes données il faut les avoir quelque part, à l'évènement Change, elles sont déjà écrasées

  15. #15
    Membre à l'essai
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    34
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 34
    Points : 22
    Points
    22
    Par défaut
    Bonjour à vous,

    je n'avais pas vu vos réponses (j'ai dû oublier de cocher la case suivre la discussion, j'en suis désolé...)

    Merci en tout cas pour votre aide


    Suite à la remarque de Mercatog, i.e:
    PS. les anciennes données il faut les avoir quelque part, à l'évènement Change, elles sont déjà écrasées
    Pourtant excel garde bien certaine infos en mémoire pour les retour arrière.
    Existe-t-il un moyen de les interroger?


    Seconde remarque de Mercalog:
    le test doit être exécuté juste avant import
    c'est une bonne idée qui mérite d'être creusée.
    2 possibilités:

    -la première: importer les données sur une feuille différente et comparer avec la première feuille. Finalement, il n'y aura peut-être même pas besoin de VBA, juste un format conditionnel fera l'affaire.

    -la seconde: on peut importer les données en interrogeant directement l'API de Bloomberg pour pouvoir les tester avant qu'elles ne soient écrasées. Je ne l'ai jamais fait (et je n'ai pas de bloomberg à la maison), mais je sais que certains ont eu de mauvaises surprises car Bloom facture ce genre de requêtes alors que les imports sur excel en utilisant leurs fonctions ad hoc sont gratos.

    -pour les changements "à la main" je vais rester sur votre solution (worksheet_change/worksheet_select).


    Encore merci

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

Discussions similaires

  1. Macro sur changement valeur cellule?
    Par jojo86 dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 05/02/2010, 07h00
  2. [XL-2003] Macro VBA copie valeur cellule excel et colle dans doc word
    Par tony020422 dans le forum Macros et VBA Excel
    Réponses: 54
    Dernier message: 03/06/2009, 09h21
  3. exécution macro sur changement valeur cellule, juste un truc qui cloche.
    Par laatysha dans le forum Macros et VBA Excel
    Réponses: 8
    Dernier message: 21/05/2008, 09h00
  4. boucle changement valeur cellule
    Par les4c77 dans le forum Macros et VBA Excel
    Réponses: 6
    Dernier message: 07/10/2007, 13h33
  5. [VBA]lancer une macro à chaque changement de cellule dans une feuille
    Par freddddd dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 04/05/2007, 13h58

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