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 Cela fait 3 jours que je suis sur ce projet, c'est mon premier code VB.

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 et Merci beaucoup d'avance. Si je n'ai pas été clair n'hésiter pas a me poser des questions.

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 Sub

Bonjour

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.

Bonjour

A tester

Je travaille un peu à l'aveuglette

Vraiment très très bien merci beaucoup. Deja le faite que ca ne switch pas sur la 2eme page a chaque calcule de C et G est agréable.

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

Voilà une nouvelle version à tester

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+.

Merci beaucoup Banzaï C'est quasiment parfait.

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 En effet lorsqu'on mise sur une valeur, celle ci expire dans le prochain quart d'heure (valeur 1440) (ou 30 min ou 1h, 1j,etc). Effectivement les mises expirent a heures fixes.

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

Re,

Vaut mieux tard que jamais ,il m'a fallu un certain temps pour mettre tout en musique.

Comme la solution que j'en ai tirer ne ressemble en rien à ton approche j'ai fait un tuto et une appli.

Le tuto

L'appli

A+

waww merci beaucoup lermitte Et un tuto en plus !

Rechercher des sujets similaires à "lancer timers memoriser leurs emplacements"