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
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...
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 !
Re : Qques infos sur l'évènement Worksheet_Calculate
Re,
A noter, chez moi les événement "calculate" placés dans les feuilles d'autres classeurs ne se déclenchent pas sauf à ce que les classeurs soient liés entre eux....
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....
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 !
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
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.
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
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?
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 !