Programmer un timer complexe

Résolu
Bonjour,
j ai un problème à solutionner sur un programme qui ne me satisfait pas entièrement(attention la programmation n('est pas du tout mon métier,mais j ai souvent de bonnes idées qu'il est facile ou pas pour quelqu 'un de la profession à mettre en place)

Surtout ne pas se prendre la tete le problème est très complexe donc il faut y aller cool et avec bonne humeur....
C'est parti si vous ne comprenez pas n hésitez pas à me demander plus de détail

j ai un classeur que l on nommera A, ce classeur, dès son ouverture appelle 2 autres classeurs B et C, dans lesquels sont enregistres des programmes différents ,qui s appliquent au classeur A
Ce sont deux timers qui me collent des cotations a intervalles réguliers
pour un il colle toutes les minutes a partir de 09:00:00 et jusqu a 09:30:00
pour l autre toutes les 15 mn a partir de 09:15 jusqu a 17:45:00 ces cotations sont inscrites dans le Classeur A en colonne A de A12 :A131
les cotations dans cette plage sont tires directement des plages AU12:AU51 (qui sont le dernier cours enregistré)
puis de AV12:AV51 (qui sont les plus Haut de séance)
puis de AW12:AW51( qui sont les plus Bas de séance) les cotations dans ces 3 plages sont inscrites en temps réel par un logiciel d'importation de liens DDE(Data Dynamic Exchange) , ces cotations boursieres s'inscrivent dans Excel en Streaming en vrai temps réel
mon problème est le suivant , lorsque le marche financier ouvre a 09:00:00 les cotations s'inscrivent dans mon classeur A des 09:01:00 dans un emplacement bien défini de telle façon que je puisse analyser a quelle heure sont les PH et PB de séance
Mon soucis est que certains jours il y a des mouvements de panique à l ouverture et de nombreux traders vendent ou achètent en quantité en même temps empêchant le cours d'ouverture d’être fixé dans la premier minute les mouvements et transactions étant trop important certains jours il arrive que sur certaines valeurs le cours d'ouverture ne soit fixé que 2 a 4 voir 5 mn après l’ouverture de la séance qui est à (09:00:00), entraînant ainsi une erreur sur mon classeur A ,puisque mon Timer commence a coller les cotations a partir de 09:01:00 ce qui est généralement suffisant pour que le cours d'ouverture soit fixé dans cette première minute ;par contre si certaines valeurs sont a la traîne les cotations qui seront colles ne refléteront pas la réalité puisque ce sont des cotations pas encore totalement fixé elles vont s’inscrirent tout de même et faussent ainsi les résultats
Pour bien aller il faudrait que le Timer commence a coller chaque valeur séparément, seulement lorsque le prix d'ouverture est fixée ;le seul moyen pour cela est que le timer prenne en compte le fait que des que les PB et PH changent(par rapport a la veille) dans les plages AV12:AV51 et AW12:AW51 c'est a dire à des 09:00:00 jusqu au moment exact ou il y a constat que les chiffres ont changé ,seulement a ce moment la les cotations pourront commencés à être collé
le soucis est que si on fait un programme qui enclenche le collage des cotations des que les PB et PH ont changé , comment faire pour que les cotations s'inscrivent en face des heures sur mon classeur Pour comprendre il faut savoir que les cotations de la colonne A se collent ainsi dans la feuille
en colonne NR12:NR131 pour celles de 09:00:00 en NS12:NS131 pour celles 09:01:00;en NT12:NT131 pour 09:02:00 :etc jusque a la colonne QF12:QF131 pour les cotations de 17:45:00
Je vous précise que sur la ligne 11 et a partir de NR11 sont inscrits les repaires des heures
Cellule NR11 (09:00:00) Cellule NS11(09:01:00) cellule NT11(09:02:00) jusqua QF11(17:45:00)

Ce système me permet avec les formules MAX et Mini et EQUIVALENCE de savoir sur chaque valeur les heures et minutes des plus haut et plus bas en séance.
pour le moment je n ai pas d autres solutions que de sélectionner mes lignes Max et Mini a partir de la troisième minute (pour me laisser une marge) il arrive parfois que quelques valeurs ne sont pas encore fixé même après ces 3 minutes
je vous met les différents code d appel des classeurs ainsi que les timers pour que vous ayez déjà une idée de la complexité du problème après je pourrais éventuellement vous fournir les classeurs en partie

Sub Auto_open()
Windows("Trade .xlsm").Activate
Application.ScreenUpdating = False
For i = 12 To 134
Rows(i).Select
'Range("NR" & i & ":QF" & i).ClearContents
Next

Application.ScreenUpdating = True
Application.ScreenUpdating = False
Chemin = "C:\Users\Public\Documents\Bourse jo" 'mettez ici le chemin ou se trouve vos fichiers"
Workbooks.Open Filename:=Chemin & "\CotationParMinuteTrade.xlsm"
Workbooks.Open Filename:=Chemin & "\CotationAu Quart-dheureTrade.xlsm"
Windows("Trade .xlsm").Activate
End Sub

VBA project(cotationsParMinutetrade.xlsm)

Option Explicit

Private Sub Workbook_Open()
Dim i As Long
For i = 12 To 134
Rows(i).Select
Range("NR" & i & ":PC" & i).ClearContents
Next
c = 382
T1 = 1
Tempo1 = 1 / 24 / 60
TempsInitial1 = "09:00:00" '= heure de démarrage
TempsInitial1Num = Format(TempsInitial1, "0.00000")
Application.OnTime TimeValue(TempsInitial1), Procedure:="RecupCotation1" '"09:00:00"
End Sub

Private Sub Workbook_BeforeClose(Cancel As Boolean)
ArretCotation1
End Sub

Public Durée1 As Date
Public c As Long
Public TempsInitial1 As Date
Public TempsInitial1Num As Double
Public T1
Public Tempo1

Sub RecupCotation1()
If T1 >= 60 Then T1 = 0 '60
Durée1 = Format(TempsInitial1Num + (T1 * Tempo1), "hh:mm:ss")
Application.OnTime Durée1, "RecupCotation1"
Range(Cells(12, c), Cells(134, c)) = Range("A12:A134").Value
Application.Wait Now + TimeValue("00:00:01")
TempsInitial1Num = TempsInitial1Num + Tempo1
If c >= 413 Then ArretCotation1 'N° de la dernière colonne des cotations à la minute
c = c + 1
End Sub
Sub ArretCotation1()
On Error Resume Next
Application.OnTime Durée1, "RecupCotation1", , False
End Sub

VBAPoject(CotationAu Quart-dheureTrade.xlsm)

Option Explicit

Private Sub Workbook_Open()
Dim i As Long
For i = 12 To 134
Range(Cells(i, 413), Cells(i, 448)).ClearContents
Next i
d = 413
T2 = 1
Tempo2 = 15 / 24 / 60
TempsInitial2 = "09:00:00" '= heure de démarrage - 1 intervalle de temps entre 2 relevés"
TempsInitial2Num = Format(TempsInitial2, "0.00000")
PremierPassage2 = True
Application.OnTime TimeValue(TempsInitial2), Procedure:="RecupCotation2" '"09:15:00"
End Sub

Private Sub Workbook_BeforeClose(Cancel As Boolean)
ArretCotation2
End Sub

Public Durée2 As Date
Public d As Long
Public TempsInitial2 As Date
Public TempsInitial2Num As Double
Public T2
Public Tempo2
Public Bascule2 As Date
Public PremierPassage2 As Boolean

Sub RecupCotation2()
If T2 >= 4 Then
T2 = 0
TempsInitial2 = TempsInitial2 + "01:00:00"
TempsInitial2Num = Format(TempsInitial2, "0.00000")
End If
Durée2 = Format(TempsInitial2Num + (T2 * Tempo2), "hh:mm:ss")
T2 = T2 + 1
Application.OnTime Durée2, "RecupCotation2"
Range(Cells(12, d), Cells(134, d)) = Range("A12:A134").Value
Application.Wait Now + TimeValue("00:00:01")
If d >= 449 Then ArretCotation2 'N° de la première colonne vide (ou dernière colonne de la cotation au quart d'heure)
d = d + 1
End Sub
Sub ArretCotation2()
On Error Resume Next
Application.OnTime Durée2, "RecupCotation2", , False
End Sub

Merci d'essayer, même si le résultat n 'est pas au bout, les idées vont venir petit à petit comme dab,et au final on trouve toujours une solution

Bonne journée à tous

57 réponses

Résumé de la discussion

Le fonctionnement décrit repose sur un classeur principal A et deux classeurs annexes B et C, qui alimentent des cotations en streaming via DDE à intervalles réguliers (toutes les minutes de 09:00 à 09:30 et toutes les 15 minutes de 09:15 à 17:45), les valeurs étant insérées dans A12:A134 à partir des plages AU12:AU51 (dernier cours), AV12:AV51 (plus haut) et AW12:AW51 (plus bas). Le problème survient lorsque l’ouverture de marché n’est pas fixée dans la première minute en période de panique, ce qui fait que les cotations collées à partir de 09:01 reflètent pas nécessairement le véritable opening et faussent les résultats. L’objectif est donc que le collage ne s’enclenche que lorsque le prix d’ouverture est fixé, soit lorsque les PB et PH, ou les extrema AV/AW par rapport à la veille, changent à partir de 09:00:00 jusqu’au moment où ce changement est constaté, afin d’aligner les cotations avec les heures indiquées en NR11:NS11NT11…QF11. Actuellement, la solution de contournement consiste à sélectionner les lignes Max/Mini à partir de la troisième minute, mais cela demeure insuffisant lorsque certaines valeurs restent non fixées, d’où la recherche d’une approche fiable pour déclencher le collage en face des heures exactes.

Bobot (l’IA à votre service)
  1. en fait toute la logique la plus intéressante sera hors web
    sur un disque dur externe
    a moins de me mettre un pistolet sous la tempe pour me piquer ma solution je ne vois pas comment le commun des mortels pourra avoir accès a ma logique
    NON...?????
    1. Contributeur
      A la réflexion, je pense qu'il serait bien d'avoir un fichier qui fait tout ce qui est automatique, et un autre dans lequel tu travailles.
      Le fichier "automatique" inclurait:
      - le timer
      - un onglet DDE par marché
      - un onglet sans DDE par marché
      Le fichier de travail aurait tout le reste, y inclus:
      - un onglet par marché, qui irait récupérer des données (via liens ou via code VBA) dans les onglets non DDE de l'autre fichier

      Je pense que cela évitera que le timer et tes activités rentrent en conflit.
      (A Suivre, peut-être, dans d'autres messages)
      1. Bonjour
        En fait ce que tu me dits est exactement ce que je suis entrain de faire depuis un moment (mais je ne t en ai pas parlé parce que j avais peur que tu me dises que c’était stupide)
        je te rappelle que ce n 'est pas mon metier , je ne fait que découvrir les choses a mesure que tu me les montre

        le timer ne fonctionnera qu'avec les dde ,et toute ma logique de statistique et tout le reste est a part sans dde
        lorsque je ferais le site web ,le timer tournera seul avec les quatres feuilles hors Web et ne sera consacré que uniquement aux collages des cotations
        En fin de journée le relevé des cotations du timer sera reporte en mode valeur sur le même fichier que le timer mais avec toute mes feuilles de statistiques en plus;'ces feuilles la n 'ont, n'ont pas besoin de dde
        lorsque j aurais tout rapporte sur ce fichier sans DDE alors j enverrai la partie statistique en mode valeur sur le Web
        je suis entrain de faire actuellement un fichier pour le WEb avec quatre graphes sur le Model du Timer mais sans Timer de cette manière personne ne pourra me cracker ma solution finale
        c'est assez difficile a comprendre mais je suis certain que tu as déjà compris
    2. je sais que je suis casse pied mais si tu me trouvais un code qui me change la formule dans mes graphes je gagnerais un temps de fou ;et je pourrais me passer de la macro que tu m 'as faites l autre jour (qui a servi à passer de PH:PR à PH:CLV mon graphe ne bougerait pas de place et j e n 'aurais pas a construire un deuxieme Ex je passerais de BC BC13 B14...etc a
      BC55 BC56 BC
      de BG12 BG13..;..à BG55 BG56...etc
      de BH12BH13BH14... à BH55 BH56 BH57..etc
      je sais que tu sais faire
      ca avec un simple bouton sur le bas du graphe et un retour
      1. Contributeur
        ouvre une nouvelle question dans le forum pour chaque point précis que tu demandes.
      2. tu as sans doute raison mais je n ai pas assez d’expérience pour me rendre compte de mes erreurs je crois que le Timer seul que tu as faits doit marcher cela ne vient peut être pas du code
        je t'explique
        ce matin je me suis apercu que le logiciekl DDE de cette boite ne prenait pas plus de 50 dde en compte dans un fichier donc tu es oblige de faire une liste supplémentaire pour avoir plusieurs marchés et encore tu ne peux pas les faire fonctionner ensemble il te faut passer dune fenetre a l 'autre
        cela je ne le savais pas
        je m en suis aperçu parceque la procédure de collage que tu faits de D12:H51 ne se faisait plus
        t j ai compris apres que elle ne pouvait pas se faire parce que les liens dde n etaient pas activées sur la feuille quij s’était ouverte au démarrage
        si le soir j ai fermé sur la quatrième feuille et que le matin j ouvre mon DDE en allant sur la feuille cac 40 le dde lui va aller sur la feuille qui a été enregistre la dernière le soir
        tu te retrouves donc avec la procedure de collage sur la 4 eme feuille et quand le marche demarre la procedure des ok ne peut pas se faire puisqu il n y a pas eu de collage
        non seulement ca mais tu crois etre sur la bonne fenetre alors que tes dde sont activées b sur la 4 e me feuille donc quand tu comprends c'est trop tard le marche a démarré tu es oblige de réactiver la bonne liste que tu veux voir marcher mais ton système lui n 'a pas pu démarrer
        si j avais une api a la place de ce logiciel je suis sur que l on aurait pas tous ces problemes la preuve c'est que ca fonctionnait avant quand on avait qu un seul marché donc il faut peut être se concentrer sur le cac 40 pour le moment en attendant que je trouve un logiciel qui n'est pas limité de toute facon si tu es sur de tes codes ,il y a bien une explication parce que moi j ai tout remis dans l ordre que tu m 'as decrits
      3. Voila j ai trouvé l explication il suffit que tu me dises comment inscrire les trois autres feuilles a la suite
        a cela s ajoutait le problème des dde(il faut que je prenne un autre logiciel
        c'est pour cela que un seul marché collait la procédure était impossible a faire marcher

        Private Sub Workbook_BeforeClose(Cancel As Boolean)
        copy_dh
        End Sub
        Private Sub copy_dh()
        Dim sh As Worksheet
        Set sh = Sheets("CAC40") "comment mettre les 3 feuilles manquantes"
        sh.Range("D12:H51").Value = sh.Range("AS12:AW51").Value
        sh.Range("C12:C51").ClearContents
        sh.Range("C11") = Now
        End Sub
      4. Contributeur
        @chrisnapoliouvre une nouvelle question dans le forum pour chaque point précis que tu demandes.
        je ne peux pas t'aider si on discute de tout en même temps.
    3. bonjour
      Je comprend pas ce que tu veux me dire
      alors je te mets les codes que j ai dans timer seul et dans l autre fichier
      dans TIMER SEUL j ai:

      workbook

      Option Explicit
      Sub RecupCotation()
      Dim cl As Workbook
      Set cl = Workbooks("TIMER SEUL")
      Durée = Now + TimeValue("00:01:00") ' A remplacer par "00:01:00"
      Application.OnTime Durée, "RecupCotation"
      'CAC40, AEX, BEL20, PSI20
      Call copycr(cl, "CAC40")
      Call copycr(cl, "AEX")
      Call copycr(cl, "BEL20")
      Call copycr(cl, "PSI20")
      c = c + 1
      If c >= 908 Then ArretCotation 'N° de la dernière colonne
      End Sub

      Private Sub copycr(cl As Workbook, fl As String)
      Dim sh As Worksheet
      Set sh = cl.Sheets(fl)
      sh.Range(sh.Cells(12, c), sh.Cells(131, c)) = sh.Range("A12:A131").Value
      End Sub
      puis dans module 1

      Option Explicit
      Public Durée As Date
      Public c

      Sub RecupCotation()
      Durée = Now + TimeValue("00:01:00") ' A remplacer par "00:01:00"
      Application.OnTime Durée, "RecupCotation"
      Range(Cells(12, c), Cells(131, c)) = Range("A12:A131").Value
      c = c + 1
      If c >= 908 Then ArretCotation 'N° de la dernière colonne
      End Sub

      Sub ArretCotation()
      On Error Resume Next
      Application.OnTime Durée, "RecupCotation", , False
      End Sub

      Public Durée1 As Date
      Public c As Long
      Public TempsInitial1 As Date
      Public TempsInitial1Num As Double
      Public T1
      Public Tempo1

      Sub RecupCotation1()
      If T1 >= 60 Then T1 = 0 '60
      Durée1 = Format(TempsInitial1Num + (T1 * Tempo1), "hh:mm:ss")
      Application.OnTime Durée1, "RecupCotation1"
      Range(Cells(12, c), Cells(131, c)) = Range("A12:A131").Value
      Dim l As Long
      For l = 12 To 51
      If Cells(l, "C").Value <> "ok" Then
      If Cells(l, "D").Value <> Cells(l, "AS").Value _
      Or Cells(l, "E").Value <> Cells(l, "AT").Value _
      Or Cells(l, "F").Value <> Cells(l, "AU").Value _
      Or Cells(l, "G").Value <> Cells(l, "AV").Value _
      Or Cells(l, "H").Value <> Cells(l, "AW").Value Then
      Cells(l, "C").Value = "ok"
      Else
      Cells(l, c).ClearContents
      Cells(l + 40, c).ClearContents
      Cells(l + 80, c).ClearContents
      End If
      End If
      Next l
      Application.Wait Now + TimeValue("00:00:01")
      TempsInitial1Num = TempsInitial1Num + Tempo1
      If c >= 908 Then ArretCotation1 'N° de la dernière colonne des cotations à la minute
      c = c + 1
      End Sub
      Sub ArretCotation1()
      On Error Resume Next
      Application.OnTime Durée1, "RecupCotation1", , False
      End Sub

      dans CAC 40 19 Avril et AEX 19 Avril et BEL20 19 Avril et PSI20 19 Avril
      20 j'ai:
      Workbook

      Option Explicit

      Private Sub Workbook_Open()
      Sheets("statist").Select
      c = 383
      Application.OnTime TimeValue("09:01:00"), Procedure:="RecupCotation" '"09:01:00"
      Range("NR12:AHW131").ClearContents
      End Sub

      Private Sub Workbook_BeforeClose(Cancel As Boolean)
      copy_dh
      End Sub
      Private Sub copy_dh()
      Dim sh As Worksheet
      Set sh = Sheets("statist")
      sh.Range("D12:H51").Value = sh.Range("AS12:AW51").Value
      sh.Range("C12:C51").ClearContents
      sh.Range("C11") = Now
      End Sub

      puis module 1

      Option Explicit
      Public Durée As Date
      Public c

      Sub RecupCotation()
      Durée = Now + TimeValue("00:01:00") ' A remplacer par "00:01:00"
      Application.OnTime Durée, "RecupCotation"
      Range(Cells(12, c), Cells(131, c)) = Range("A12:A131").Value
      c = c + 1
      If c >= 908 Then ArretCotation 'N° de la dernière colonne
      End Sub

      Sub ArretCotation()
      On Error Resume Next
      Application.OnTime Durée, "RecupCotation", , False
      End Sub

      Public Durée1 As Date
      Public c As Long
      Public TempsInitial1 As Date
      Public TempsInitial1Num As Double
      Public T1
      Public Tempo1

      Sub RecupCotation1()
      If T1 >= 60 Then T1 = 0 '60
      Durée1 = Format(TempsInitial1Num + (T1 * Tempo1), "hh:mm:ss")
      Application.OnTime Durée1, "RecupCotation1"
      Range(Cells(12, c), Cells(131, c)) = Range("A12:A131").Value
      Dim l As Long
      For l = 12 To 51
      If Cells(l, "C").Value <> "ok" Then
      If Cells(l, "D").Value <> Cells(l, "AS").Value _
      Or Cells(l, "E").Value <> Cells(l, "AT").Value _
      Or Cells(l, "F").Value <> Cells(l, "AU").Value _
      Or Cells(l, "G").Value <> Cells(l, "AV").Value _
      Or Cells(l, "H").Value <> Cells(l, "AW").Value Then
      Cells(l, "C").Value = "ok"
      Else
      Cells(l, c).ClearContents
      Cells(l + 40, c).ClearContents
      Cells(l + 80, c).ClearContents
      End If
      End If
      Next l
      Application.Wait Now + TimeValue("00:00:01")
      TempsInitial1Num = TempsInitial1Num + Tempo1
      If c >= 908 Then ArretCotation1 'N° de la dernière colonne des cotations à la minute
      c = c + 1
      End Sub
      Sub ArretCotation1()
      On Error Resume Next
      Application.OnTime Durée1, "RecupCotation1", , False
      End Sub

      je sais plus ou j en suis ca veut dire quoi option explicit faut il le mettre a toutes les macros du fichier????
      1. Contributeur
        il faut toujours mettre
        option explicit
        en début de chaque module.
      2. Contributeur
        eh bien, cela fait une belle soupe, heureusement que tu n'es pas cuisinier!
        tu as un timer dans chacun de tes fichiers. je préfère ne pas essayer d'imaginer ce que cela donne si les deux travaillent ensemble.
        comment utilises-tu ces deux fichiers? les deux sont-ils ouverts en permanence?
        vois-tu encore parfois des "OK"? il me semble que toute cette logique n'est plus utilisée.
      3. le Timer seul me sert lorsque je veux enregistre les cotations et que je travaille sur l autre fichier l les quatres autres fichiers peuvent travailler si h je veux avec le timer comme cetait prevu au depart tout ca parceque si je monte mon site web je vais faire tourner sur un ordi le timer seul
        le soir je collerais le résultat en mode valeur sur chacun des autres fichiers et je pourrais également me servir des autres fichiers si je veux sans timer la journée ou avec Timer selon mes désirs(je vais voir par la suite si avec un ordi puissant et beaucoup de ram je peux faire fonctionner sans avoir de retard le timer et mes graphes temps réel pour le moment j ai trouve cette solution et c'est impeccable ,il suffit que tu me remettes tout en ordre
        en fait il faut que tu comprennes que j ai dissocié les fichiers parce que il y a des journées ou je ne peux pas travailler sur les fichiers si le timer tourne sinon en fin d journée j ai un décalage énorme
        depuis que tu m 'as fait le code pour les quatres feuilles dans le meme fichier Timer SEUL je n 'ai aucun soucis de retard parcequ il n y a pas dans Timer seul les graphes qui tournent en même temps en temps réel
        maintenant comme tu dits je pense qu il ya du menage a faire
        mon problème est que je sais structurer les choses l mais je ne connais pas le langage alors des fois ça me pose de gros problèmes parceque je comprends pas ce que tu écrits en code je ne fait qu e deviner par déduction tu me dits âr exemp^le de mettre option explicit avant toutes mes macros mais je ne sais même pas pourquoi je le mets..... en fait pour le moment je tourne avec plusieurs fichiers mais c'est évident que si je pouvais avoir tout sur le même ce serait bien mais je n y crois pas trop pour l instant je n ai pas de machines assez puissantes j ai un core I5 avec 8 gigas
      4. Contributeur
        @chrisnapolije pense que ce n'est pas un problème de puissance de l'ordi.
      5. je sais pas
        mais ce qui est sur c'est que a mesure qu on a charge excel les temps de réponse n ont plus ete les mêmes
        moi j aimerais bien pouvoir tout mettre sur le même fichier mais j ai lu quelque part que excel avait des limites de mémoire surtout en version 32 bits et je suis sur une version 32
        tu crois que ca vient d'ou alors???;;; si tu veux je remets tout comme au depart je conserve tout de meme mon Timer seul en cas de probleme et je remets tout dun bloc avec mes graphes qui tournent en temps reel
        je vais avoir au total 4 graphes qui vont tourner sur ce même fichier si je mets tout comme au départ
        je ferais comme tu me dits
    4. Bonjour
      ce matin j ai fait l 'essai et il n ya aucune cotation qui se colle sur aucune des 4 feuilles???? je sais pas ou j ai fait une erreur
      1. comme ca dans module 1 et comme ca dans workbook..??????

        Option Explicit
        Public Durée As Date
        Public c

        Sub RecupCotation()
        Durée = Now + TimeValue("00:01:00") ' A remplacer par "00:01:00"
        Application.OnTime Durée, "RecupCotation"
        Range(Cells(12, c), Cells(131, c)) = Range("A12:A131").Value
        c = c + 1
        If c >= 908 Then ArretCotation 'N° de la dernière colonne
        End Sub

        Sub ArretCotation()
        On Error Resume Next
        Application.OnTime Durée, "RecupCotation", , False
        End Sub

        Public Durée1 As Date
        Public c As Long
        Public TempsInitial1 As Date
        Public TempsInitial1Num As Double
        Public T1
        Public Tempo1

        Sub RecupCotation1()
        If T1 >= 60 Then T1 = 0 '60
        Durée1 = Format(TempsInitial1Num + (T1 * Tempo1), "hh:mm:ss")
        Application.OnTime Durée1, "RecupCotation1"
        Range(Cells(12, c), Cells(131, c)) = Range("A12:A131").Value
        Dim l As Long
        For l = 12 To 51
        If Cells(l, "C").Value <> "ok" Then
        If Cells(l, "D").Value <> Cells(l, "AS").Value _
        Or Cells(l, "E").Value <> Cells(l, "AT").Value _
        Or Cells(l, "F").Value <> Cells(l, "AU").Value _
        Or Cells(l, "G").Value <> Cells(l, "AV").Value _
        Or Cells(l, "H").Value <> Cells(l, "AW").Value Then
        Cells(l, "C").Value = "ok"
        Else
        Cells(l, c).ClearContents
        Cells(l + 40, c).ClearContents
        Cells(l + 80, c).ClearContents
        End If
        End If
        Next l
        Application.Wait Now + TimeValue("00:00:01")
        TempsInitial1Num = TempsInitial1Num + Tempo1
        If c >= 908 Then ArretCotation1 'N° de la dernière colonne des cotations à la minute
        c = c + 1
        End Sub
        Sub ArretCotation1()
        On Error Resume Next
        Application.OnTime Durée1, "RecupCotation1", , False
        End Sub

        comme ca dans workbook?????

        Option Explicit
        Sub RecupCotation()
        Dim cl As Workbook
        Set cl = Workbooks("TIMER SEUL")
        Durée = Now + TimeValue("00:01:00") ' A remplacer par "00:01:00"
        Application.OnTime Durée, "RecupCotation"
        'CAC40, AEX, BEL20, PSI20
        Call copycr(cl, "CAC40")
        Call copycr(cl, "AEX")
        Call copycr(cl, "BEL20")
        Call copycr(cl, "PSI20")
        c = c + 1
        If c >= 908 Then ArretCotation 'N° de la dernière colonne
        End Sub

        Private Sub copycr(cl As Workbook, fl As String)
        Dim sh As Worksheet
        Set sh = cl.Sheets(fl)
        sh.Range(sh.Cells(12, c), sh.Cells(131, c)) = sh.Range("A12:A131").Value
        End Sub
        1. Contributeur
          si je vois bien, il y a a deux fonctions RecupCotation(), plus une RecupCotation1() .
          cela en fait deux de trop.
          comme tu as deux classeurs, précise le nom du classeur à chaque fois que tu partages du contenu.
      2. je ne mets plus alors option explicit et je met tout ca dans le workbook directement????
        1. Contributeur
          il faut toujours mettre
          option explicit
          en début de chaque module.
          tu as deux classeurs, nous communiquerions plus efficacement si tu en donnais les noms à chaque fois que tu partages du contenu.
          le code que je t'ai envoyé en #190 doit remplacer tout le code qui commence par
          Sub RecupCotation()
          jusqu'au
          End Sub
          qui suit
      3. voila moi j ai ces 2 codes dans mon timer seul dans le workbook j ai

        Option Explicit

        Private Sub Workbook_Open()
        Call clearc("CAC40")
        Call clearc("AEX")
        Call clearc("BEL20")
        Call clearc("PSI20")
        c = 383
        Application.OnTime TimeValue("09:01:00"), Procedure:="RecupCotation" '"09:01:00"
        End Sub

        Private Sub clearc(fl As String)
        Dim sh As Worksheet
        Set sh = Sheets(fl)
        sh.Range("NR12:AHW131").ClearContents
        End Sub

        Private Sub Workbook_BeforeClose(Cancel As Boolean)
        Call copy_dh("CAC40")
        Call copy_dh("AEX")
        Call copy_dh("BEL20")
        Call copy_dh("PSI20")
        End Sub

        Private Sub copy_dh(fl As String)
        Dim sh As Worksheet
        Set sh = Sheets(fl)
        sh.Range("D12:H51").Value = sh.Range("AS12:AW51").Value
        sh.Range("C12:C51").ClearContents
        sh.Range("C11") = Now
        End Sub

        dans le module 1 j 'ai

        Public Durée As Date
        Public c

        Sub RecupCotation()
        Durée = Now + TimeValue("00:01:00") ' A remplacer par "00:01:00"
        Application.OnTime Durée, "RecupCotation"
        Range(Cells(12, c), Cells(131, c)) = Range("A12:A131").Value
        c = c + 1
        If c >= 908 Then ArretCotation 'N° de la dernière colonne
        End Sub

        Sub ArretCotation()
        On Error Resume Next
        Application.OnTime Durée, "RecupCotation", , False
        End Sub

        Public Durée1 As Date
        Public c As Long
        Public TempsInitial1 As Date
        Public TempsInitial1Num As Double
        Public T1
        Public Tempo1

        Sub RecupCotation1()
        If T1 >= 60 Then T1 = 0 '60
        Durée1 = Format(TempsInitial1Num + (T1 * Tempo1), "hh:mm:ss")
        Application.OnTime Durée1, "RecupCotation1"
        Range(Cells(12, c), Cells(131, c)) = Range("A12:A131").Value
        Dim l As Long
        For l = 12 To 51
        If Cells(l, "C").Value <> "ok" Then
        If Cells(l, "D").Value <> Cells(l, "AS").Value _
        Or Cells(l, "E").Value <> Cells(l, "AT").Value _
        Or Cells(l, "F").Value <> Cells(l, "AU").Value _
        Or Cells(l, "G").Value <> Cells(l, "AV").Value _
        Or Cells(l, "H").Value <> Cells(l, "AW").Value Then
        Cells(l, "C").Value = "ok"
        Else
        Cells(l, c).ClearContents
        Cells(l + 40, c).ClearContents
        Cells(l + 80, c).ClearContents
        End If
        End If
        Next l
        Application.Wait Now + TimeValue("00:00:01")
        TempsInitial1Num = TempsInitial1Num + Tempo1
        If c >= 908 Then ArretCotation1 'N° de la dernière colonne des cotations à la minute
        c = c + 1
        End Sub
        Sub ArretCotation1()
        On Error Resume Next
        Application.OnTime Durée1, "RecupCotation1", , False
        End Sub

        donc tu veux que j ai ceci a la place dans le workbook

        Sub RecupCotation()
        Dim cl As Workbook
        Set cl = Workbooks("TIMER SEUL")
        Durée = Now + TimeValue("00:01:00") ' A remplacer par "00:01:00"
        Application.OnTime Durée, "RecupCotation"
        'CAC40, AEX, BEL20, PSI20
        Call copycr(cl, "CAC40")
        Call copycr(cl, "AEX")
        Call copycr(cl, "BEL20")
        Call copycr(cl, "PSI20")
        c = c + 1
        If c >= 908 Then ArretCotation 'N° de la dernière colonne
        End Sub

        Private Sub copycr(cl As Workbook, fl As String)
        Dim sh As Worksheet
        Set sh = cl.Sheets(fl)
        sh.Range(sh.Cells(12, c), sh.Cells(91, c)) = sh.Range("A12:A131").Value
        End Sub
        1. tu veux dire celui la que j ai inscrit en module 1

          Public Durée As Date
          Public c

          Sub RecupCotation()
          Durée = Now + TimeValue("00:01:00") ' A remplacer par "00:01:00"
          Application.OnTime Durée, "RecupCotation"
          Range(Cells(12, c), Cells(131, c)) = Range("A12:A131").Value
          c = c + 1
          If c >= 908 Then ArretCotation 'N° de la dernière colonne
          End Sub

          Sub ArretCotation()
          On Error Resume Next
          Application.OnTime Durée, "RecupCotation", , False
          End Sub

          Public Durée1 As Date
          Public c As Long
          Public TempsInitial1 As Date
          Public TempsInitial1Num As Double
          Public T1
          Public Tempo1

          Sub RecupCotation1()
          If T1 >= 60 Then T1 = 0 '60
          Durée1 = Format(TempsInitial1Num + (T1 * Tempo1), "hh:mm:ss")
          Application.OnTime Durée1, "RecupCotation1"
          Range(Cells(12, c), Cells(131, c)) = Range("A12:A131").Value
          Dim l As Long
          For l = 12 To 51
          If Cells(l, "C").Value <> "ok" Then
          If Cells(l, "D").Value <> Cells(l, "AS").Value _
          Or Cells(l, "E").Value <> Cells(l, "AT").Value _
          Or Cells(l, "F").Value <> Cells(l, "AU").Value _
          Or Cells(l, "G").Value <> Cells(l, "AV").Value _
          Or Cells(l, "H").Value <> Cells(l, "AW").Value Then
          Cells(l, "C").Value = "ok"
          Else
          Cells(l, c).ClearContents
          Cells(l + 40, c).ClearContents
          Cells(l + 80, c).ClearContents
          End If
          End If
          Next l
          Application.Wait Now + TimeValue("00:00:01")
          TempsInitial1Num = TempsInitial1Num + Tempo1
          If c >= 908 Then ArretCotation1 'N° de la dernière colonne des cotations à la minute
          c = c + 1
          End Sub
          Sub ArretCotation1()
          On Error Resume Next
          Application.OnTime Durée1, "RecupCotation1", , False
          End Sub
          1. Bonsoir
            celui la tu veux dire ou celui que tu as faits pour les 4 feuilles

            Option Explicit

            Private Sub Workbook_Open()
            Sheets("statist").Select
            c = 383
            Application.OnTime TimeValue("09:01:00"), Procedure:="RecupCotation" '"09:01:00"
            Range("NR12:AHW131").ClearContents
            End Sub

            Private Sub Workbook_BeforeClose(Cancel As Boolean)
            copy_dh
            End Sub
            Private Sub copy_dh()
            Dim sh As Worksheet
            Set sh = Sheets("statist")
            sh.Range("D12:H51").Value = sh.Range("AS12:AW51").Value
            sh.Range("C12:C51").ClearContents
            sh.Range("C11") = Now
            End Sub

            ou celui ci

            Option Explicit

            Private Sub Workbook_Open()
            Call clearc("CAC40")
            Call clearc("AEX")
            Call clearc("BEL20")
            Call clearc("PSI20")
            c = 383
            Application.OnTime TimeValue("09:01:00"), Procedure:="RecupCotation" '"09:01:00"
            End Sub

            Private Sub clearc(fl As String)
            Dim sh As Worksheet
            Set sh = Sheets(fl)
            sh.Range("NR12:AHW131").ClearContents
            End Sub

            Private Sub Workbook_BeforeClose(Cancel As Boolean)
            Call copy_dh("CAC40")
            Call copy_dh("AEX")
            Call copy_dh("BEL20")
            Call copy_dh("PSI20")
            End Sub

            Private Sub copy_dh(fl As String)
            Dim sh As Worksheet
            Set sh = Sheets(fl)
            sh.Range("D12:H51").Value = sh.Range("AS12:AW51").Value
            sh.Range("C12:C51").ClearContents
            sh.Range("C11") = Now
            End Sub
            1. Contributeur
              celui que tu utilises et dont tu décris le comportement incorrect.
            2. c est le deuxieme que j utilise c'est le dernier que tu as faits et que j ai insccrit dans Timer seul

              Private Sub Workbook_Open()
              Call clearc("CAC40")
              Call clearc("AEX")
              Call clearc("BEL20")
              Call clearc("PSI20")
              c = 383
              Application.OnTime TimeValue("09:01:00"), Procedure:="RecupCotation" '"09:01:00"
              End Sub

              Private Sub clearc(fl As String)
              Dim sh As Worksheet
              Set sh = Sheets(fl)
              sh.Range("NR12:AHW131").ClearContents
              End Sub

              Private Sub Workbook_BeforeClose(Cancel As Boolean)
              Call copy_dh("CAC40")
              Call copy_dh("AEX")
              Call copy_dh("BEL20")
              Call copy_dh("PSI20")
              End Sub

              Private Sub copy_dh(fl As String)
              Dim sh As Worksheet
              Set sh = Sheets(fl)
              sh.Range("D12:H51").Value = sh.Range("AS12:AW51").Value
              sh.Range("C12:C51").ClearContents
              sh.Range("C11") = Now
              End Sub
            3. Contributeur
              @chrisnapoliveux-tu dire que tu utilises encore deux fichiers?
              tu ne me montres pas le code de RecupCotation.
            4. oui j utilise 2 fichiers maintenant le timer tourne seula part comme ca je peux travailler sur l autre fichier l mais je pige pas le code recuo c'est pas cette partie
              Private Sub Workbook_Open()
              Call clearc("CAC40")
              Call clearc("AEX")
              Call clearc("BEL20")
              Call clearc("PSI20")
              c = 383
              Application.OnTime TimeValue("09:01:00"), Procedure:="RecupCotation" '"09:01:00"
              End Sub
            5. alors c'est peut etre ca

              Public Durée As Date
              Public c

              Sub RecupCotation()
              Durée = Now + TimeValue("00:01:00") ' A remplacer par "00:01:00"
              Application.OnTime Durée, "RecupCotation"
              Range(Cells(12, c), Cells(91, c)) = Range("A12:A91").Value
              c = c + 1
              If c >= 906 Then ArretCotation 'N° de la dernière colonne
              End Sub

              Sub ArretCotation()
              On Error Resume Next
              Application.OnTime Durée, "RecupCotation", , False
              End Sub
          2. En fait il faudrait que le timer démarre a 09::00 au lieu de 09:01:00 et quil mette les cotations des que le cours ouverture est fixé dans la colonne minute correspondante a chaque valeur
            exemple si une cotation a son cours fixe avant 09:01:00 elle s'affichera dans la colonne 09:00:00 si son cours est fixée a 09:02:00 et bien cela s'affichera pour elle dans la colonne 09:02:00 puis de la ça devient plus compliqué parceqe il faut que les chiffres suivant s'affiche dans la minute d'apres donc celle qui aura eu son cours de fixe avant 09:01:00 aura ses cellules pleines jusque au bout de la journée de minutes en minutes et celle qui aura son cours d'ouverture fixé 09;02:00 aura 2 cellules vides de moins en fait il faudrait arriver exactement a ça
            1. Bon
              ce matin ça vient tout juste de démarrer
              même problème qu hier aucun retard sur cotations s mais seulement collage sur une seule des 4 feuilles
              est ce que tu peux me dire comment faire cette formule dans Excel jy arrive pas

              =SI(une des cellules de la plage ;BC12:BC51 est >0.0175;(">1,75%"),"")
              je viens de constater à l instant également que si je passe d'une feuille a l autre pour contrôler le collage par exemple et bien le timer ne colle plus les cotations le temps que je suis sur l 'autre feuille
              par contre si je reviens sur la feuille il se remet a coller a la bonne colonne et sans aucun retard ça , çà devrait te donner des indications
              1. de plus il y a un autre problème c'est que si le timer s(arrete pour panne Electricité ou autre quand tu ouvres a nouveau le fichier il se remet en route instantanément et continue nouveau a coller
                c'est incompréhensible et il a effacé les cotations alors il faut faire une macro avec un bouton de façon que les cotations ne soient effaces que si on le demande
                de toute façon même si elles sont pas effaces le timer colle la prochaine seance dessus
                1. Contributeur
                  donc peut-être pas utile d'effacer les données au démarrage du timer?
                  et peut-être que le timer devrait choisir la colonne à remplir en fonction de l'heure, au lieu de faire chaque fois la colonne suivante en commençant par le début.
                2. oui je pense que c'est comme ca qu il faudra faire si le timer demarre a 09:01;00 c'est normal puique aucun cours d'ouverture n est fixé des la premiere seconde
                  apres si le timer s'arrete pour une raison de panne electrique ou autre il faudrait qu il reprenne dans la bonne minute mais ca je sais pas si c'est réalisable
                  il faut faire une macro avec un bouton qui m 'efface quand je veux les cotations
                  et il faut adapter l ensemble des feuilles parcequ il y en a seulement une qui colle la feuille 7 comme dans l 'ancien fichier les autres ne sont pas pris en compte c'est pour cela que hier je pensais que ca venait d'une mauvaise inscription de ma part mais si j avais effectivement fait des erreurs ce n 'est pas pour cela que ca ne colle pas sur les 3 autres feuilles
                  il faut semble til adapter ton code et aussi voir pourquoi en fin de dernière colonne quand il arrete de coller a 17:45:00 il ya la fenêtre de debogage qui s'ouvre
                3. Contributeur
                  @chrisnapoliune chose à la fois: par quoi veux-tu commencer?
                4. Bonjour
                  deja il faut que les quatres marches fonctionnent des 09:01:00
                  après on supprime le clear content sur les 4 marchés et on le remplacera par une simple macro a chaque feuille qui effacera toutes les cotations avec un bouton (comme ca si y a une panne je conserverais mes cotations jusqu 'au moment de la panne )
                  apres si tu as une combine de refaire partir le timer apres l 'éventuelle panne dans exactement la colonne minute de redémarrage.........?

                  "" ce serait la cerise sur le GATEAU"" on peut faire les essais au fur et a mesure
                5. Contributeur
                  @chrisnapolicommençons par essayer que les quatre marchés fonctionnent dès 09:01:00
                  peux-tu partager le code de RecupCotation?
              2. https://mon-partage.fr/f/B7Wlm77Y/

                tiens déjà regarde comment je m y prend pour le problème des barres des que j ai fini je te demande pour le code après le reste est beaucoup plus compliqué
                en gros c'est pouvoir changer la durée des temps enregistrement du timer et aussi la durée des journées prise en compte pour mes analyses statistiques
                modifier le fichier avec quelques codes
                mais c 'est pour plus tard
                1. Bonjour
                  le timer n affiche que seulement sur la premiere feuille sinon y a pas de retard je sais pas d'ou ça vient
                  j ai controlé le nom des feuilles tout semble en ordre?????
                2. Contributeur
                  @chrisnapolije ne me souviens pas d'avoir vu le code de la fonction RecupCotation adaptée pour plusieurs feuilles. cela avait fonctionné les jours précédents?
              3. Bonjour
                donc je remplace ma macro par celle ci au meme endroit..... je pensais pas que tu puisses arriver a faire ca..
                .
                pour mes graphes avec les echelles qui changent a mesure que les cotations évoluent j ai trouve la solution
                maintenant pour appliquer un code a ce que j ai trouvé ,il faut que tu me dises .
                si tu inscrits par exemple dans ton code "si la cellule A1 =("") (rien) est ce que le code VBA considère cellule sans formule ,ou bien cellule sans chiffre à l intérieur????
                je veux pas t"envoyer des fleurs mais je pense sincèrement que tu es un ton en dessus de tous les autres ,sans toi je n 'en serais pas ou nous en sommes actuellement ;Grand merci je vais avoir un outil très efficace

                ya juste un petit soucis sur le timer avec les 4 marches (4 f'euilles)ce matin j ai ouvert et je n ai que sur ma feuille 4 que les cotations s(inscrivent j ai sans doute fait encore une erreur dans la trancription du nom des feuilles je suppose
                est ce que l enregistrement automatique de windows ne perturbe pas le Timer si il tombe en même temps que les cotations se collent???? ya t il alors une possibilte d annuler cet enregistrement automatique???
                1. Contributeur
                  merci pour les fleurs, :-)
                  on peut tester par VBA soit la formule, soit le contenu d'une cellule. si on teste simplement sans rien préciser, on teste le contenu.
                  je ne me souviens pas d'avoir vu le code de la fonction RecupCotation adaptée pour plusieurs feuilles. cela avait fonctionné les jours précédents?
                  tu peux désactiver l'enregistrement automatique, la procédure exacte dépend de la version de Excel que tu utilises. je ne pense pas que cela puisse perturber le Timer ainsi de la même façon toutes les minutes.
                2. Ok alors c'est parfait je vais pouvoir arriver a mes fins
                  ton code est parfait je l ai mis en place ca fonctionne parfaitement la je me pose juste quelques heures parce que j ai la tete qui bouillonne ;et je fait des erreurs en essayant de mettre en pratique ce fameux graphe avec les echelles de % qui bougent en temps réel

                  il faut que tu comprennes que ce n 'est pas du tout mon job, ca me passionne de faire ça; mais entre sculpter la pierre et essayer de créer une solution en VBA c'est comme un chinois et un africain ;y a une sacré différence ,donc patiente parce que j arrive toujours a immaginer des solutions ,mais le langage pour le mettre sur VBA c'est tout autre chose Heureusement que tu es la Juste une dernière question est ce que tu connais le langage C++ parce que j ai appris que c’était le plus rapide pour le traitement des données financières et comme une fois que j aurais fini mon truc je vais me faire un site web et bien si je peux je transformerais le VBA en c++ des que j ai fini la construction de mon graphe je te dirais avec exactitude le code que je veux inscrire
                  grosso modo ca va ressembler a ceci
                  j 'ai 5 barres
                  ex une qui va de la cellule AO98:BW98 ; SI(OU(une des cellules BV98 ,BW98 est différente de(""");remplacer la plage DB11:DJ51 a la place de BO98:BW138
                  je refait la meme operation en dessous pour ma deuxieme barre en BO141;BW141; si(OU(une des cellules BV141,BW141 est différente de(""");remplacer la plage DB11:DJ51 a la place de BO141:BW181 je refait la meme operation sur 5 barres au total...
                  toutes les cellules dans les plages r tournent en streaming sauf les barres ou sont inscrit les echelles de reperes en ligne 98 puis 141 puis 184 puis 227 puis 270
                3. Contributeur
                  @chrisnapolije ne pourrais pas t'aider en c++ ni pour mettre ton site web en route.
                4. c 'est pas grave, je vais y arriver la dernière ligne droite c'est de m'occuper de ce code pour mes barres a échelles différentes je suis presque arriver a le faire des que j ai solutionné le problème je te dits quel code il me faut
                  après je m 'attaquerais a quelque chose d’extrêmement complexe "comment modifier mon fichier si je veux allonger le nombre de séances et le nombre de minutes j ai déjà trouver pour le nombre de minutes mais quand j allonge ou raccourcis le timer il faut que je trouve un code qui dise insérer moi une colonne a partir de ou supprimer moi une colonne a partir de apres il faut que je trouve une combine pour ajouter les formules dans les lignes que j aurais rajoute et pareil pour les colonnes
                  Penses tu que c'est réalisable..
                  moi je pense que oui, mais ça va être un vraie casse tete chinois il va falloir que je trouve le ratio exact entre l allongement des journées ou des minutes et le nombre de ligne vers le bas ou de colonnes a insérer ou supprimer (selon) a rajouter , cette partie me parait techniquement faisable
                  je pense que pour toi un code qui dirait si dans la cellule un tel il y a le numero 1 ou 2 ou 3 ...etc insérer moi une ligne ou une colonne a partir de , est dans ta competence
                  est il possible aussi de modifier le code dans VBA par un autre code qui remplace par exemple un chiffre ou des lettres toujours pareil ces lettres ou ses chiffres seraient pris dans une liste déroulante et permettraient au moment ou on le souhaite de changer la structure du fichier très rapidement
                  ce n 'est qu une idée peut être complètement loufoque et irréalisable???
                  Mais si ca venait a se faire j aurais toutes les possibilités de comparaisons pour mes analyses, et cela serait extraordinairement efficace

                  après si j 'arrive a faire cela ce sera le final parce-que le graphe que je t'ai envoyé ca y est j ai trouvé la solution il fonctionne a nouveau je vais en faire un de plus opérationnel
                  demain j 'essaye a nouveau le Timer , je me suis aperçu qu en nommant les feuilles j "'ai laissé des espaces sans m en apercevoir et c'est pour cela que çà ne marchait exclusivement que sur la feuille qui avait été bien nommé(ah ces lunettes ......) donne moi ton impression sur ce que j envisage de faire concernant la transformation d'un nouveau fichier en temps et en heures avant que je lance tout mes neurones dans la bataille(peut être inutilement si ce n 'est pas faisable)
                  après je te montrerais tout autre chose comme ça, ça changera un peu de l informatique on parlera tomates et légumes et je te montrerais ce que j avais inventé quand j étais en Afrique ;j ai vécu 10 ans la bas je suis revenu en France depuis seulement 1 an
                  tu verras que la passion peut faire des fois des choses surprenantes
                  Bonne soirée on a très bien progressé depuis le début , c'est même impressionnant
                5. Contributeur
                  @chrisnapolije n'ai pas vraiment compris ce que tu demandes.
              4. le probleme est que ces macros font monter ou descendre d'un pas de 43 lignes donc il faut que je trouve une macro qui fasse descendre de 43 mais une seule fois; et après je me servirai de la macro de la macro Sub ligne 12 pour le retour
                comment faire une autre macro qui n ai qu 'une seule action de descente et qui change CJ11 et DK11.
                je conserverais les autres quand je veux descendre plus bas dans le classeur

                Sub plus43()
                r = Selection.Row + 43
                Cells(r, 1).Activate
                ActiveWindow.ScrollRow = ActiveCell.Row
                End Sub

                Sub ligne12()
                Cells(12, 1).Activate
                ActiveWindow.ScrollRow = ActiveCell.Row
                End Sub

                Sub moins43()
                r = Selection.Row - 43
                If r < 12 Then r = 12
                Cells(r, 1).Activate
                ActiveWindow.ScrollRow = ActiveCell.Row
                End Sub
                1. Contributeur
                  suggestion:
                  Option Explicit
                  
                  Sub plus43()
                  Dim r As Long
                  r = Selection.Row + 43
                  Cells(r, 1).Activate
                  ActiveWindow.ScrollRow = ActiveCell.Row
                  cjdk11 (r)
                  End Sub
                  
                  Sub ligne12()
                  Cells(12, 1).Activate
                  ActiveWindow.ScrollRow = ActiveCell.Row
                  cjdk11 (12)
                  End Sub
                  
                  Sub moins43()
                  Dim r As Long
                  r = Selection.Row - 43
                  If r < 12 Then r = 12
                  Cells(r, 1).Activate
                  ActiveWindow.ScrollRow = ActiveCell.Row
                  cjdk11 (r)
                  End Sub
                  Private Sub cjdk11(ligne As Long)
                  'si la ligne 56 se trouve en dessous de la ligne11 alors inscrivez moi en cellule CJ11 PB/CLV et en Cellule DK11 PH/CLV
                  'si la ligne 12 est en dessous de la ligne11 alors inscrivez moi en cellule CJ11 PB/PR et en Cellule DK11 PH/PR
                  Select Case ligne
                      Case 12
                          Range("cj11") = "PB/PR"
                          Range("dk11") = "PH/PR"
                      Case 55
                          Range("cj11") = "PB/CLV"
                          Range("dk11") = "PH/CLV"
                      Case Else
                          Range("cj11") = ""
                          Range("dk11") = ""
                  End Select
                  End Sub
                  

                  je ne comprends pas le problème dont tu parles ni pourquoi tu veux faire une autre macro.
              5. excuse je n ai pas encore mes lunettes.....effectivement c'est ce que je veux faire c'est a dire ce que tu as marque dans ce message.. et de plus une fois que mes 2 plages vont marcher je veux que toutes les formules plus bas changent également en

                EX AN3 et AO3 vont changé mais aussi en suivant AN20et AO20 jusqu "en bas avec un pas de 17 jusque à AN666 et AO666

                mais la ou ça se complique c'est que la même opération doit être appliqué au cellule suivante AT et AU , AZ et BA , BG et BH , BM et BN , BS et BT et dans le même pas (17) voila je t 'ai tout dit
                la je peux pas du tout t'aider

                est-ce que le code fait bien tout ce qu'il faut avec I11 et AN3? est-ce que cela remplace correctement l'ancienne formule en AN3: =NB.SI(AL4:AL18;">="&$i$11)?
                si oui, donne-moi une autre formule (et dis-moi d'où elle vient, peut-être de AO3), je vais adapter le code pour te permettre de comprendre.
                peut-être veux-tu faire la même chose en AO3 qu'en AN3, mais en utilisant J11 au lieu de I11?
                j'essaie de deviner, comme tu es assez flou.
                1. j ai oublié de te dire actuellemnt dans AN et AO3 il ya en AN3
                  et en AO3 =NB.SI(AL4:AL18;">=0,006")

                  en AN20 =NB.SI(AL21:AL35;">=0,006") en AO20 =NB.SI(AL21:AL35;">=0,012") etc

                  EN AT3 =NB.SI(AR4:AR18;">=0,006") en AU3 =NB.SI(AR4:AR18;">=0,012")

                  en AZ3 =NB.SI(AX4:AX18;">=0,006") en BA3 =NB.SI(AX4:AX18;">=0,012")

                  en BG3 =NB.SI(BE4:BE18;">=0,006") en BH3 =NB.SI(BE4:BE18;">=0,012")

                  en BM3 =NB.SI(BK4:BK18;">=0,006") en BN3 =NB.SI(BK4:BK18;">=0,012")

                  en BS3 =NB.SI(BQ4:BQ18;">=0,006") en BT3
                  =NB.SI(BQ4:BQ18;">=0,012")

                  et tout est pareil les formules descendent en cascade jusqu'a la ligne 666
                  EX en BS666 =NB.SI(BQ667:BQ681;">=0,006") en BT666
                  =NB.SI(BQ667:BQ681;">=0,012")

                  Voila ce coup ci tu as tous les éléments
                  excuse moi de te faire perdre du temps
                2. Contributeur
                  @chrisnapoliet tout cela doit dépendre des valeurs en I11 et J11, est-ce exact?

                  posons-nous maintenant la question suivante: est-ce préférable que le code calcule les valeurs, ou est-ce préférable que le code crée des formules? si le code calcule les valeurs, ces valeurs changeront uniquement quand les valeurs en I11 et J11 changent. si le code crée des formules, le résultat changera aussi quand les cellules (exemple AL4:AL18) sont modifiées.
                3. bonjour
                  j ai repris du service et du cassement de tète alors comme le code ne marche pas je suis revenu a une solution formule en attendant que tu me trouves d 'ou vient le problème alors j ai remis ce code pour que mes 2 plages fonctionnent
                  Sub Worksheet_selectionChange(ByVal Target As Range)
                  Dim Lig As Byte, Col As Byte
                  If Not Application.Intersect(Target, Range("CV12:CV51,CX12:CX51")) Is Nothing Then
                  Range("DP2") = Target
                  End If
                  If Not Application.Intersect(Target, Range("I12:I51 ")) Is Nothing Then
                  Range("I11") = Target
                  Lig = Target.Row
                  End If
                  If Not Application.Intersect(Target, Range("J12:J51 ")) Is Nothing Then
                  Range("J11") = Target
                  Lig = Target.Row
                  End If
                  End Sub
                  ca marche parfaitement j ai les deux cellules I11 et J11 qui affichent correctement quand je clique dans les plages
                  j ai fait un essai avec 2 formules en attendant que tu me trouves la solution j ai inscrit en AN4 et AO4
                  =NB.SI(AL4:AL18;">="&statist!$I$11) et =NB.SI(AL4:AL18;">="&statist!$J$11)

                  aujourd’hui j ai également regarder le graphe que je t'ai envoyé
                  les DDE marchent dessus mais depuis le temps je ne me souviens plus trop bien de son fonctionnement
                  je me souviens que les barres se collaient selon que l on programmait le timer sur la page téléchargement
                  alors j ai essaye et seulement les cours s affichent en temps réel mais pas les barres
                  je pense que le modèle en arrière a été effacé je ne sais plus comment y accéder en lisant le programme tu vas toi sans doute comprendre
                  a la fin de la journée chaque graphe était copié a un emplacement et je pouvais consulté les 15 séances
                  les onglets en bas ouvre un graphe différent il y en a 40
                  ce graphe était dune efficacité redoutable et je compte bien m 'en resservir parce que cela n 'a rien a voir avec les graphes actuels la tu vois en direct en pourcentage sur l 'échelle a gauche ta véritable progression depuis le début de la séance
                  je compte le remettre en route et l 'améliorer parce que j ai plein d'idees
                  la premiere des choses est de lui appliquer ce que tu as faits pour l 'autre graphe c 'est a dire que les barres ne s'affichent que seulement quand le cours d'ouverture a ete fixe
                  c'est la que je me souviens qu il y avait un problème

                  Bonne soirée et bon week end
                4. Bonjour
                  est ce que tu as eu le temps de regarder mon Graphe je pense que c'est une mauvaise manipulation de ma part je pense que c'est le modèle qui a été effacé

                  Pour le Timer il faut que tu m'expliques certaines choses j ai programmé le départ a 09:01:00

                  alors le matin aucune cotation dans la première colonne cela commence dans la deuxième pour le moment je pense que toute les cotations ont changé avant 09:01:;00 parce que je n ai pas vu de procédure d'effacement par les OK je voudrais savoir si le timer efface toutes les valeurs en même temps des que une seule change dans la plage AS12:AW51 ou efface t'il uniquement celles qui n'ont pas encore changé
                  autrement dit une valeur qui serait a la traîne et dont le cour n 'aurait pas été fixé ne sera pas colle tant qu il n y aura pas un changement pour elle

                  Apres j ai un autre soucis les premières cotations se collent à la seconde prés ;mais plus on avance dans la journée et plus le collage prend du retard
                  au bout de 4 h on a par exemple plus de 1 minute de retard sur le vraie horaire peut on palier a ce problème??
                  cela vient il du timer ou du processeur qui a trop de choses a gérer je ne pige pas parce que le temps réel sur mes liens DDE est constant toute la journée Bonne journée
                5. Contributeur
                  @chrisnapolibonjour,
                  je n'ai pas eu le temps de regarder les graphes.
                  le timer devrait effacer uniquement les valeurs pour lesquelles le OK n'est pas encore arrivé.
                  à propos du retard: comment vois-tu qu'il y a du retard?
              6. je pige plus rie je viens de faire un essai et ya absolument rien qui se colle on c verra demain c'estune pris de tete
                voila le code

                Public Durée1 As Date
                Public c As Long
                Public TempsInitial1 As Date
                Public TempsInitial1Num As Double
                Public T1
                Public Tempo1

                Sub RecupCotation1()
                If T1 >= 60 Then T1 = 0 '60
                Durée1 = Format(TempsInitial1Num + (T1 * Tempo1), "hh:mm:ss")
                Application.OnTime Durée1, "RecupCotation1"
                Range(Cells(12, c), Cells(134, c)) = Range("A12:A131").Value
                Dim l As Long
                For l = 12 To 51
                If Cells(l, "C").Value <> "ok" Then
                If Cells(l, "D").Value <> Cells(l, "AS").Value _
                Or Cells(l, "E").Value <> Cells(l, "AT").Value _
                Or Cells(l, "F").Value <> Cells(l, "AU").Value _
                Or Cells(l, "G").Value <> Cells(l, "AV").Value _
                Or Cells(l, "H").Value <> Cells(l, "AW").Value Then
                Cells(l, "C").Value = "ok"
                Else
                Cells(l, c).ClearContents
                Cells(l + 40, c).ClearContents
                Cells(l + 80, c).ClearContents
                End If
                End If
                Next l
                Application.Wait Now + TimeValue("00:00:01")
                TempsInitial1Num = TempsInitial1Num + Tempo1
                If c >= 413 Then ArretCotation1 'N° de la dernière colonne des cotations à la minute
                c = c + 1
                End Sub
                Sub ArretCotation1()
                On Error Resume Next
                Application.OnTime Durée1, "RecupCotation1", , False
                End Sub
                1. c'est dur parceque c'est pas du tout mon boulot et comme je me prend la tete en p^lus avec ce nouveau classeur une minute, par moment je sais plus ou j 'en suis
                2. Contributeur
                  tout me semble normal.
                3. Bonjour
                  peux tu me dire comment on fait pour écrire en code aller de la colonne DA( jai le volet figé en CZ) vers la colonne NN je veux optimiser mes macros faites a l enregistreur
                  Hier soir j ai fait trois 2 fichiers supplémentaires pour le marche d 'Amsterdam et de Bruxelles j ai pris le meme fichier que celui du cac 40 et j ai enregistre sous un autre nom je vais avoir juste les noms a mettre en anglais a changer
                  je doid transformet le dernier par last ouverture par opening Plus haut par hight et plus bas par low apres j ai quelques références de pourcentage dans les statistiques a modifier puisque les nombres d'entreprises cotés sont différents Amsterdam a 25 valeurs Bruxelles 20 quand j aurais fini cela j 'espère que tu vas me trouver une combine pour rapatrier mes cotations parce que sinon j 'en ai pour un mois de boulot
                  je vais m attaquer aujourd’hui à faire un fichier afin d' avoir pour commencer 3 timers sur 3 feuilles différentes je vais l organiser de façon à adapter les plages qui vont être collé en fonction du nombre de valeur donc il n'y aura plus de classeur a appeler a l ouverture puisque je vais passer des que j aurais la combine pour rapatrier mes saisies au modèle avec un seul timer une minute toute la journée
                  je voulais te demander si à la place de la macro collage heures qui sélectionne copie et colle
                  ;n'est il pas possible d'utiliser la fonction décaler je n ai jamais fait cela mais je regarderais plus tard
                  "FANTASTIQUE" le marché vient de démarrer ,tes ok se sont affichés a la première minute rien ne s'est affiché dans la colonne 09:00:00 ce qui est normal
                  et toutes les plages se collent parfaitement Bravo a toi je suis très content, je te félicite de ton ingéniosité ;il suffira d'adapter ce programme a un seul code pour toute la journée en minute et alors il n y aura même plus a appeler d'autres classeurs pour faire démarrer le système
                  A+
                4. Contributeur
                  @chrisnapolije n'ai pas experience avec du code qui fait "aller de la colonne DA( jai le volet figé en CZ) vers la colonne NN". si tu partages ton code enregistré, je peux regarder si je vois une optimisation évidente. explique aussi à quoi sert le code.

                  que veux-tu dire par "une combine pour rapatrier mes cotations"?

                  pour la macro collage heures, c'est peut-être à "insertion" que tu penses?
                5. j ai un soucis avec le timer je viens juste de m 'en apercevoir
                  Chaque minute il m 'inscrit par moment sur les colonnes 09:15:00 09:30:00 ....etc les cotations comme si la cotation se faisait toute la journée en minute ,en fait comme si c’était le code qui me fallait pour le nouveau fichier que je suis entrain de réaliser; puis cela s’arrête et il reprend a coller tous les 15 mn actuellement il est 12:10 et il y a le collage dans la colonne 12:45 la il ya un quart dheure qui vient de passer et rien ne s'est inscrit dans la colonne
                  je sais pas ce qu il y a
                  pour l'optimisation des macros regarde plus haut en message 71 je t ai mis les macros telle que je les ai inscrite avec l’enregistreur de macro ,et chaque fois en dessous de chaque code je t'ai mis l 'explication de ce que je voulais obtenir ces codes me servent pour aller vérifier aux endroits ou je colle mes cotations mais aussi pour aller a l 'emplacement ou j 'ai ma réserve de 15 séances et pour aller aussi a un système que j ai crée en DN (je suis toujours figé en CZ et toutes les macros que je t'ai marqué sont par exemple
                  pour la Macro préouverture d'aller me retrouver en colonne DN juste après CZ(Figé)
                  pour la macro Collageheures d'aller me retrouver en colonne QH juste apres CZ(Figé)
                  pour la macro Allerauxheures d'aller me retrouver en colonne NN juste apres CZ(Figé)
                  pour la macro Allerauxheures d'aller me retrouver en colonne NN juste apres CZ(Figé)

                  enfin pour la macro Retouraugraphe je veux que quelque soit ma position dans n'importe quelle colonne ou je me trouve et avec le volet figé en CZ je revienne a la colonne DA
                  Peut être y a t 'il une solution en appliquant le code masquer comme la macro qui avait été réalisé sur le classeur je te la mets en dessous ,tu peux peut être t'en inspirer pour l'écrire

                  pour le problème du timer je sais pas si ca vient pas de mes liens dde il y a eu un moment un bug et certaines cotations étaient inversé j ai été oblige de les recoller tout a l heure

                  Option Explicit

                  Private Sub CommandButton1_Click()
                  Rows("12:3624").Hidden = False 'retour à la ligne 12 visible
                  End Sub
                  '-----------------------------------------------------------------------------------------------------------------------------
                  Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
                  Dim Lig As Byte, Col As Byte, Dep As Integer, Pas As Byte 'initialisations
                  Dim Fin As Integer, Lignes As String 'actions

                  If Not Application.Intersect(Target, Range("CV12:CV51,CX12:CX51")) Is Nothing Then
                  '-----------------------initialisations
                  Lig = Target.Row
                  Col = Target.Column ' 100=CV; 102=CX
                  Dep = IIf(Col = 100, 227, 270)
                  Pas = 86
                  '-----------------------actions
                  Fin = Dep + Pas * (Lig - 12) - 1 'si lig=12 Fin =226 ou 269
                  Lignes = 12 & ":" & Fin
                  Rows(Lignes).Hidden = True '1° ligne visible 227 ou 270
                  End If

                  End Sub

                  Je continue apres jon verra si il est possible de rapatrier les infos par programmation plutôt que de faire des centaines de formules
              7. ca y est je l ai trouvé je suis un idiot comme je ne le trouvais pas l autre jour j ai laisse tomber et je me se suis dit on verra demain et puis j ai oublié bon je vais essayer maintenant de faire un bout d'essai
                1. Sub RecupCotation1(), après la ligne
                  Cells(l,c).ClearContents

                  les deux lignes suivantes:
                  Cells(l+40,c).ClearContents
                  Cells(l+80,c).ClearContents ca se trouve ou je ne le vois nulle part sur la feuille stats????
                  1. Contributeur
                    tu avais écrit (#37) que tu avais ajouté ces lignes: as-tu changé d'avis entre-temps?
                    je t'avais expliqué la logique de cela en #38
                • 1
                • 2
                • 3