Mise en route automatique des macros au changement de valeur d'une case [Résolu]

Signaler
Messages postés
5
Date d'inscription
vendredi 29 mai 2009
Statut
Membre
Dernière intervention
2 juillet 2009
-
Messages postés
219
Date d'inscription
lundi 21 novembre 2005
Statut
Membre
Dernière intervention
20 décembre 2010
-
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

Messages postés
219
Date d'inscription
lundi 21 novembre 2005
Statut
Membre
Dernière intervention
20 décembre 2010

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
Messages postés
5
Date d'inscription
vendredi 29 mai 2009
Statut
Membre
Dernière intervention
2 juillet 2009

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
Messages postés
219
Date d'inscription
lundi 21 novembre 2005
Statut
Membre
Dernière intervention
20 décembre 2010

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+