IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Macros et VBA Excel Discussion :

Tâche répétitive inférieure à la seconde [XL-2007]


Sujet :

Macros et VBA Excel

  1. #1
    Membre Expert
    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Novembre 2011
    Messages
    1 503
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Irlande

    Informations professionnelles :
    Activité : Chef de projet en SSII

    Informations forums :
    Inscription : Novembre 2011
    Messages : 1 503
    Par défaut Tâche répétitive inférieure à la seconde
    Bonjour,

    Je souhaiterais effectuer une tâche toutes les X dixièmes de secondes.
    Je n'ai pas réussi à faire la synthèse de tous les posts sur le sujet sur le net...

    En fait, j'arrive facilement à faire un Timer en centièmes de seconde ou à effectuer une tâche toutes les secondes avec Application.OnTime Now + TimeValue("00:00:01"), "ma_macro" mais je n'arrive pas à mixer les deux...

    Quelqu'un aurait-il la solution ?

    Je vous remercie par avance en restant à votre disposition pour tout complément !
    Kimy

  2. #2
    Membre chevronné
    Homme Profil pro
    Ingénieur Industrialisation
    Inscrit en
    Mai 2015
    Messages
    222
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur Industrialisation
    Secteur : Industrie

    Informations forums :
    Inscription : Mai 2015
    Messages : 222
    Par défaut
    Tu ne pourrais pas utiliser l'api Sleep du style :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    Private Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
    Sub LanceurDeTaches()
     
    Do Until [TA CONDITION D'ARRÊT]
        Call TaProcédure
        Sleep 100 'millisecondes
        Doevents
    Loop
     
    End Sub
     
    Sub TaProcédure
    Debug.Print "Procédure lancée à " & time
    End Sub
    C'est peut-être nul, je sais pas Je propose ce qui me passe par la tête...

  3. #3
    Membre Expert
    Inscrit en
    Octobre 2010
    Messages
    1 401
    Détails du profil
    Informations forums :
    Inscription : Octobre 2010
    Messages : 1 401
    Par défaut
    Bonjour

    Tu vas trouver ici quelques exemples de
    m_TimerID = SetTimer(0, 0, Duration, AddressOf TimerEvent)

  4. #4
    Membre Expert
    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Novembre 2011
    Messages
    1 503
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Irlande

    Informations professionnelles :
    Activité : Chef de projet en SSII

    Informations forums :
    Inscription : Novembre 2011
    Messages : 1 503
    Par défaut
    Bonjour à tous,

    @Quentin77170 : en fait, je ne peux pas utiliser Sleep car je dois faire un DoEvents pendant les moments "off" de ma macro.
    Ton idée est bonne, mais je n'ai pas donné tous les détails !

    @Docmarti : Merci pour le lien. Je crois que je vais tester plusieurs choses. J'ai trouvé un truc de mon côté et ce lien là que tu m'as donné semble réponse parfaitement à ma demande.

    Je reviens vers vous !
    Merci !

    Cordialement,
    Kimy

  5. #5
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Août 2010
    Messages
    3 453
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Août 2010
    Messages : 3 453
    Par défaut
    Bonjour,

    Sinon, avec l'Api "GetTickCount " :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
     
    Declare Function GetTickCount Lib "Kernel32" () As Long
     
    Sub Minuterie(Milliseconde As Long)
     
        Dim Arret As Long
     
        Arret = GetTickCount() + Milliseconde
     
        Do While GetTickCount() < Arret
            DoEvents
        Loop
     
    End Sub
     
    Sub Test()
        Dim Debut As Long
     
        Debut = GetTickCount
        Minuterie 100
     
        'la différence entre la valeur affichée et les 100 ms est due à l'appel de la fonction "GetTickCount"
        'pour le Debug Print, chez moi 10 ms --> 110
        Debug.Print GetTickCount - Debut
     
    End Sub
    Hervé.

  6. #6
    Invité
    Invité(e)
    Par défaut
    Bonjour,
    je te propose une solution, un contrôle timer!

    vue qu'il n'est pas possible d'utiliser le contrôle timer, j'en est créé un avec le contrôle time!

    oui mon contrôle est un passe plat et vue qu'il à été développé avec vb6 correctement licencier tu peux t'en servir dans Excel!

    une seconde est égal à 1500 interval !
    Fichiers attachés Fichiers attachés

  7. #7
    Membre Expert
    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Novembre 2011
    Messages
    1 503
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Irlande

    Informations professionnelles :
    Activité : Chef de projet en SSII

    Informations forums :
    Inscription : Novembre 2011
    Messages : 1 503
    Par défaut
    Re !

    Bon... j'ai à peu près tout essayé sans succès... Mon résultat le plus proche est l'API "GetTickCount" de Theze mais... je ne peux effectuer d'action malgré le DoEvents.
    Ceci vient très probablement du fait que je suis déjà dans un DoEvents au moment de demander l’exécution de la procédure toutes les X intervalles...

    @Robert : peux-tu m'éclairer d'avantage quant à ta solution ? Je ne sais pas "installer" ce que tu me proposes...
    Tu peux me faire un mini tuto ?

    Merci pour toutes vos réponses !

    Cordialement,
    Kimy

  8. #8
    Invité
    Invité(e)
    Par défaut
    Dans le poste,
    Tu as trois zip
    Un MyTimer.zip dans lequel ce trouve TimerRd.ocx, les la source du code en Vb6 ainsi que deux fichier bat.

    Install...bat et uniinstall...bat ces deux fichiers permettes de registrer ou deregistrer le contrôle!

    Mais si ça fonctionne sur certaines machines, sur mon sevt 64, pas question!

    Les deux fichier Package contiennent le setup. Vue l taille du setup j'ai été obligé de le compacter en 2 fichier.

    Si le fichier bat d'installation fonction cool, si non obligé de passer par le setup .

    Je ne penses pas que tu voulais un contrôle dans un UserFom mais c'est un bon compromis le sUserFom peut être non modal visible ou pas, un astuce pour qu'il ne soit pas visible.


    Le contrôle dispose d'un autre événement Action ou tu place l'appel de ta procédure avec le paramètre.

    Dans le. Boite d'ajout des contrôle recherche TimerRd...

    En espérant que ce palliatif ne te désappointe pas trop!

    De toute les façons c'est un vrai contrôle timer et c'est pas perdu!
    Dernière modification par Invité ; 28/08/2015 à 17h47.

  9. #9
    Membre Expert
    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Novembre 2011
    Messages
    1 503
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Irlande

    Informations professionnelles :
    Activité : Chef de projet en SSII

    Informations forums :
    Inscription : Novembre 2011
    Messages : 1 503
    Par défaut Solution = GetTickCount
    Re !

    Merci à tous pour votre aide ! J'ai finalement réussi en réadaptant la méthode "GetTickCount".

    Robert, merci pour ton investissement, mais la solution que tu proposes est "lourdes" pour mon objectif. Avec un peu de réflexion j'ai réadapté ma macro qui fonctionne très bien toutes les X millisecondes tout en détectant les touches du clavier.

    A très vite et merci encore !

    Cordialement,
    Kimy

  10. #10
    Membre Expert
    Profil pro
    Inscrit en
    Juin 2009
    Messages
    652
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juin 2009
    Messages : 652
    Par défaut OnTime en centième de seconde
    Bonjour,

    Une astuce pour obtenir OnTime en centième de seconde (plus ou moins).
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    Sub aa()
    '##########################################
    '### Voir la Feuil1 pour savoir comment ###
    '###     est obtenu le coefficient      ###
    Const Coeff# = 1.15740740740741E-07
    '##########################################
     
    Static passe&
    '--- Condition pour stopper la récursivité ---
    passe& = passe& + 1
    If passe& > 100 Then  'on stoppe à 100
      passe& = 0
      Exit Sub
    End If
     
    '--- Récursivité ---
    Application.OnTime Now + Coeff#, "aa"
    '--- Inscription pour visualiser (à virer par la suite) ---
    Range("a" & passe& + 1 & "") = passe&
    End Sub
    Fichiers attachés Fichiers attachés

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 5
    Dernier message: 14/03/2016, 12h05
  2. Automatiser les tâches répétitives
    Par nitch01 dans le forum Débuter
    Réponses: 1
    Dernier message: 01/11/2011, 17h24
  3. Réponses: 0
    Dernier message: 23/02/2011, 11h58
  4. [QBasic] Temporisation inférieure à 1 seconde
    Par djedje-08 dans le forum Basic
    Réponses: 0
    Dernier message: 20/09/2009, 18h26
  5. [Batch] Cron Expression Tâche répétitive Spring
    Par bj304075 dans le forum Spring
    Réponses: 2
    Dernier message: 30/06/2009, 11h28

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo