Temps reel

Résolu
Signaler
Messages postés
22
Date d'inscription
mardi 9 février 2010
Statut
Membre
Dernière intervention
24 février 2010
-
Messages postés
18038
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
-
j'ai fait une macro Vba pour excel, qui est sensé tourner en temps reel en utilisant une application OnTime cependant excel finit par envoyer un message d'erreur et se ferme tout seul
Quelqu peut il me proposer une alternative ?

45 réponses

Messages postés
18038
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
240
Pendant toute la durée des instructions d'une procédure (dans un même fil) seules ces instructions s'exécutent. Pour que d'autres (du même fil) puissent être également exécutées, il est nécessaire que la procédure permette au système de le faire.
C'est la vocation de DoEvents (à lire dans ton aide en ligne)
Mais je maintiens que ton problème est plus fondamental que cela, puisque tu nous dis que des mises à jour s'effectuent pendant la procédure (qui ne se termine jamais). C'est la raison pour laquelle je ne peux que penser à des modifications effectuées sur un autre fil. Et comme Excel n'est pas "multiThread", je pense bien évidemment à un fil d'une application externe ou d'une autre instance.
Voilà (à moins que tu ne nous ai pas tout dit de l'instance en cours)

____________________
Vous aimez Codes-Sources ? Il vous aide ? Cliquez ici pour l'aider à continuer
Cliquer sur "Réponse acceptée" en bas d'une solution adéquate est
Messages postés
18038
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
240
Ajoutons quelques petites choses :
1) regarde dans ton aide en ligne la vocation de l'instruction stop (elle n'est pas forcément ce que tu crois qu'elle est)
2) je t'ai dit qu'Excel n'était pas" MultiThread". Ce n'est pas tout-à-fait vrai ! Excel lui-m^me utilise deux threads, mais pas ton appli. Excel utilise en fait un second thread dont il est le seul gestionnaire : celui des calculs (qui se font dans un thread distinct qu'il est seul à gérer)
Ces calculs (ce thread) intervient chaque fois qu'une valeur de cellule est modifiée
Tu as suivi ? On continue ...
3) Que fait Excel dans ce second thread ? =====>> il calcule/recalcule
Il calcule/recalcule quoi ? toutes les cellules dotées d'une formule...
4) Formules ? ===>>> oui : toutes celles d'Excel, mais également toutes les fonctions personnalisées (à mettre dans un module bas), appelable comme "formule depuis une cellule, qui prendra le résultat de la fonction personnalisée.
Tu as suivi ? ===>> on continue.
5) Que font donc tes procédures ? ===>> elles me paraissent fort modifier la valeur d'une cellule en fonction des valeurs d'autres cellules, non (ou je me trompe ?) ?. Mais alors : une simple fonction personnalisée mise comme formule dans la cellule concernée et cette cellule prendra la valeur retournée par cette fonction ...
Et ce, chaque fois qu'il y aura eu une modification (ta "mise à jour", apparemment) des données servant au calcul/recalcul.
Tu suis ? ===>> on continue alors :
En observant cette "philosophie" de base d'Excel ===>> même plus besoin d'un pseudo timer (application.Ontime) pour faire ce que montre ton code
Voilà ! Lis, relis, re-relis... et ... change ton fusil d'épaule ....

____________________
Vous aimez Codes-Sources ? Il vous aide ? Cliquez ici pour l'aider à continuer
Cliquer sur "Réponse acceptée" en bas d'une solution adéquate est
Messages postés
18038
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
240
Je t'encourage vivement à lire ceci :
http://msdn.microsoft.com/en-us/library/aa730921.aspx#Office2007excelPerf_UnderstandingCalculationMethodsExcel
Arrête-toi plus longuement sur les threads qu'utilise Excel pour calculer. Mais lis également calmement tout le reste ===>> tu devrais pouvoir en tirer quelques conclusions et prendre certaines sages décisions .
Voilà ... tu en sais maintenant presqu'autant que moi. A toi de jouer ...

____________________
Vous aimez Codes-Sources ? Il vous aide ? Cliquez ici pour l'aider à continuer
Cliquer sur "Réponse acceptée" en bas d'une solution adéquate est
Messages postés
22
Date d'inscription
mardi 9 février 2010
Statut
Membre
Dernière intervention
24 février 2010

Bonjour pour le fait d'ecrcire directement les formule sur la feuille excel j'ai déjà essayé mais le problème c'est que je dois ecrire,dans des cellules, des formules qui dépendent des mêmes cellules et là excel me reponds que cela ne peux se faire qu'un certain nombre de fois (ça c'est d'après mes souvenirs) bref je reteste mon programme et vous donne des news
Messages postés
22
Date d'inscription
mardi 9 février 2010
Statut
Membre
Dernière intervention
24 février 2010

Une autre question au passage l'utilisation de l'application ontime ne permet pas selon le temps imparti de laisser la main a l'ordi quand je faisait tourné le programme je n'avais pas trop de mal à faire d'autre truc avec mon ordi (internet et de faire tourner un autre programme sur excel)
Messages postés
18038
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
240
Tu as en effet des références circulaires (notamment sur F13 et E7) qu'il va te falloir gérer...
Le problème doit d'ailleurs se poser de manière quasi identique en utilisant ta méthode actuelle.
Que cherches-tu à faire ? on a l'impression que tu recherches des valeurs optimales (mais sans en être vraiment certain). Ne serait-il alors pas plus adroit de faire ces recherches dans un tableau dynamique distinct et de n'intervenir qu'in fine (une seule fois, donc) pour modifier la valeur d'"une cellule ?
Tu pourrais également penser à l'utilisation d'une variable toto pour ne pas redéclencher systématiquement.
Dur de faire l'analyse complète de ton mécanisme sans même savoir ce qu'il est et ce que tu as en tête. D'instinct (mais je n'en sais rien en fait) je serais tenté d'incrémenter la variable toto de 1 unité à chaque modification des valeurs. Ainsi, si les valeurs sont modifiées par suite d'une mise à jour, toto serait impair. Il serait pair à chaque recalcul. Et je ne permettrait le recalcul que si toto est impair.
Bonne chance.
____________________
Vous aimez Codes-Sources ? Il vous aide ? Cliquez ici pour l'aider à continuer
Cliquer sur "Réponse acceptée" en bas d'une solution adéquate est
Messages postés
18038
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
240
Une autre question au passage l'utilisation de l'application ontime ne permet pas selon le temps imparti de laisser la main a l'ordi quand je faisait tourné le programme je n'avais pas trop de mal à faire d'autre truc avec mon ordi (internet et de faire tourner un autre programme sur excel)


Les autres programmes sont sur d'autres fils et n'ont rien à voir dans cette affaire !

____________________
Vous aimez Codes-Sources ? Il vous aide ? Cliquez ici pour l'aider à continuer
Cliquer sur "Réponse acceptée" en bas d'une solution adéquate est
Messages postés
22
Date d'inscription
mardi 9 février 2010
Statut
Membre
Dernière intervention
24 février 2010

Autre sais tu comment comment activer une macro à chaque fois que la valeurs d'une ou plusieurs à changer ?
Merci pour ta patience
Messages postés
18038
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
240
Evènement Change de ta feuille.


____________________
Vous aimez Codes-Sources ? Il vous aide ? Cliquez ici pour l'aider à continuer
Cliquer sur "Réponse acceptée" en bas d'une solution adéquate est
Messages postés
18038
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
240
Et c'est là une meilleure idée que celle de Application.Ontime (à condition de l'assortir du petit compteur pair/impair dont je t'ai parlé plus haut, de sorte à ce que cet évènement ne déclenche tes trucs que lorsque les données ne sont pas modifiées par tes trucs eux-mêmes, hein ...sinon ==>> toujours le même piège )


____________________
Vous aimez Codes-Sources ? Il vous aide ? Cliquez ici pour l'aider à continuer
Cliquer sur "Réponse acceptée" en bas d'une solution adéquate est
Messages postés
18038
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
240
Et tu peux remplacer cette variable pair/impair par une booléenne True/False.
A chaque modif de la booléenne : (si ta variable s'appelle toto) : toto = not toto.
Dans ton code : lorsque tu lances tes trucs, toto (false au départ), va ainsi devenir true (et dans ton évènement change de ta feuille, tu ne lances tes trrucs que si toto = False)
A la fin de tes procédures de trucs, tu remets toto = not toto.
Ca devrait mieux aller ainsi.


____________________
Vous aimez Codes-Sources ? Il vous aide ? Cliquez ici pour l'aider à continuer
Cliquer sur "Réponse acceptée" en bas d'une solution adéquate est
Messages postés
18038
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
240
Suis-je bête ou endormi, aujourd'hui ....?
Il te suffit d'appeler tes procédures dans l'évènement Change de ta feuille et :
Au début de tes procédures :
Application.EnableEvents = False
puis, à la fin de leur exécution (leur dernière ligne d'exécution) :
Application.EnableEvents = True

et voilà ! mle chien ne se "mordra ainsi plus la queue"

____________________
Vous aimez Codes-Sources ? Il vous aide ? Cliquez ici pour l'aider à continuer
Cliquer sur "Réponse acceptée" en bas d'une solution adéquate est
Messages postés
22
Date d'inscription
mardi 9 février 2010
Statut
Membre
Dernière intervention
24 février 2010

Oui c'est presque cela en fait mon programme doit juste doit juste prendre des valeurs comme un cours de bourse par exemple et doit envoyé un message d'erreur quand celui atteind un certain seuil (ce seuil est une fonction de toute la trajectoire de puis le moment ou tu commence a l'observé) après j en sais pas plus mon maitre de stage ordonne j execute
Messages postés
22
Date d'inscription
mardi 9 février 2010
Statut
Membre
Dernière intervention
24 février 2010

merci poour l info je teste et je te dis ce qu il en est !!!!
Messages postés
22
Date d'inscription
mardi 9 février 2010
Statut
Membre
Dernière intervention
24 février 2010

Bon j'ai des nouvelles, j'ai fait demarrer mon programme ce matin 9h30 et il s'est arreté cet après midi vers 15h30. Excel(version 2003) a redemarré tout seul sans message d'erreur a part une page microsoft disant qu excel a rencontré des problèmes voulez vous envoyer un rapport
voilà !!!
Messages postés
18038
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
240
C'est probablement dû (on pouvait s'y attendre à ce rythme-là) à un overflow en raison de tes références circulaires, entre autres.
Il en ira ainsi tant que tu ne contourneras pas ce problème et que tu continueras à sur-solliciter ton processeur.
As-tu essayé de mettre en oeuvre la/les solution(s) que je t'ai signalées ?
Je pourrais probablement être plus précis en matière d'imagination si tu me disais comment, d'où et par quoi sont exactement faites ces fameuses "mises à jour".


____________________
Vous aimez Codes-Sources ? Il vous aide ? Cliquez ici pour l'aider à continuer
Cliquer sur "Réponse acceptée" en bas d'une solution adéquate est
Messages postés
22
Date d'inscription
mardi 9 février 2010
Statut
Membre
Dernière intervention
24 février 2010

non je n'ai pas eu le temps de le faire car je voulais reproduire l'erreur pour les mise à jour pour l'instant je traivaille avec des collages speciaux, en faisant des copies sur une plateforme, pour l'instant ça a très bien fonctionné. Cepedant la plateforme utilisée ne le sera plus par la suite (collage spécial va peut être devenir impossible) j'avais donc dans l'idée d'utiliser des automations via l'instruction RTD (j'apprends donc je ne sais vraiment comment faire pour l'instant) tu vas me prendre pour un gros naze (si c'est pas déjà le cas) mais je rencontre un autre souci(c'est aussi pour cette raison que je n'ai pas encore essayé ta solution) la moindre fonction que je veux créer ne marche pas même celle ci

Function test()
test = 1
End Function

vba me dit qu'il ne retrouve ni le projet ni la bibliothèque si tu as une info à me donner je suis preneur

Merci
Messages postés
18038
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
240
Il est vraisemblable que tu as fait perdre la boule à Excel (ou tout au moins àa-t-il perdu ses pointeurs)
Tu devrais pouvoir retyrouver ton projet sur le disque dur, dans l'état où il se trouvait.
Chaque fois que l'on ouvre un fichier Excel, Excel ouvre en mémoire un fichier temporaire qu'il n(efface que lorsque l'on enregistre le classeur et qu'on le ferme proprement.
Je ne sais quel est le préfixe donné par la version 2003. La version 2007 ouvre un fichier dont le nom commence par ~$
Il suffit alors de rechercher les fichiers commençant par ~$, de localiser le tien, de le renommer et de rouvrir.
Et surtout : arrête de provoquer ainsi Excel.


____________________
Vous aimez Codes-Sources ? Il vous aide ? Cliquez ici pour l'aider à continuer
Cliquer sur "Réponse acceptée" en bas d'une solution adéquate est
Messages postés
22
Date d'inscription
mardi 9 février 2010
Statut
Membre
Dernière intervention
24 février 2010

évenement Change (via l'évènement Calculate) semble exactement ce que je cherchais finalement mais en l'utilisant je me suis mangé erreur d'execution 28 (Au passge j'en profite pour m'excuser pour les fautes d'ortographe)
Messages postés
22
Date d'inscription
mardi 9 février 2010
Statut
Membre
Dernière intervention
24 février 2010

il te faut peut etre le code (tu vois que j'apprends vite)

Private Sub Worksheet_Change(ByVal Target As Range)
Dim x As Variant
Dim xm As Variant
Dim xp As Double
Dim xi As Variant
Dim poids As Double
Dim pos As Variant
Dim compteur As Integer
Dim nom As Double
Dim LQ As Double
Dim BQ As Double
Dim PLQi As Double
Dim PBQi As Double
Dim t As Variant
Dim poidsr As Double
Dim datei As Date

x = Workbooks("test").Worksheets("test1").Range("D7").Value

xm = Workbooks("test").Worksheets("test1").Range("E7").Value

xp = Workbooks("test").Worksheets("test1").Range("F7").Value

xi = Workbooks("test").Worksheets("test1").Range("G7").Value

poids = Workbooks("test").Worksheets("test1").Range("G13").Value

pos = Workbooks("test").Worksheets("test1").Range("H9").Value

compteur = Workbooks("test").Worksheets("test1").Range("F13").Value

nom = Workbooks("test").Worksheets("test1").Range("C7").Value

LQ = Workbooks("test").Worksheets("test1").Range("C9").Value

BQ = Workbooks("test").Worksheets("test1").Range("C11").Value

PLQi = Workbooks("test").Worksheets("test1").Range("E9").Value

PBQi = Workbooks("test").Worksheets("test1").Range("E11").Value

t = Workbooks("test").Worksheets("test1").Range("E13").Value

poidsr = Workbooks("test").Worksheets("test1").Range("C15").Value

datei = Workbooks("test").Worksheets("test1").Range("C13").Value

If datei = Date Then
Workbooks("test").Worksheets("test1").Range("F13").Value = 2
Else
Workbooks("test").Worksheets("test1").Range("F13").Value = 1
End If

If x < xm Then
Workbooks("test").Worksheets("test1").Range("E7").Value = x
End If

If x > xp Then
Workbooks("test").Worksheets("test1").Range("F7").Value = x
End If

Call position(x, xm, xi, xp, poids, pos, compteur, nom, LQ, PLQi, BQ, PBQi, t, poidsr)

End Sub

Private Sub Worksheet_Calculate()
Call Worksheet_Change(Workbooks("test").Worksheets("test1").Range("D7"))
End Sub

et j'ai erreur execution 28