OVH Cloud OVH Cloud

declenchement d'une macro a partir d'un test logique posé dans une feuille

22 réponses
Avatar
letetu
Bonjour,
je beug un peu sur la procedure de declenchement d'une macro a partir d'un test logique posé dans une feuille ecxel,j'arrive a declencher la macro en faisant varier ma cellule referencée
voici l 'ecriture:
Sub Worksheet_Change(ByVal Target As Excel.Range)

If Range("B4") = "a" Then
Call Macro1

End If
End Sub
le probleme c'est que ,tout changement dans les autres cellules de la feuille font declencher la macro, voila si quelqu'un peut me solutionner ca ca serait super

10 réponses

1 2 3
Avatar
fraction
> Si tu veux que la macro soit déclenché par un changement de valeur d' une
autre cellule, utilise plutôt Worksheet_Calculate. Exemple :

Private m_b4_value

Private Sub Worksheet_Calculate()
     If m_b4_value <> Range("B4").Value Then
         If Range("B4").Value = "a" Then
             MsgBox "toto"
         End If
         m_b4_value = Range("B4").Value
     End If
End Sub

La variable "m_b4_value" sert à éviter le déclenchement de la macro sur
tout changement dans la feuille quand la valeur de la cellule B4 n'a pas
changé. Le mode de recalcul doit être en automatique (option d'Excel par
   défaut)



Belle méthode, je ne connaissais pas l'évènement "Calculate".
Cependant, même si ça résout un bon nombre de cas de figure, ça ne
fait que déplacer le problème. Mettons que "a" soit conditionné par l a
valeur 1 de la case A1, si on écrit 1 deux fois de suite dans la case
A1, le message "toto" ne s'affiche pas la deuxième fois.
Avatar
parci
fraction a écrit :
Si tu veux que la macro soit déclenché par un changement de valeur d'une
autre cellule, utilise plutôt Worksheet_Calculate. Exemple :

Private m_b4_value

Private Sub Worksheet_Calculate()
If m_b4_value <> Range("B4").Value Then
If Range("B4").Value = "a" Then
MsgBox "toto"
End If
m_b4_value = Range("B4").Value
End If
End Sub

La variable "m_b4_value" sert à éviter le déclenchement de la macro sur
tout changement dans la feuille quand la valeur de la cellule B4 n'a pas
changé. Le mode de recalcul doit être en automatique (option d'Excel par
défaut)



Belle méthode, je ne connaissais pas l'évènement "Calculate".
Cependant, même si ça résout un bon nombre de cas de figure, ça ne
fait que déplacer le problème. Mettons que "a" soit conditionné par la
valeur 1 de la case A1, si on écrit 1 deux fois de suite dans la case
A1, le message "toto" ne s'affiche pas la deuxième fois.



Ben oui mais c'est normal, faut adapter au contexte :
si A1 est calculé par une formule, on utilise Worksheet_Calculate()
si A1 est une valeur saisie, on utilise Worksheet_Change
Et une cellule ne peut être à la fois saisie et calculée.
Avatar
fraction
Pour pallier à ce problème, j'ai trouvé une solution, en combinant
"Change" et "Calculate", mais ne me demande pas comment ça marche, je
n'en sais rien. :-)

Private var1 As Integer
Private m_b4_value

Private Sub Worksheet_Calculate()
If var1 = 1 And m_b4_value <> Range("B4").Value Then
If Range("B4").Value = "a" Then
MsgBox "toto"
End If
m_b4_value = Range("B4").Value
End If
var1 = 0
End Sub

Private Sub Worksheet_Change(ByVal Target As Range)
If m_b4_value <> Range("B4") Then
var1 = 1
Worksheet_Calculate
End If
End Sub
Avatar
fraction
> Ben oui mais c'est normal, faut adapter au contexte :
si A1 est calcul par une formule, on utilise Worksheet_Calculate()
si A1 est une valeur saisie, on utilise Worksheet_Change
Et une cellule ne peut tre la fois saisie et calcul e.



De toutes façons, l'évènement Change seul n'est pas pertinent,
puisqu'il ne renvoie pas la valeur de B4 avant ET après l'évènement.
Il faut, comme tu le dis travailler avec "Calculate". C'est pour cela
que j'ai pensé à combiner l'action de saisie (étrangère à B4) et le
calcul de B4.
Avatar
fraction
Ton problème est extrêmement vicieux si tu souhaites résoudre toutes
ses expressions possibles. Je me suis pris la tête toute la soirée, et
je m'en tiens à ma deuxième solution : il faut que tu traites ton test
logique dans le code du programme, après l'évènement "Change". Ça
coupera court à toutes les prises de tête, et ça me soulagera beaucou p.
Avatar
fraction
> De toutes façons, l'évènement Change seul n'est pas pertinent,
puisqu'il ne renvoie pas la valeur de B4 avant ET après l'évènement .
Il faut, comme tu le dis travailler avec "Calculate". C'est pour cela
que j'ai pensé à combiner l'action de saisie (étrangère à B4) e t le
calcul de B4.



En fait, tant que B4 change de valeur, il n'y a pas de problème.
Mais lorsque B4 garde la valeur "a", il est impossible de distinguer
le "je reste a" (pas de message toto) du "je redeviens a" (message
toto).
Avatar
Gloops
fraction a écrit, le 08/01/2010 12:21 :
C'est bizarre, ton truc.



Pourquoi donc ?



Parce qu'on croirait entendre quelqu'un téléphoner dans la pièce à côté
: j'ai tes interventions, mais pas celles de la personne à qui tu rép onds.

Dans un newsgroup, ça arrive qu'on n'ait pas le début d'un fil si on ne
s'est pas connecté un certain temps. Mais en venant une fois par jour,
avoir seulement l'expression d'un des intervenants, c'est moins courant.

On ne risque pas de dire le contraire :)
Avatar
letetu
fraction a écrit le 08/01/2010 à 19h52 :
> Si tu veux que la macro soit déclenché par un changement de
valeur d' une
autre cellule, utilise plutôt Worksheet_Calculate. Exemple :

Private m_b4_value

Private Sub Worksheet_Calculate()
     If m_b4_value <> Range("B4").Value Then
         If Range("B4").Value =
"a" Then
             MsgBox "toto"
         End If
         m_b4_value = Range("B4").Value
     End If
End Sub

La variable "m_b4_value" sert à éviter le
déclenchement de la macro sur
tout changement dans la feuille quand la valeur de la cellule B4 n'a pas
changé. Le mode de recalcul doit être en automatique (option
d'Excel par
   défaut)




Belle méthode, je ne connaissais pas l'évènement
"Calculate".
Cependant, même si ça résout un bon nombre de cas de
figure, ça ne
fait que déplacer le problème. Mettons que "a" soit
conditionné par l a
valeur 1 de la case A1, si on écrit 1 deux fois de suite dans la case
A1, le message "toto" ne s'affiche pas la deuxième fois.


Bonjour a fraction et parci, je vous remercie vraiment pour votre aide,c'est vraiment encourageant , je ne vouvais intervenir sur ce forum a cause d'un probleme materiel qui vient de s'arranger, voila pour mon silence
cependant j'essai de transposer la fonction "calculate que tu as ecris ,mais j'ai a chaque fois un message d'erreur du type " attente fin d'instruction " then ou go to...
Avatar
jean-marc
"letetu" wrote in message
news:
fraction a écrit le 08/01/2010 à 19h52 :
cependant j'essai de transposer la fonction "calculate que tu as ecris
,mais
j'ai a chaque fois un message d'erreur du type " attente fin d'instruction
"
then ou go to...



Il ne faut pas recopier betement:

If Range("B4").Value >> "a" Then





Ces 2 lignes n'en font qu'une, evidemment ...

--
jean-marc
Avatar
fraction
Si tu nous avais prévenu d'une chose :
Existe-t-il une case qui détermine systématiquement la valeur du test
logique chaque fois que tu y touches ? J'aurais pu t'aider autrement.
1 2 3