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
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
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é?
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
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.
Private Sub Worksheet_Change(ByVal Target As Range)
If Not Intersect(Range("b12:c311"), Target) Is Nothing Then
If Target = "" Then MsgBox "donnée modifiée!"
End If
End Sub
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 '
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")
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.
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.
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
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?