[Résolu] Qques infos sur l'évènement Worksheet_Calculate

Jenovae

XLDnaute Nouveau
Bonjour le forum,

Dans un fichier Excel avec de nombreuse macro, j'utilise "Worksheet_Calculate" sur plusieurs feuilles.
J'aurais aimé avoir quelques précisions sur l'utilisation de cet évènement :

- Sur la feuille nommée "Feuille de Saisie", pour faire référence à une cellule, dois-je me référencer à chaque fois à la feuille? Je m'explique :
Code:
Private Sub Worksheet_Calculate()
    
    With Sheets("Feuille de Saisie").Range("K7") .......

' ou simplement

    With Range("K7") ........
    
End sub
En effet sachant que cet évènement "Worksheet_Calculate" est utilisé sur plusieurs feuilles différentes, et qui ne sont pas forcément les feuilles actives, Excel fait-il directement le lien ou doit-on le lui indiquer?

- D'autre part, lorsque j'ouvre un autre classeur Excel en plus de celui contenant de nombreux évènements "Worksheet_Calculate", si je modifie une cellule dans ce nouveau classeur Excel il me lance les "Worksheet_Calculate" de l'autre classeur....
Est-ce normal? Comment empêcher cela?

Merci d'avance pour votre aide, si vous avez besoin de précisions sur ce que je raconte n'hésitez pas :)
 
Dernière édition:

Pierrot93

XLDnaute Barbatruc
Re : Qques infos sur l'évènement Worksheet_Calculate

Bonjour,

dès l'instant ou ton code est placé dans un module de feuille (ce qui est le cas pour "Worksheet_Calculate"), toutes les instructions seront effectuées sur la feuille en question, sauf bien sur à en préciser une autre devant le "range" par exemple...

bonne journée
@+
 

Jenovae

XLDnaute Nouveau
Re : Qques infos sur l'évènement Worksheet_Calculate

Très bien, c'est ce que je pensais et j'avais tout codé dans ce sens. Mais je me suis posé la question suite au second problème que j'évoque plus haut.

Merci pour ta réponse rapide Pierrot93, j'espère que quelqu'un saura m'éclairer pour le reste de mon questionnement :)
Bonne journée !
 

Jenovae

XLDnaute Nouveau
Re : Qques infos sur l'évènement Worksheet_Calculate

Merci Pierrot93 pour tes réponses, c'est vraiment étrange....

J'ouvre mon classeur contenant des évènements "Worksheet_Calculate", je clique sur "Fichier"->"Nouveau" et dans ce classeur neuf (et ne contenant à priori aucunes liaisons avec mon autre classeur) j'entre n'importe ou une valeur quelconque. Eh bien à chaque fois il me lance les évènements "Calculate" de mon autre classeur....

Il doit bien y a voir une raison à cela!
 

Jenovae

XLDnaute Nouveau
Re : Qques infos sur l'évènement Worksheet_Calculate

Bonjour Hasco,

J'ai fait une recherche sur le projet pour l'évènement dont tu parles, je n'ai rien trouvé (et je n'avais aucun souvenir de l'avoir utilisé).

Ce qui est étonnant c'est que sur le classeur considéré, lorsque je suis sur une feuille ne contenant pas de "Worksheet_Calculate", je peux faire ce que je veux sans déclencher l'évènement en question. En revanche sur n'importe quel autre classeur ouvert, et pour n'importe quelle page, la moindre action dans une cellule entraine le lancement de l'évènement dans mon classeur à macro...

Je continue de me creuser la tête là dessus :)
Bonne journée !
 
G

Guest

Guest
Re : Qques infos sur l'évènement Worksheet_Calculate

Bonjour,

Peut-être un complément avec un objet de classe Application qui surveille les classeurs.

Ferme ton classeur, crée un nouveau classeur, avec un évènement sheet_calculate et vois si cela se repoduit.

Sinon, sans le fichier, c'est difficile de voir ce qui se passe. Ce qui m'interroge c'est que tu aies autant besoin de Sheet_Claculate.

A+
 

Jenovae

XLDnaute Nouveau
Re : Qques infos sur l'évènement Worksheet_Calculate

Re-bonjour,

Le seul objet de classe "application" que j'utilise dans mon classeur est un "Application.ScreenUpdating". Je ne pense pas que c'est ce qui pose problème ici. C'est possible?


J'ai tenté ta manipulation, le problème ne se reproduit pas. Il doit donc y a voir un soucis au sein de mon classeur qu'il faut que je résolve.
En fait j'ai besoin de Worksheet_Calculate pour détecter des changements de valeur dans des cellules qui contiennent une formule qui est fixe. Ainsi j'attribue la valeur de ma cellule à une variable à l'ouverture de mon classeur, et à chaque fois que la feuille en question est recalculée, il compare la valeur initiale à la nouvelle valeur, et si il y'a différence il lance une macro.
Je n'ai pas trouvé de moyen plus "propre" de détecter le changement de valeur d'une cellule contenant une formule.

Je ne peux pas vraiment fournir mon fichier car il est d'une part très volumineux (presque 6Mo) et d'autre part contient des données sensibles puisqu'il est réalisé dans le cadre de mon travail.

Merci de te creuser la tête avec moi en tous les cas :)
 

job75

XLDnaute Barbatruc
Re : Qques infos sur l'évènement Worksheet_Calculate

Bonjour le fil, le forum,

Ne pas oublier que les fonctions volatiles sont systématiquement recalculées quand on modifie des cellules dans le classeur ou dans un autre classeur.

Et aussi (je crois mais à vérifier) quand on crée un nouveau document Edit : non, j'ai vérifié.

Exemples de fonctions volatiles : DECALER() INDIRECT() AUJOURDHUI() MAINTENANT()

Leur recalcul crée bien sûr l'évènement Calculate.

A+
 
Dernière édition:
G

Guest

Guest
Re : Qques infos sur l'évènement Worksheet_Calculate

Re,


On pourrait réfléchir à l'envers:

Au lieu de 'Que doit-il se passer APRES le recalcul?' (comparaison des valeur) se demander qu'est-ce qui entraine le recalcul de ma fonction. Comment je peux intervenir avant?

Je suppose ici que la formule retourne une valeur qui change en fonction d'autres cellules?
Est-que ces dernières sont rentrées manuellement? Ou par programmation?

Si tel est le cas utiliser éventuellement l'évènement Change sur ces cellules pour comparer ta valeur juste après le changement d'une des cellules dont dépend la fonction.

Si le changement entraine un recalcul un peu long du classeur il faudra intégrer quelque chose comme les lignes suivantes avant de comparer les valeurs:

VB:
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
    If Target.Address = "$B$2" Then
        Do While Application.CalculationState = xlDone
            DoEvents
        Loop
        If Range("CelluleCalculée") <> DernièreValeurConservée Then LancerMacro
    End If
End Sub

Où B2 est la cellule changée manuellement ou par vba et qui entrainera un recalcul de la fonction.

A+
 

Jenovae

XLDnaute Nouveau
Re : Qques infos sur l'évènement Worksheet_Calculate

Bonjour jop75,

En effet certaines de mes cellules utilisent la fonction "AUJOURDHUI()" mais en les modifiant rapidemment le problème semble persister. Je vais creuser ça plus profondément.

@Hasco, Ce que tu dis là pourrait en effet bien me convenir, surtout que cela m'éviterait de nombreuse vérifications. Je vais regarder si je peux mettre ça en place dans mon classeur.

Je me retournerai verrs vous un peu plus tard lorsque j'aurai eu le temps de regarder tout ça. En tous les cas merci beaucoup pour vos conseils :)
 

Jenovae

XLDnaute Nouveau
Re : Qques infos sur l'évènement Worksheet_Calculate

Bonjour le forum,

Je reviens vers-vous aujourd'hui suite aux propos précédents. J4ai suivi les conseils d'Hasco, et en effet en retournant le problème j'ai pu éviter quasiment toutes les utilisations de l'évènement "Worksheet_Calculate". Ca rend le projet bien plus propre...
Par là même j'ai pu résoudre le problème que j'avais lorsqu'un autre classeur était ouvert en plus de celui rempli de macro.
Donc un grand merci pour ces conseils :)

Cependant un nouveau problème vient de surgir !!
Lorsque je modifie une cellules particulière (appelons la "Tata"), cela lance une macro qui va copier des données dans un userform. Ces données provenant de différentes feuilles du classeur.
Mais lorsque je modifie Tata, cela implique aussi (par le biais de centaines de formules à travers le classeur) la modification de très nombreuses autres cellules, celles là même qui sont copiées dans mon userform.
Mon soucis est le suivant :

Le nombre de formule étant très très important et faisant référence à une bonne cinquantaine de feuilles différentes, j'ai l'impression que la macro copie plus vite les données dans mon userform que le classeur ne modifie les cellules en questions suite au changement dans Tata. Du coup je me retrouve avec un userform rempli en partie des anciennes données (celles qui ont été les plus longues à calculer).

Auriez-vous un conseil à m'apporter pour résoudre ça?

Merci par avance!
 
G

Guest

Guest
Re : Qques infos sur l'évènement Worksheet_Calculate

Bonjour,

Je t'ai donné une solution à ce genre de problème hier:

A lancer pour attendre la fin d'un recalcul
Do While Application.CalculationState = xlDone
DoEvents
Loop


A+
 

Jenovae

XLDnaute Nouveau
Re : Qques infos sur l'évènement Worksheet_Calculate

Re-bonjour Hasco,

Je n'arrive pas vraiment à me servir de ta solution....
Sur mon UserForm, j'ai une ComboBox qui lorsqu'elle est modifiée (ComboBox_Change) lance toute la procédure de copie de données.

J'ai donc inséré tes quelques lignes au début de ma procédure ComboBox_Change afin qu'une fois les calculs terminés, la copie des données se fasse sans soucis.... Malheureusement ça ne semble pas marcher à tous les coups.

J'ai aussi tenté d'insérer à la place :
Code:
Do While Not Application.CalculationState = xlDone
    DoEvents
Loop
Ou encore
Code:
Do While Not Application.CalculationState = xlDone
    
Loop
Mais sans plus de succès au final... J'ai beau me servir de l'aide Excel pour essayer de comprendre le fonctionnement exact de se bout de code mais j'ai encore un peu de mal.

Je continue de regarder dans cette direction en tous cas :)


J'ai encore une nouvelle question (ce fil commence à ne plus avoir beaucoup de rapport avec le titre de départ...) :
Lorsque mon UserForm apparait (UserForm.Show), une série d'actions de remplissage de diverses TextBox, ComboBox etc.... se met en place via le UserForm_Initialize.
Toutes ces TextBox, Combobox sont aussi soumises à un évènement de type "ComboBox_Change".
Comment éviter que ces évènements n'aient lieu lors du remplissage de mes TextBox, ComboBox ... durant le UserForm_initialize ??

Merci encore pour votre aide :)
Bonne fin de journée !
 

Discussions similaires

Réponses
3
Affichages
477

Statistiques des forums

Discussions
312 581
Messages
2 089 916
Membres
104 305
dernier inscrit
EDIT