Laps de temps VBA

Bonjour,

Je voudrais savoir comment je pourrai dire en VBA "execute cette action toute les 3 minutes 30 secondes". Je voudrais créé une macro qui exécute une action à intervalle de temps régulier.

Merci

9 réponses

Résumé de la discussion

Question centrale : comment écrire en VBA une macro qui exécute une action toutes les 3 minutes 30 secondes et qui se répète à intervalle régulier sans intervention manuelle. Des propositions utilisent Application.OnTime associée à TimeValue, par exemple en déclarant une variable MTime et un compteur pour relancer la macro tant que le seuil n’est pas atteint. D’autres approches évoquent de séparer la création de la fenêtre et le rafraîchissement pour éviter le problème du focus, et recommandent des méthodes natives comme des requêtes web plutôt que SendKeys. En cas de difficultés, plusieurs commentaires suggèrent de tester le compteur, de remettre à zéro et de considérer l’emploi de données externes ou de rafraîchissement automatique pour éviter les limitations liées au navigateur.

Bobot (l’IA à votre service)
  1. J'ai une petite question...

    Ce code permet d'actionner un sub à intervalle régulier. Mais peut-on faire de même avec une fonction?

    Désolé si ca parait trivial, mais je débute, et j'ai une fonction qui, au changement d'une cellule, ne me renvoi que des zéros, et si je sélectionne la cellule où j'utilise cette fonction, et que je la valide, elle me recalcule toutes les cellules utilisant cette fonction...

    Merci
    0
    1. Contributeur
      Bonjour,

      regarde l'aide excel sur OnTime, il y a un exemple.

      eric

      edit: ah, j'ai répondu un peu tard....
      clem = tom ? et = quoi encore ?
      Mais peut-on faire de même avec une fonction?
      Il me semble que tu as déjà posé cette question...
      0
      1. Merci quand même. Non, je ne suis pas clem.
        0
      2. Non je suis une personne totalement indépendante de Tom.

        Je ne me rappelle pas avoir posé cette question :$. Je vais me balader sur le forum, quelqu'un doit avoir posté quelque chose du genre :) désolé du dérangement
        0
      3. Contributeur
        Tu devrais démarrer une nouvelle question plutôt que de te greffer sur celle-ci.
        Met le code de ta fonction aussi, car tout dépend de ce qu'elle réalise et de comment tu l'as écrite.

        eric
        0
      4. Merci je fais ca de suite!
        0
    2. Connaitriez-vous la fonction pour rafraichir une page web en VBA?
      J'arrive à lancer le navigateur, mais après je ne sais pas comment rafraichir une page.
      0
      1. Modérateur
        Bonjour,
        Pour rafraichier une page web, tu peux appuyer sur la touche F5.
        Peut être peux tu déclencher ça en utilisant SendKeys :
        SendKeys "{F5}", True

        Cordialement,
        Franck P
        0
        1. Merci pjaku, je vais essayer. Par contre, j'ai l'impression que je n'ai pas bien saisi comment fonctionnait OnTime parce que ma macro qui consiste à rafraichir une page web toutes les 3 min 30 s ne fonctionne. Excel me dit que ma macro n'est pas présente dans ce classeur ou que mes macros sont désactivés...
          Pour l'instant ma macro ne fait que lancer le navigateur toute les 3 min 30 s, elle ne rafraichit pas vraiment mais déjà ça ne marche pas.

          Public MTime As Date

          Sub Refresh()

          Dim IE As New InternetExplorer
          'Chargement d'une page web Google
          IE.Navigate "http://www.commentcamarche.net/forum/affich-25605717-laps-de-temps-vba#newanswer"
          'Affichage de la fenêtre IE
          IE.Visible = True
          'On libère la variable IE
          IE=Nothing

          MTime = Time
          Application.OnTime MTime + TimeValue("00:03:30"), "Refresh"

          End Sub
          0
          1. Une petite erreur dans le code que j'ai posté, il y a un set qui manque. Voici le vrai code, si quelqu'un sait pourquoi ça ne marche pas je lui en serai reconnaissant.

            Public MTime As Date

            Sub Refresh()

            Dim IE As New InternetExplorer
            'Chargement d'une page web Google
            IE.Navigate "www.youtube.com/watch?v=eVKj3u8JUm0"
            'Affichage de la fenêtre IE
            IE.Visible = True
            'On libère la variable IE
            Set IE = Nothing

            MTime = Time
            Application.OnTime MTime + TimeValue("00:03:30"), "Refresh"

            End Sub
            0
          2. Contributeur
            Re,

            regarde le post 10 de pijaku...

            eric
            0
          3. oui mais la le problème est en amont, c'est pourquoi il ne relance pas la macro telle qu'elle est actuellement? Il me dit qu'elle n'existe pas dans ce classeur au bout des 3min 30s...
            0
          4. Contributeur
            Soit pas bouché...
            Pour l'instant ma macro ne fait que lancer le navigateur toute les 3 min 30 s
            Oui, parce que c'est ce que fait ton code.
            Pijaku te propose de lancer le rafraichissement avec sendkeys

            eric
            0
        2. Modérateur
          Salut Eriiic,
          Un p'tit relais?

          Sur le modèle proposé plus haut par g, essaye ce code (pas testé) :
          Public MTime As Date 
          
          Sub Refresh()
          
          Dim IE As New InternetExplorer 
          'Chargement d'une page web Google 
          IE.Navigate "www.youtube.com/watch?v=eVKj3u8JUm0" 
          'Affichage de la fenêtre IE 
          IE.Visible = True 
          'On libère la variable IE 
          Set IE = Nothing 
          
          MTime = Time 
          SendKeys "{F5}", True
          
          Application.OnTime MTime + TimeValue("00:03:30"), "Refresh" 
          
          End Sub
          0
          1. Oui je connais, ce cours est vraiment intéressant! Mais je n'arrive pas à m'en sortir dans mon cas malgré tout.
            0
          2. Vraiment personne pour me dire comment faire marcher le programme please?
            0
          3. Contributeur
            Ben déjà prend la peine de répondre aux propositions !!!
            Voir le du 16 juil. 2012 à 15:00
            eric
            0
        3. Bonjour eriiicc,

          Désolé, cette proposition est passé inaperçu, je n'avais vu que le commentaire croyant que le message du dessus était le mien...
          Après test j'obtiens toujours la même chose, voir la capture: http://cjoint.com/?3GrmkQAhX8O

          Merci d'avance
          0
          1. Contributeur
            Ce post était de pijaku.

            Pour moi il faut séparer la création de la fenêtre (à faire 1 fois) du rafraichissement.
            Le pb avec sendkeys c'est qu'il faut activer la fenêtre en avant plan à chaque fois. Si tu travailles sur le micro en même temps ça risque de devenir pénible.
            Sub Refresh()
                AppActivate "titre de ta fenêtre IE"
                MTime = Time
                SendKeys "{F5}", True
                Application.OnTime MTime + TimeValue("00:03:30"), "Refresh"
            End Sub

            Si c'est pour récupérer des données d'une page web regarde plutôt du coté de 'données / données externes / nouvelle requête sur le web...' qui peut être rafraichie automatiquement.
            Pas toujours utilisable, ça dépend de comment est construit le site.
            exemple de requête web : https://www.cjoint.com/?BGrmLxnysfp

            eric
            0
          2. J'ai séparé les 2 comme tu m'as dit, voici la nouvelle macro mais ça m'affiche toujours le même message, même si mon navigateur est en avant plan. J'ai expérimenté sur une page youtube...

            Public MTime As Date
            Sub Refresh2()

            AppActivate "Super Mario 64 - End theme "
            MTime = Time
            SendKeys "{F5}", True
            Application.OnTime MTime + TimeValue("00:00:30"), "Refresh"

            End Sub
            0
          3. Contributeur
            Refresh étant un mot-clé vba change son nom, y compris lorsqu'il s'appelle (...+ TimeValue("00:00:30"), "Refresh" )

            eric
            0
          4. Ah d'accord, inattention de ma part. Sinon, ça à l'air de bien fonctionner :) Même en rétrécissant la fenêtre ça marche!

            Merci beaucoup
            0
        4. Juste 2 dernières questions: comment je fais pour stopper le processus de rafraichissement sans quitter Excel?
          Peut-on programmer un nombre de rafraichissement limite?
          0
          1. Contributeur
            1) Si tu fais F1 sur on time tu auras un exemple complet.
            2) il faut que tu mettes un compteur que tu incrémentes dans la boucle. Sselon sa valmeur tu fais ou ne fais pas.

            eric
            0
          2. Merci eriiic, par contre pour annuler il faut faire une macro indépendante? Voilà ce que j'ai essayé et ça ne marche pas, j'ai aussi essayé sans le MTime.

            Public MTime As Date
            Sub Annuler()

            Application.OnTime EarliestTime:=MTime + TimeValue("00:03:26"), Procedure:="Refresh2", Schedule:=False

            End Sub
            0
          3. Contributeur
            Bonjour,

            il faut annuler le précédent temps activé que tu aurais mémorisé.
            Mais comme tu veux arreter au bout de x fois, il suffit de tester le compteur et ne pas relancer.
            Ca donnerait qcq chose comme ça :
            Public MTime As Date, cpt As Long
            Sub Refresh2()
                If cpt < 40 Then
                    AppActivate "Super Mario 64 - End theme "
                    MTime = Time
                    SendKeys "{F5}", True
                    Application.OnTime MTime + TimeValue("00:00:30"), "Refresh2"
                    cpt = cpt + 1
                End If
            End Sub

            Il faudra peut-être déclarer la variable cpt en Static pour ton compteur, je ne peux pas tester.
            Et une autre procédure pour remettre ton compteur à 0 et relancer.
            eric
            0
          4. Merci, ça marche très bien!
            Je l'ai déclaré en static et j'ai rajouté un else cpt=0, ainsi cpt se réinitialise dès que la boucle est finit.

            Par contre je veux bien savoir comment on annule le temps précédent dans cet exemple sans passer par une condition, parce que ma tentative précédente est resté vaine...

            Autre chose, tu sais si c'est possible de réactiver la fenêtre sur laquelle je travaillais avant chaque AppActivate? ça serait vraiment top si j'arrivais à déjouer ce défaut.

            Merci
            0
          5. Contributeur
            Bonjour,

            Par contre je veux bien savoir comment on annule le temps précédent dans cet exemple sans passer par une condition, parce que ma tentative précédente est resté vaine...
            Je t'y ai déjà répondu :
            il faut annuler le précédent temps activé que tu aurais mémorisé ( et non un nouveau temps calculé).

            Autre chose, tu sais si c'est possible de réactiver la fenêtre sur laquelle je travaillais
            Et bien refais un appactivate en utilisant le paramètre wait

            eric
            0