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 :

Comment lancer une procédure après affichage d'une form


Sujet :

Macros et VBA Excel

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    45
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 45
    Points : 44
    Points
    44
    Par défaut Comment lancer une procédure après affichage d'une form
    Bonjour,

    J'affiche dans un userform un textbox qui m'affiche toutes les secondes le contenu d'un fichier txt.
    Le contenu de ce fichier est modifié par un autre programme, et j'utilise le textbox pour afficher un suivi de l'évolution des calculs.
    Le problème est que je ne sais pas comment lancer automatiquement la procédure qui rafraichie le contenu du textbox lors de l'ouverture de cet userform. En effet il s'agit d'une boucle infinie et lorsque je lance la procédure à la fin de l'initialisation de l'userform, celui-ci ne s'affiche jamais puisque la boucle infinie empeche l'initialisation de l'userform de se terminer...

    Acutellement j'utilise un bouton pour lancer cette procédure, mais existe t'il un moyen pour lancer directement la procédure après l'affichage de l'userform sans avoir à cliquer sur un bouton ou quoi que ce soit ?

    Merci d'avance
    Rémi

  2. #2
    Inactif  

    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    4 555
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 4 555
    Points : 5 537
    Points
    5 537
    Par défaut
    Bonjour,

    1) Quel évènement de ta UserForm as-tu utilisé pour lancer ta boucle de lecture
    2) comment et par quoi la lances-tu "toutes les secondes"

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    45
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 45
    Points : 44
    Points
    44
    Par défaut
    Pour le moment j'utilise un clic sur un bouton, lorsque j'ai essayé de mettre l'appel de la procédure dans l'initialisation de la form (UserForm_Initialize) elle ne s'est jamais affichée, ce qui me parait normal en y réfléchissant puisque la boucle infinie prend le relais sur l'initialisation qui ne se termine jamais à moins qu'on sorte de la boucle infinie mais dans ce cas ça n'a plus d'utilité puisqu'on à aucun "retour" en direct...

    Ensuite pour ce qui est de la boucle, j'utilise un while avec une condition lue dans un fichier pour sortir lorsque l'autre programme indique qu'il a terminé... Et pour vérifier le fichier toutes les secondes je met "Now" dans une variable et à chaque passage dans la boucle je teste si le moment présent est supérieur de une seconde ou plus par rapport à la valeur présente dans la variable...

    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
        Dim S As Integer
        While fini = False
            If Second(Now) > S Or Second(Now) = 0 Then
     
                nbEtapes = LireNbEtapes
                etapeEnCours = LireEtapeEnCours
                fini = LireTerminer
     
                TextBox1.SetFocus
                TextBox1.Text = LireRetour
                TextBox1.SelStart = Len(TextBox1.Text)
     
                S = Second(Now)
     
            End If
            DoEvents
        Wend

  4. #4
    Membre éclairé
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    752
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2008
    Messages : 752
    Points : 832
    Points
    832
    Par défaut
    Utilise plutôt l'évènement Userform_Activate.

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    45
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 45
    Points : 44
    Points
    44
    Par défaut
    Ouiii ! Merci !

    J'ai même pas pensé que cet évènement pouvait être levé après Initialize !

    Ca marche impec merci !

  6. #6
    Inactif  

    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    4 555
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 4 555
    Points : 5 537
    Points
    5 537
    Par défaut
    Bonjour,

    Je viens de jeter un coup d'oeil sur ta boucle (celle pour afficher toutes les secondes)
    Laisse ton appli tourner 5 minutes au moins, dans rien toucher, et écoute le ventilateur de refroidissement de ton processeur ... Il ne s'énerve pas, avec cette méthode ? (si l'autre programme met du temps à terminer; bien sûr)

  7. #7
    Membre du Club
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    45
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 45
    Points : 44
    Points
    44
    Par défaut
    Et bien j'ai rien remarqué de particulier, pas de ralentissement de l'autre application qui pourtant est très gourmande en calculs... Mais je suis d'accord que ce n'est pas génial...! Quoi qu'il en soit je ne sais pas comment faire autrement en vba puisqu'apparemment il n'existe pas de timer ?

    Mais si quelqu'un à une meilleure méthode je suis preneur !

  8. #8
    Inactif  

    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    4 555
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 4 555
    Points : 5 537
    Points
    5 537
    Par défaut
    Chépa, moi ...

    Et ceci, en mettant tes instructions dans une procédure nommée toto
    et, dans ta boucle :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Application.OnTime Now + TimeValue("00:00:01"), "toto"
    essaye ...

    Le problème, avec ta méthode actuelle est que si le traitement de ton autre progaramme se fait sur plusieurs minutes, tes doevents dans ta boucle vont générer une surchauffe du type (essaye, tu vas voir) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    depart = Timer
     Do While Timer < depart + 300
       Text1.Text = Now
       DoEvents
     Loop
    Si ton ventilateur est très silencieux : va voir l'évolution, pendant l'exécution, de l'état d'utilisation de ton UC...

  9. #9
    Membre du Club
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    45
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 45
    Points : 44
    Points
    44
    Par défaut
    Je suis conscient que la méthode de la boucle consome un max mais j'avais pas trouvé autre chose, et je suis obligé de faire un suivi de l'évolution des calculs de l'autre programme pour pouvoir continuer l'exécution du code vba lorsque les calculs sont terminés.

    Je vais essayer avec ontime demain !

    Merci

  10. #10
    Membre du Club
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    45
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 45
    Points : 44
    Points
    44
    Par défaut
    Je viens d'esssayer avec Ontime et rien ne se produit une seconde après. La procédure est bien exécutée et il n'y a pas d'erreur au passage sur ontime mais la procédure en question ne se relance pas...

  11. #11
    Membre du Club
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    45
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 45
    Points : 44
    Points
    44
    Par défaut
    Voilà le code, en regardant dans l'aide je n'ai rien vu de spécial ou de compliqué pour l'utilisation de ontime donc je ne vois pas d'où ça vient

    Now + TimeValue("00:00:01") me retourne bien la bonne heure

    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
    Private Sub BouclageTimer()
        fini = LireTerminer
     
        If Not fini Then
            nbEtapes = LireNbEtapes
            etapeEnCours = LireEtapeEnCours
            'fini = LireTerminer
     
            If Not Me.ActiveControl Is Nothing Then
                TextBox1.SetFocus
            End If
     
            TextBox1.Text = LireRetour
            TextBox1.SelStart = Len(TextBox1.Text)
     
            Application.OnTime Now + TimeValue("00:00:01"), "BouclageTimer"
        Else
            fermerButton.Enabled = True
        End If
    End Sub

  12. #12
    Inactif  

    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    4 555
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 4 555
    Points : 5 537
    Points
    5 537
    Par défaut
    Citation Envoyé par Fouinard Voir le message
    Voilà le code, en regardant dans l'aide je n'ai rien vu de spécial ou de compliqué pour l'utilisation de ontime donc je ne vois pas d'où ça vient
    Oui ?
    Et ta boucle, où est-elle passée ???????
    (pas de boucle de répétition ? ====>>> pas de répétition, pardi ...)

  13. #13
    Membre du Club
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    45
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 45
    Points : 44
    Points
    44
    Par défaut
    Bah le but de ontime c'est pas de virer la boucle infinie et de relancer la procédure en elle même à un instant donné ?

  14. #14
    Inactif  

    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    4 555
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 4 555
    Points : 5 537
    Points
    5 537
    Par défaut
    Non !
    Le but est tout bêtement de l'utiliser comme un Timer (Windows gère) et d'éviter l'encombrement de ton processeur par ta méthode précédente ...
    Relis-moi et fais le petit test que je t'ai suggéré plus haut (tu comprendras alors de quoi il s'agit).

  15. #15
    Membre du Club
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    45
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 45
    Points : 44
    Points
    44
    Par défaut
    Donc je viens de relire en effet j'avais pas bien lu que tu me disais de mettre ontime dans la boucle...

    Mais je comprend pas bien en quoi ça soulage le processeur si on a toujours cette boucle infinie qui lance ontime ?

    J'ai essayé en mettant ontime sans boucle dans une procédure dans un module ça marche bien.

    Et je viens de m'apercevoir qu'il fallait que la procédure à éxecuter par ontime soit dans un module et non dans mon code userform ce qui n'est pas pratique pour réafficher les info récupéré par la procédure dans l'userform !?

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

Discussions similaires

  1. Réponses: 7
    Dernier message: 27/06/2011, 15h56
  2. Réponses: 5
    Dernier message: 25/09/2009, 09h08
  3. Réponses: 0
    Dernier message: 11/09/2009, 18h25
  4. Réponses: 3
    Dernier message: 15/04/2009, 07h30
  5. Affichage d'une image après insertion dans une base
    Par leloup84 dans le forum Langage
    Réponses: 9
    Dernier message: 24/01/2006, 16h34

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