Lancer plusieurs timers et mémoriser leurs emplacements
Bonsoir,
je vous remercie d'avance de me lire, et si vous pouvez m'aider c'est encore mieux
Il s'agit d'un "spreadsheet" de simulation boursière avec données en temps réelles issue de yahoo finance.
Explication rapide du fonctionnement :
Lorsque vous ouvrez le feuille excel, il vous suffit de choisir l'Asset (devise?) dans la colonne B.
Ensuite vous choisissez si l'Asset montera ou descendra dans le quart d'heure qui suit grace a la colonne D.
La valeur de l'Asset est rapatrié depuis yahoo et mise dans la colonne G (value).
Un quart d'heure plus tard (actuellement 30 sec pour test), la valeur choisie expire et a nouveau celle ci est rapatrié dans la colonne G (expvalue).
Résume: Choisir valeur dans la colonne B, puis dans D.
Mes deux petits problèmes principaux:
Lorsque je mise sur plusieurs Assets (3 4 a la suite), et que les timers expirent seul la dernière ligne de la colonne G est remplie :/
Le problème vient surement de la ligne :/
j = ActiveCell.Row
Mais je ne sais pas comment résoudre le problème.
J'aimerais que la colonne G se remplisse automatiquement (comme la colonne C). MAIS uniquement lorsque l'on arrive a l'heure dans la colonne F. Tout en tenant compte du problème précédant de lignes non mémorisé.
J'ai bien envisagé la création d'un array (Tableau), mais j'ai deja du mal a comprendre comment je suis arrivé aussi loin sans aidee je ne me sens pas capable de créer un tableau pour emmagasiner les valeurs des lignes en fonctions des timers.
Help svp
Code VBA:
Sheet1
Private Sub Worksheet_Change(ByVal Target As Range)
Dim Cell As Range
For Each Cell In Target
If Cell.Column = Range("D:D").Column Then
If Cell.Value <> "" Then
Cells(Cell.Row, "A").Value = Now
getprice
StartTimer
Else
Cells(Cell.Row, "A").Value = ""
End If
End If
Next Cell
End Sub Module 1
Public Const cRunWhat = "Expirevalue"
Sub getexpprice()
j = ActiveCell.Row
Asset = Cells(j, 2).Value
Sheets("Sheet2").Select
ticker = Application.VLookup(Asset, Sheets("Sheet2").Range("A1:C50"), 3, False)
Sheets("Sheet3").Select
Cells.Delete
With ActiveSheet.QueryTables.Add(Connection:= _
"URL;http://finance.yahoo.com/q?s=" & ticker & "&ql=0", _
Destination:=Range("A1"))
.Name = "q?s=" & ticker & "&ql=0"
.FieldNames = True
.RowNumbers = False
.FillAdjacentFormulas = False
.PreserveFormatting = True
.RefreshOnFileOpen = False
.BackgroundQuery = True
.RefreshStyle = xlInsertDeleteCells
.SavePassword = False
.SaveData = True
.AdjustColumnWidth = True
.RefreshPeriod = 0
.WebSelectionType = xlEntirePage
.WebFormatting = xlWebFormattingNone
.WebPreFormattedTextToColumns = True
.WebConsecutiveDelimitersAsOne = True
.WebSingleBlockTextImport = False
.WebDisableDateRecognition = False
.WebDisableRedirections = False
.Refresh BackgroundQuery:=False
End With
Sheets("Sheet1").Select
Cells(j, 7).Value = Application.VLookup("Bid:", Sheets("Sheet3").Range("A1:B1000"), 2, False)
End Sub
Sub getprice()
j = ActiveCell.Row
Asset = Cells(j, 2).Value
Sheets("Sheet2").Select
ticker = Application.VLookup(Asset, Sheets("Sheet2").Range("A1:C50"), 3, False)
Sheets("Sheet3").Select
Cells.Delete
With ActiveSheet.QueryTables.Add(Connection:= _
"URL;http://finance.yahoo.com/q?s=" & ticker & "&ql=0", _
Destination:=Range("A1"))
.Name = "q?s=" & ticker & "&ql=0"
.FieldNames = True
.RowNumbers = False
.FillAdjacentFormulas = False
.PreserveFormatting = True
.RefreshOnFileOpen = False
.BackgroundQuery = True
.RefreshStyle = xlInsertDeleteCells
.SavePassword = False
.SaveData = True
.AdjustColumnWidth = True
.RefreshPeriod = 0
.WebSelectionType = xlEntirePage
.WebFormatting = xlWebFormattingNone
.WebPreFormattedTextToColumns = True
.WebConsecutiveDelimitersAsOne = True
.WebSingleBlockTextImport = False
.WebDisableDateRecognition = False
.WebDisableRedirections = False
.Refresh BackgroundQuery:=False
End With
Sheets("Sheet1").Select
Cells(j, 3).Value = Application.VLookup("Bid:", Sheets("Sheet3").Range("A1:B1000"), 2, False)
End Sub
Sub StartTimer()
RunWhen = Now + TimeSerial(0, 0, 30)
MsgBox RunWhen
Application.OnTime EarliestTime:=RunWhen, Procedure:=cRunWhat, _
Schedule:=True
End Sub
Sub Expirevalue()
getexpprice
End SubBonjour
Miju a écrit :Lorsque je mise sur plusieurs Assets (3 4 a la suite),
Je ne connais pas trop les Timer mais je ne crois pas que l'on puisse lancer plusieurs Timer à la suite
A voir pour le reste
Merci de ta réponse. Je rajoute le code VBA en balise Code dans le post original pour ceux qui préfère télécharger ton fichier xls beaucoup plus léger.
S'il n'est pas possible de mettre plusieurs timers, peut etre est il possible de faire un tableau avec d'un coté la valeur ExpTime et de l'autre la valeur de la colonne correspondante a un ExpTime particulier ? Apres il suffirait que lorsque ExpTime = Now alors la routine sub getexpprice aille piocher la valeur de colonne qui correspond dans ce tableau ?
En gros au lieu de lancer plusieurs Timers a la fois, on fait un tableau avec d'un coté ExpTime (date en hh:mm:ss) et de l'autre la colonne qui correspond. Et le Timer va piocher dans le tableau.
Est ce faisable ? Désoler si je ne m'exprime pas très bien. Merci beaucoup en tout cas pour votre aide.
Vraiment très très bien
Encore 2-3 petits problèmes et c'est parfait:
- Il semblerait que la routine qui calcule ExpValue (G) se déclenche sans tenir compte de ExpTime (environ toujours 10 secondes apres avoir activé D) Ce que je voudrais c'est que le calcule de G ne se déclenche QUE lorque l'heure actuelle = la valeur F.
Edit:Est ce possible que la solution soit de remplacer la ligne:
If (Range("A" & LigneEnCours) + CDate("00:00:10") < Now) Then
par
If (Range("F" & LigneEnCours) + CDate("00:00:10") < Now) Then
?
Ca a l'air de pas trop mal marcher comme ca.
- L'heure (toute la cellule quoi) dans les colonnes A et F disparaissent des que ExpValue (G) est ajouté par le timer. ( Ca n'est pas extremement important mais bon ca serait parfait si on pouvait garder ces info, le pb c'est que si je comprend bien c'est en partie grace a ca que tu piste la ligneencours?)
Merci encore, en attendant j'essaye par moi même de résoudre ca
Bonjour,
Salut Banzaï, j'ai repris ton classeur,
Avant de se pencher sur l'actualisation des données (pour lequel tu t'y prend très mal) y faudrait d'abord avoir un rapatriement valide, ce qui n'est pas le cas
Sur YT : Ticker = "USDJPY=X" --> 81.350
sur sheet3 : 813500 ->> formatter ->> 813.500
sur Sheet1 : 813500 ->> et avec ton format cellule 813500,00000
J'ai tout essayé (du moins ce que je connais) et je n'ai pas réussi à avoir les données valide, peut-être Banzaï ?
Concernant tes timer, laisse tomber ce n'est pas un problème mais ont verras ça après.
A+.
Merci beaucoup Banzaï
Il reste cependant un dernier petit problème (désolé ^^).
Dans ma version, le faite que la colonne F qui détermine la date d'expiration (Exptime) soit définit par ;
=IF(A2<>0;ROUNDUP(A2*1440;0)/1440;"")
(ou quelques fois =IF(A4<>0;ROUNDUP(A4*96;0)/96;"") mais dans ce cas c'était pour un raison pratique, car 1 min a attendre pour faire des test c'est plus pratique que 15min (valeur 1440)).n'était pas la pour rien
Par exemple ici dans le prochain quart d'heure non finit:
Ma mise en hh:mm / Expiration en hh:mm
1:25 / 1:30
1:44 / 1:45
1:48 / 2:00
1:55 / 2:00
2:01 / 2:15
2:09 / 2:15
2:12 / 2:15
D’où l'utilité de la formule au dessus. Il ne suffisait alors que de modifier la valeur 1440 si je veux une expiration autre que 15min.
Idealement, si je pouvais mettre la formula =IF(A2<>0;ROUNDUP(A2*1440;0)/1440;"") dans J1 ce serait l'ideal
Je vais tester et essayer par moi meme de résoudre le probleme.
Merci encore, je reviens résoudre le post dès que c'est bon.
Merci aussi lermitte
Bonjour
Le calcul d'expiration de la requête n'a pas d'importance en soi
Moi j'avais biaisé pour ne pas attendre 15 minutes
C'est tout
J'ai "bricolé" ce programme juste pour voir, je ne sais pas si c'est la meilleure solution
Effectivement ca marche tout aussi bien en mettant ma formule d'expiration dans la colonne F.
Merci pour le temps consacré ca a l'air de marcher parfaitement
Comprend pas... ? tu à bien les bons résultats ?
Remarque : tu reviendra... ton classeur va finir par se planter.
lermite a écrit :Bonjour,
Salut Banzaï, j'ai repris ton classeur,
les 20 Mo de l'original m'ont refroidi Avant de se pencher sur l'actualisation des données (pour lequel tu t'y prend très mal) y faudrait d'abord avoir un rapatriement valide, ce qui n'est pas le cas
Sur YT : Ticker = "USDJPY=X" --> 81.350
sur sheet3 : 813500 ->> formatter ->> 813.500
sur Sheet1 : 813500 ->> et avec ton format cellule 813500,00000
J'ai tout essayé (du moins ce que je connais) et je n'ai pas réussi à avoir les données valide, peut-être Banzaï ?
Concernant tes timer, laisse tomber ce n'est pas un problème mais ont verras ça après.
A+.
Les marchés sont fermé le weekend c'est peut etre pour ca que tu n'as pas des données valide ?
Apres si c'est juste un probleme de formatage des données je saurais résoudre
Cependant si tu as des améliorations du dernier code fournit par banzai qui est de tout de meme excellent, n'hésites pas a le post a la suite.
PS: J'aimerais toujours savoir pourquoi mon excel fait 20mo + :/ C'est ennuyant pour poster la version final au cas ou ca intéresserait quelqu'un.
lermite a écrit :Comprend pas... ? tu à bien les bons résultats ?
Remarque : tu reviendra... ton classeur va finir par se planter.
Pourquoi le classeur finira par planter ?
lermite a écrit :Bonjour,
Salut Banzaï, j'ai repris ton classeur,
les 20 Mo de l'original m'ont refroidi
C'est pour ça qu'il finira par planter, l'exemple que tu à copier est aussi fait en dépit du bon sens.
lermite a écrit :Avant de se pencher sur l'actualisation des données (pour lequel tu t'y prend très mal) y faudrait d'abord avoir un rapatriement valide, ce qui n'est pas le cas
Sur YT : Ticker = "USDJPY=X" --> 81.350
sur sheet3 : 813500 ->> formatter ->> 813.500
sur Sheet1 : 813500 ->> et avec ton format cellule 813500,00000
J'ai tout essayé (du moins ce que je connais) et je n'ai pas réussi à avoir les données valide, peut-être Banzaï ?
Rien à voir avec le WE, les données sont bien sur YT.
lermite a écrit :Concernant tes timer, laisse tomber ce n'est pas un problème mais ont verras ça après.
A+.
Confirmation, ont verra ça si les données en retour sont bonnes, sinon... ça vaut pas la peine.
A+
EDIT:
Concernant l'exemple que tu à copier est aussi fait en dépit du bon sens.
Banzaï à déjà dû modifier c'est évènement.
Private Sub Worksheet_Change(ByVal Target As Range)pour qu'il ressemble à quelque chose.
Demande lui confirmation .
Re,
J'ai résolu le problème du format des données.
Le fait que tu ai des noms de feuilles comme Sheet1 m'a finalement fait comprendre
Je peu donc me pencher sur le rapatriement en temps réel des données dont tu a besoin, je te tient au courant.
A+
Merci lermitte du temps que tu consacre a mon projet
waww merci beaucoup lermitte