lancer une macro si valeur cellule changer

gege21

XLDnaute Occasionnel
bonjour

j'ai une formule qui me trouve la valeur maxi d'une colonne dans la
cellule C3 et je veux lancer une macro si la valeur de c3 changer

j'ai déjà trouver plusieurs code mais il ne marche que si la cellule est sélectionne
et donc ne marche pas pour moi
ex: de code qui ne marche que si la cellule est sélectionne
Code:
Private Sub Worksheet_Change(ByVal Target As Range)
If Not Application.Intersect(Target, Range("c3")) Is Nothing Then
On Error Resume Next
End If
End Sub

alors comment faire pour lancer une macro quand la valeur de c3 changer sans qu'elle sois sélectionne
:cool:
 

Pièces jointes

  • test.xlsm
    9.6 KB · Affichages: 636
  • test.xlsm
    9.6 KB · Affichages: 677
  • test.xlsm
    9.6 KB · Affichages: 738

Mytå

XLDnaute Occasionnel
Re : lancer une macro si valeur cellule changer

Salut le forum

- Ce lien n'existe plus

Cet événement se produit après tout recalcul de la feuille.

L'événement Calculate complète l'événement Change en ce sens qu'il permet de détecter des changements de valeur par calcul dans des cellules contenant des formules.

Contrairement à Change, la procédure Calculate ne dispose pas de paramètre Target. Il n'est donc pas possible de détecter quelles sont les cellules dont le contenu a été modifié à l'issue du recalcul. pour cela il est nécessaire de passer par une ou plusieurs variables stockant le contenu antérieur de la ou des cellules dont on veut intercepter le changement de valeur.

Dans le code suivant, un message est affiché à chaque fois que la cellule A1 de la feuille Feuil1 change de valeur, que ce soit par saisie manuelle (Worksheet_Change) ou calcul de formule (Worksheet_Calculate). La variable ValPrec sert à vérifier si cette valeur a changé en stockant la valeur précédente de la cellule et en la comparant à sa nouvelle valeur.

' Dans le module objet de Feuil1 :

Code:
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 "Cellule A1 passe de " & CStr(ValPrec) & _
    " vers " & CStr(Range("A1"))
  ValPrec = Range("A1")
End Sub
' Dans le module de code ThisWorkbook :

Code:
Private Sub Workbook_Open()
  Feuil1.ValPrec = Feuil1.Range("A1")
End Sub
 

bluesun91

XLDnaute Nouveau
Re : lancer une macro si valeur cellule changer

Bonjour,

je suis très content d'avoir trouvé ce message car c'est aussi exactement ce que je voulais faire, c'est à dire lancer une macro quand une cellule est modifiée suite à un calcul.

Le code de Myta fonctionne bien, on voit bien la fenêtre apparaitre.

Cependant, je n'arrive pas à lancer de macro sans que ça bug:
"la méthode select range a échoué" ou "espace pile insuffisant" etc.

Que faut-il modifier dans le code de Myta si on veut lancer la "Macro1"?

J'ai essayé de remplacer MsgBox par Macro 1 ou Run Macro1 ou encore Call Macro1 mais je n'arrive à rien.

Je dois surement très mal m'y prendre ;)

Etant débutant, je remonte ce post pour vous poser la question.

Pouvez vous s'il vous plait poster le code modifié?

Merci d'avance!

cordialement
 

bluesun91

XLDnaute Nouveau
Re : lancer une macro si valeur cellule changer

Re ;)

Je vous joins le fichier test.

Dans ce fichier on a tout d'abord:
A1=B1*C1

Lorsque l'on change B1 ou C1, A1 se modifie. Grâce au code de Myta, cette modification de cellule entraine l'affichage d'un message, j'ai mis "Hello" ;)

J'ai aussi enregistré une petite macro test: "Macro1"
multiplier les 2 colonnes (A5;A9) par (B5;B9)

Lorsqu'on lance cette petite macro, les résultats sont affichés de C5 à C9.

Maintenant, je cherche le moyen de remplacer l'affichage du message "Hello" par le lancement de la "Macro1".

Mes tentatives de débutants m'amènent toujours à planter Excel ;)

Pouvez vous me donner un petit coup de main?

merci!
 

Pièces jointes

  • test calculate.xlsm
    17.4 KB · Affichages: 978

bluesun91

XLDnaute Nouveau
Re : lancer une macro si valeur cellule changer

Bonjour,

Cela fonctionne, il suffit d'intervertir 2 lignes dans Private Verif, c'est à dire de mettre Macro1 à la fin.

Code:
Public ValPrec

Private Sub Worksheet_Calculate()
 Verif
End Sub

Private Sub Worksheet_Change(ByVal Target As Excel.Range)
  If Intersect(Target, Range("C1")) Is Nothing Then Exit Sub
  Verif
 
 
End Sub

Private Sub Verif()
  If VarType(Range("A1")) = VarType(ValPrec) Then _
    If ValPrec = Range("C1") Then Exit Sub
 
  ValPrec = Range("C1")

   Macro1
      
                 
End Sub

merci à tous,

bien cordialement
 

guigui971

XLDnaute Junior
Re : lancer une macro si valeur cellule changer

Bonjour,

J'ai un besoin assez proche, mais je suis certainement encore plus débutant en VBA que gege21..

J'ai une série de données dans une feuille2. Disons de A1 à A300 et de B1 à B300.

Je voudrais que dès que l'on modifie la valeur d'une de ces 600 cellules, un msgbox s'ouvre.

Je précise que si la cellule passe de pleine à vide, la msgbox doit également être activée.

Par contre, si la cellule modifiée était au préalable vide (passant donc de vide à pleine), la msgbox ne doit pas être activée.


Merci
 

guigui971

XLDnaute Junior
Re : lancer une macro si valeur cellule changer

J'ai trouvé ceci :

Private Sub Worksheet_Change(ByVal Target As Range)
If Not Intersect(Range("b12:c311"), Target) Is Nothing Then
MsgBox "donnée modifiée!"
End If
End Sub


Cà marche, sauf que çà ne répond pas à la dernière condition que je voudrais, si la cellule modifiée était au préalable vide (passant donc de vide à pleine), la msgbox ne doit pas être activée.

Quelqu'un peut t-il me conseiller?

Merci
 

guigui971

XLDnaute Junior
Re : lancer une macro si valeur cellule change

Merci Dull.
Mais çà ne marche plus du tout avec ta modif.

D'ailleurs je suis surpris de ce que tu ajouttes : ' if target = "" then '
Ai-je bien expliqué la condition que je cherche? : Si (et seulement si) Target est vide, je ne veux pas le msgbox.

Donc j'ai essayé avec ' if target <> "" then '
Mais çà ne marche pas mieux
idem pour ' if not target = "" then '

Merci d'avance
 

mclex

XLDnaute Nouveau
Re : lancer une macro si valeur cellule changer

Bonjour, je relance le sujet parce que j'avais trouvé un début de réponse à l'intérieur.

j'explique la situation : de A1 à F1 j'ai des cellules remplies par des formules somme. Et j'aimerais que des qu'une des cellules change de valeur un mail soit envoyé automatiquement. (mail différent pour chaque cellule donc on nommera les macro mailA1, mailB1 etc. j'ai déjà les codes pour les mails... )

je ne trouve juste pas de macro pour déclencher l'envoie de mail multiple et différent. Du coup j'avais fait par intermédiaire : en G1 je faisais la somme de A1 à F1 et des que G1 change un mail s'envoi mais du coup c'est trop général.

Le code que j'ai utilisé :

Code:
Public ValPrec

Private Sub Worksheet_Calculate()
  Vérif
End Sub

Private Sub Worksheet_Change(ByVal Target As Range)
  If Intersect(Target, Range("G1")) Is Nothing Then Exit Sub
  Vérif
  If Intersect(Target, Range("G1")) Is Nothing Then Exit Sub
  Vérif
End Sub

Private Sub Vérif()
  If VarType(Range("G1")) = VarType(ValPrec) Then _
    If ValPrec = Range("G1") Then Exit Sub
.... macro du mail ...
  ValPrec = Range("G1")

Merci d'avance
 

aaa

XLDnaute Nouveau
Re : lancer une macro si valeur cellule changer

Bonjour,

J'utilise le code proposé par Mytå. Il fonctionne très bien dans une feuille. Je voudrais maintenant l'utiliser sur toutes les feuilles de mon classeur (200 feuilles identiques) mais uniquement sur la feuille active. J'ai essayé de mettre le code dans un module et d'utiliser Activesheet mais cela ne fonctionne pas.

Merci d'avance!
 

Elo7

XLDnaute Nouveau
Re : lancer une macro si valeur cellule changer

Bonjour à tous :),
desolée de reveiller une discussion aussi ancienne mais j'ai voulu tenter le coup par ici et j'espère que j'aurai des réponses. Je cherche en fait à faire la même chose que demandais gege21 mais à un detail près.

Salut le forum

- Ce lien n'existe plus

Cet événement se produit après tout recalcul de la feuille.

L'événement Calculate complète l'événement Change en ce sens qu'il permet de détecter des changements de valeur par calcul dans des cellules contenant des formules.

Contrairement à Change, la procédure Calculate ne dispose pas de paramètre Target. Il n'est donc pas possible de détecter quelles sont les cellules dont le contenu a été modifié à l'issue du recalcul. pour cela il est nécessaire de passer par une ou plusieurs variables stockant le contenu antérieur de la ou des cellules dont on veut intercepter le changement de valeur.

Dans le code suivant, un message est affiché à chaque fois que la cellule A1 de la feuille Feuil1 change de valeur, que ce soit par saisie manuelle (Worksheet_Change) ou calcul de formule (Worksheet_Calculate). La variable ValPrec sert à vérifier si cette valeur a changé en stockant la valeur précédente de la cellule et en la comparant à sa nouvelle valeur.

' Dans le module objet de Feuil1 :

Code:
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 "Cellule A1 passe de " & CStr(ValPrec) & _
    " vers " & CStr(Range("A1"))
  ValPrec = Range("A1")
End Sub
' Dans le module de code ThisWorkbook :

Code:
Private Sub Workbook_Open()
  Feuil1.ValPrec = Feuil1.Range("A1")
End Sub

Merci à Myta pour ton explication très claire.

Je cherche à savoir comment je peux procéder si je veux verifier, au lieu d'une cellules, plusieurs cellules d'une plage données.
Avec l'evenement Worksheet_Change il suffit de mettre par exemple C6:C56. Comment faire avec Worksheet_Calculate?

Merci d'avance pour vos réponses :)
 

Discussions similaires

Statistiques des forums

Discussions
312 493
Messages
2 088 957
Membres
103 990
dernier inscrit
lamiadebz