Mise en route automatique des macros au changement de valeur d'une case

Résolu
cs_diude54 Messages postés 5 Date d'inscription vendredi 29 mai 2009 Statut Membre Dernière intervention 2 juillet 2009 - 29 mai 2009 à 10:03
cnt Messages postés 219 Date d'inscription lundi 21 novembre 2005 Statut Membre Dernière intervention 20 décembre 2010 - 2 juin 2009 à 14:53
Bonjour,
Je débute sur VBA depuis hier,
J'ai reussi à créer deux macros qui fonctionnent, cependant il faudrai iqu'elles se lancent si une case change de valeur.
Le problème est que:
La macro MiseenForme doit s'activer si la case AC3 change de valeur
La macro Croix doit s'activer si la case J25 change de valeur

Il faut savoir que la case AC3 est une valeur saisie et que la case J25 est une valeur calculée à partir d'une formule : Somme(J7:J23)

Voici ce que j'ai essayé:
Private Sub Worksheet_change(ByVal Target As Range)



If Target.Address = Range("AC3").Address Then
Application.ScreenUpdating = False
Run ("MiseenForme")
Application.ScreenUpdating = True
End If



If Target.Address = Range("J25").Address Then
Application.ScreenUpdating = False
Run ("Croix")
Application.ScreenUpdating = True
End If



End Sub


Si j'enlève la deuxième partie (celle concernant ma macro Croix) ça fonctionne et la macro MiseenForme se lance à chaque fois que je rentre une valeur en AC3:

Private Sub Worksheet_change(ByVal Target As Range)



If Target.Address = Range("AC3").Address Then
Application.ScreenUpdating = False
Run ("MiseenForme")
Application.ScreenUpdating = True
End If

End Sub


Je ne trouve pas comeent combiner les deux, de plus si je met que la deuxième partie ça ne fonctionne pas, cela vient il d u fait qu'il y a une formule dans la case J25?

Je suis certain qu'il y a une solution simple à mon problème, merci d'avance pour vos reponses.

PS, le code avec la private sub est dans la feuille, les macros sont dans des modules

3 réponses

cnt Messages postés 219 Date d'inscription lundi 21 novembre 2005 Statut Membre Dernière intervention 20 décembre 2010 1
30 mai 2009 à 19:19
Salut
Si la cellule J25 résulte d'une formule, je pense qu'il faut voir avec l'évènement "Calculate" de la feuille.

Private oldValue         ' Variable de portée module de feuille

Private Sub Worksheet_Calculate()
    If Range("J25") <> oldValue Then
        Call Croix
        oldValue = Range("J25")
    End If
End Sub

CNTJC
3
cs_diude54 Messages postés 5 Date d'inscription vendredi 29 mai 2009 Statut Membre Dernière intervention 2 juillet 2009
2 juin 2009 à 08:13
Merci pour ta réponse, ça fonctionne effectivement avec calculate, cependant, il faut maintenent que je desactive calculate dans les nouveaux modules que je créé et qui modifient des cellules sinon le module croix se met en route au milieu de la procedure. J'utilise:
Application.EnableEvents = False
N'y a t'il pas moyen de changer ça, ou est ce la bonne manière de procèder?

Voici ce que j'ai ecrit:

Private sub worksheet_calculate()

If range("J25") <> ValJ25 Or Range("J25")=0 Then
Application.ScreenUpdating = False
Run ("Croix")
Application.ScreenUpdating = True
End If
End Sub

Private Sub WorkSheet_Activate()
ValJ25 = Range("J25")
End Sub
0
cnt Messages postés 219 Date d'inscription lundi 21 novembre 2005 Statut Membre Dernière intervention 20 décembre 2010 1
2 juin 2009 à 14:53
Salut
"Calculate" peut cibler un classeur complet, une feuille particulière ou une plage donnée  d'une feuille.
Il doit falloir placer cette méthode dans l'évènement "Activate" de la feuille.
Worksheets("Feuil1").Range("J25").Calculate

et aussi pour les autres feuilles crées

Private Sub Worksheet_Activate()
  Worksheets("NouvelleFeuille").Range("J25").Calculate

End Sub

Private Sub Worksheet_Calculate()
If Worksheets("
NouvelleFeuille
").Range("J25") <> oldValue Then
Call Croix
oldValue = Range("J25")
End If
End Sub

A+
0
Rejoignez-nous