[VBA] laisser le temps au Calculate de se faire

F22Raptor

XLDnaute Impliqué
Hello
J'ai une macro qui se relance elle-même toutes les 5 mn avec un Excel.Application.OnTime Now + TimeValue(TempsTraitement), "MaMacro"

Elle est de la forme (pour simplifier le principe) :
VB:
Sub MaMacro()
	
	'Mise à jour des données de MonClasseur.maFeuille  à partir d'un FichierSource que d'autres utilisateurs peuvent modifier
	ThisWorkbook.UpdateLink Name:="D:\\MaFeuilleExcelSource.xls", Type:=xlExcelLinks
	ThisWorkbook.Sheets("maFeuille").Range("B1").Calculate
	
	'J'affiche B1 de maFeuille qui a peut-être changé (grâce au Calculate)
	MsgBox ThisWorkbook.Sheets("maFeuille").Range("B1").Value

	Excel.Application.OnTime Now + TimeValue("00:05:00"), "MaMacro"

End Sub

Mon problème :
Si un autre utilisateur modifie le fichier source à 14:00:00
Ma macro se lance par exemple à 14:02:00 -> Je ne vois pas la bonne valeur de B1 !
Mais 5 mn plus tard à 14:07:00, au relancement automatique, c'est OK.

Je soupçonne la chose suivante :
Le Calculate n'a pas eu le temps de se terminer, que déjà j'affiche la MsgBox. Elle a donc encore l'ancienne valeur de B1, car l'update n'est pas fini.
Mais bien entendu, 5 mn plus tard, c'est bon !


J'ai 3 idées de soluce
1- Ca pourrait être de faire une pause dans la macro après le Calculate, pour laisser le temps du recalcul avant d'afficher la MsgBox.
J'ai essayé Application.Wait Time + TimeSerial(0, 0, 2), mais ça bloque l'Excel pendant ce temps ...
Bof bof ...

2- Autre soluce : peut-être y a-t-il moyen de ne passer à la MsgBox que quand l'update est fini. VBA a t-il un marqueur de fin d'update ? Du genre "If UpdateComplete=True then ...."

3- Enfin :
Au lieu de lancer ma macro au bout de 5 mn, avec son update :
Je crée une MacroUpdate comprenant les deux lignes de UpdateLink et Calculate

je supprime ces lignes de maMacro, et j'ajoute un OnTime lançant MacroUpdate dans 4:30
VB:
	Excel.Application.OnTime Now + TimeValue("00:04:30"), "MacroUpdate"
	Excel.Application.OnTime Now + TimeValue("00:05:00"), "maMacro"

Qu'en pensez-vous ? Une préférence ou une autre idée ?
 
Dernière édition:

tototiti2008

XLDnaute Barbatruc
Re : [VBA] laisser le temps au Calculate de se faire

Bonjour F22Raptor,

si tu veux une attente qui laisse la main aux processus en cours, tu peux essayer

Code:
for i = 1 to 1000
doevents
next i

pour la partie là :
Code:
ThisWorkbook.UpdateLink Name:="D:\\MaFeuilleExcelSource.xls", Type:=xlExcelLinks
c'est marrant en enregistrant il m'a mis qu'un seul "\" chez moi

Edit : il semble que chez moi il mette bien à jour le lien avant d'afficher la msgbox, même si le calcul est long, même sans attente
 
Dernière édition:

mutzik

XLDnaute Barbatruc
Re : [VBA] laisser le temps au Calculate de se faire

bonjour,

perso je mettrai dans le worksheets_change un calculate

et dans la macro timer, vérifier s'il y a un calculate en cours, d'augmenter ou de relancer le timer ...
... par contre, je ne sais pas comment vérifier s'il y a un calculate en cours ou à quelle heure a eu lieu le dernier
 

Discussions similaires

Statistiques des forums

Discussions
312 154
Messages
2 085 810
Membres
102 986
dernier inscrit
nonoblez