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 :

Gestion évènements et Application.Ontime


Sujet :

Macros et VBA Excel

  1. #1
    Membre confirmé
    Inscrit en
    Décembre 2007
    Messages
    172
    Détails du profil
    Informations forums :
    Inscription : Décembre 2007
    Messages : 172
    Par défaut Gestion évènements et Application.Ontime
    Bonjour,

    J'ai un code qui a la structure suivante:
    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
     
    sub ma_macro()
     
    'initialisation
     
    i = 1
    Do While IsEmpty(Cells(i,1)) = False
     
        Application.OnTime t(i), "ma_sub"
        'Gestion évènement ?
        i = i + 1
     
    Loop
     
    End Sub
    Avec en colonne 1 les heures t(i).

    Je souhaite donc exécuter "ma_sub" aux heures t(i).

    Mais en fait, quand je lance la macro, elle s'exécute jusqu'à la fin et il n'y a pas d'arrêt dans la boucle while, pour attendre que ma_sub se soit exécutée (avant de passer à la suivante).

    Il faudrait que je mette un sleep juste après le application.Ontime mais alors à ce moment là, je n'ai plus d'intérêt à garder le Application.Ontime.

    J'avais donc pensé à un wait.nextevents (complètement inventé), c'est-à-dire une fonction qui gère les évènements, afin de na pas utiliser de sleep ..

    Existe-t-il cela en VBA, ou une manière de s'en approcher ?

    Merci

  2. #2
    Membre confirmé
    Inscrit en
    Décembre 2007
    Messages
    172
    Détails du profil
    Informations forums :
    Inscription : Décembre 2007
    Messages : 172
    Par défaut
    bon visiblement ça a l'air compliqué puisque y'a pas eu de réponses.

    j'ai cru comprendre qu'il faut inclure du code dans ThisWorkbook et pas seulement dans un module, en mettant l'option schedule de application.Ontime sur False

    mais c'est pas clair du tout cette histoire, surtout à cause de la boucle que je veux faire et l'intervalle d'exécution variable

  3. #3
    Expert confirmé
    Avatar de fring
    Homme Profil pro
    Engineering
    Inscrit en
    Février 2008
    Messages
    3 900
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : Belgique

    Informations professionnelles :
    Activité : Engineering

    Informations forums :
    Inscription : Février 2008
    Messages : 3 900
    Par défaut
    Bonjour,

    t(i) ne renvoit rien comme valeur, essaye ceci
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    sub ma_macro()
    'initialisation
    i = 1
    Do While IsEmpty(Cells(i,1)) = False
        Application.OnTime Cells(i, 1).Value, "ma_sub"
        'Gestion évènement ?
        i = i + 1
    Loop
    End Sub
    Code testé

  4. #4
    Membre confirmé
    Inscrit en
    Décembre 2007
    Messages
    172
    Détails du profil
    Informations forums :
    Inscription : Décembre 2007
    Messages : 172
    Par défaut
    arf désolé, t(i) était une vulgarisation de mon code; c'était bien cells(i,1) que je mettais ; c'était pour la compréhension, car le problème ne vient pas de là mais de l'utilisation incrémentale de Application.Ontime

    je crois bien que l'utilisation du while n'est pas possible dans ce cas là;

    il faut "boucler" sur soi-même, c'est à dire que la structure serait:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    sub ma_macro()
    (...)
    application.ontime t, "ma_macro"
    (...)
    end sub

  5. #5
    Expert confirmé
    Avatar de fring
    Homme Profil pro
    Engineering
    Inscrit en
    Février 2008
    Messages
    3 900
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : Belgique

    Informations professionnelles :
    Activité : Engineering

    Informations forums :
    Inscription : Février 2008
    Messages : 3 900
    Par défaut
    perso j'ai testé le code et il fontionne

  6. #6
    Membre confirmé
    Inscrit en
    Décembre 2007
    Messages
    172
    Détails du profil
    Informations forums :
    Inscription : Décembre 2007
    Messages : 172
    Par défaut
    Citation Envoyé par fring Voir le message
    perso j'ai testé le code et il fontionne


    bon je savais depuis ce matin que j'étais pas dans un bon jour mais là ...

    bon aller, je verrai ça après une bonne nuit de sommeil.

  7. #7
    Expert confirmé
    Avatar de fring
    Homme Profil pro
    Engineering
    Inscrit en
    Février 2008
    Messages
    3 900
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : Belgique

    Informations professionnelles :
    Activité : Engineering

    Informations forums :
    Inscription : Février 2008
    Messages : 3 900
    Par défaut
    J'ai fait le test avec dans la colonne A
    23:01
    23:02
    23:03
    et il m'a bien exécuté MaMacro à ces heures là

  8. #8
    Membre confirmé
    Inscrit en
    Décembre 2007
    Messages
    172
    Détails du profil
    Informations forums :
    Inscription : Décembre 2007
    Messages : 172
    Par défaut
    Bon j'ai l'esprit plus clair aujourd'hui.

    En effet ça marche, mais la boucle while va jusqu'à la fin et c'est là où ça va pas, car j'utilise la valeur de i dans "ma_sub", et je veux une évolution de cette valeur entre chaque exécution de "ma_sub"; or les 3 fois, ma_sub utilise la valeur finale de i (c'est-à-dire 4)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    Private i
    Sub ma_macro()
        i = 1
        Do While IsEmpty(Cells(i, 1)) = False
            Application.OnTime Cells(i, 1).Value, "ma_sub"
            i = i + 1
        Loop
    End Sub
     
    Sub ma_sub()
        Cells(i, 2) = 5
    End Sub
    en faisant ce code on a "5" en ligne 4, 3 fois d'affilée; or ce que je veux c'est:
    1ère "ma_sub" -> 5 en ligne 1
    2ème "ma_sub" -> 5 en ligne 2
    3ème "ma_sub" -> 5 en ligne 3

    donc j'ai à moitié résolu le problème en faisant:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    Sub ma_macro()
        i = 1
        Cells(1, 3) = 1
        Do While IsEmpty(Cells(i, 1)) = False
            Application.OnTime Cells(i, 1).Value, "ma_sub"
            i = i + 1
        Loop
    End Sub
     
    Sub ma_sub()
        Cells(Cells(1, 3), 2) = 5
        Cells(1, 3) = Cells(1, 3) + 1
    End Sub
    mais ce que je voulais initialement, c'est avoir ce résultat là sans être obligé de passer par la cellule cells(1,3) que j'incrémente à chaque exécution de "ma_sub" ; je comptais sur le i pour ça, mais visiblement ça n'est pas possible

    je me demande si c'est pas un problème de variable statique/dynamique ??

    Autre chose: les valeurs des heures d'exécution de "ma_sub" ne sont pas figées, c'est-à-dire que les heures d'exécution peuvent varier; d'où l'intérêt de boucler sur "soi-même" comme je le disais plus haut.
    ça donne une espèce d'incrémentation "pas à pas" [un "pas" étant une exécution de "ma_sub", qui ne se nomme donc plus "ma_sub" mais "ma_macro"]

    voilà comment partir de quelque chose de simple et arriver à quelque chose de compliqué

  9. #9
    Expert confirmé
    Avatar de fring
    Homme Profil pro
    Engineering
    Inscrit en
    Février 2008
    Messages
    3 900
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : Belgique

    Informations professionnelles :
    Activité : Engineering

    Informations forums :
    Inscription : Février 2008
    Messages : 3 900
    Par défaut
    Je viens de tester le code ci-dessous, cela a l'air de correspondre à ce que tu souhaites obtenir
    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
    Private i As Integer
     
    Sub ma_sub()
    Cells(i, 2) = 5
    i = i + 1
    End Sub
     
    Sub test()
    Dim x As Integer
    i = 1
    x = 1
    Do While IsEmpty(Cells(x, 1)) = False
        Application.OnTime Cells(x, 1).Value, "ma_sub"
        x = x + 1
    Loop
    End Sub

  10. #10
    Membre confirmé
    Inscrit en
    Décembre 2007
    Messages
    172
    Détails du profil
    Informations forums :
    Inscription : Décembre 2007
    Messages : 172
    Par défaut
    Merci pour ta solution.

    En effet ça marche sans être obligé d'utiliser une cellule.

    Même s'il me reste à gérer la variabilité des temps d'exécution, je clos le sujet puisque le problème principal a été résolu.

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

Discussions similaires

  1. [JSF + ADF]Gestion d'un application module
    Par bertlef dans le forum JSF
    Réponses: 2
    Dernier message: 13/03/2009, 12h15
  2. L'événement Application.OnTime Sous VBA
    Par SubObjectif dans le forum Access
    Réponses: 14
    Dernier message: 04/08/2006, 12h00
  3. [Visual Studio][MFC] Gestions évènements
    Par Mic75 dans le forum MFC
    Réponses: 6
    Dernier message: 07/06/2006, 20h03
  4. [VBA-E] Comment annuler un appel planifié avec Application.OnTime ?
    Par Efpoint dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 30/05/2006, 14h24
  5. [MFC][VC++.NET]gestion évènement clavier
    Par Rafoo dans le forum MFC
    Réponses: 2
    Dernier message: 14/12/2005, 09h29

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