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 :

Macro dans un timer, le timer passe après ?


Sujet :

Macros et VBA Excel

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    123
    Détails du profil
    Informations personnelles :
    Âge : 48
    Localisation : France, Calvados (Basse Normandie)

    Informations forums :
    Inscription : Novembre 2008
    Messages : 123
    Par défaut Macro dans un timer, le timer passe après ?
    Bonjour,

    j'ai voulu programmer un timer pour qu'il me dise toutes les secondes quel est la valeur contenue par un compteur s'incrémentant de 1.

    A ma grande surprise, je n'obtiens pas de valeurs intermédiaires toutes les secondes mais seulement à la fin de la boucle d'incrémentation du compteur. Comment puis-je faire ? merci

    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
    27
    Public ProchainChrono, Départ, k
    Sub Demarre()
     Départ = Timer()
     majChrono
    End Sub
    Sub majChrono()
     
    Call compteur
     Range("a1") = ProchainChrono
     Range("a2") = k
     ProchainChrono = Now + TimeValue("00:00:01")
     Application.OnTime ProchainChrono, "majChrono"
    End Sub
     
    Sub arret()
    Application.OnTime ProchainChrono, Procedure:="majChrono", Schedule:=False
    End Sub
     
    Sub compteur()
     
    For i = 1 To 100000000
     
    k = k + 1
     
    Next
     
    End Sub

  2. #2
    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 jerem7w,

    Je n'ai pas bien compris ta demande. Ce que tu souhaites faire c'est d'avoir un timer en cellule A1 et un compteur et cellule A2, c'est ça ?
    Que veux-tu afficher exactement dans les deux cellules ?

    Ta Macro à l'heure actuelle dit ceci :
    -> Incrémente de 1 par 1 k jusqu'à 100000000
    -> Affiche moi en A1 Now + 1 seconde
    -> Affiche en A2 k
    -> etc...

    La macro exécute donc dans l'ordre ce que tu lui demandes.

    J'attends ton retour.

    Cordialement,
    Kimy

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    123
    Détails du profil
    Informations personnelles :
    Âge : 48
    Localisation : France, Calvados (Basse Normandie)

    Informations forums :
    Inscription : Novembre 2008
    Messages : 123
    Par défaut
    Salut Kimy,

    cette macro doit effectivement afficher :
    le timer en a1
    k en a2

    et ce toutes les secondes, sans attendre que k ait atteint 100000000.

    Pourquoi fais-je fais cela ? Pour tester le fonctionnement du timer, car dans un programme plus sophistiqué j'ai mis une barre de progression qui doit afficher le nombre de lignes traitées.
    Ce nombre de ligne est compté dans une sous macro. Donc je voulais me servir du timer pour récupérer l'info à intervalles fixes : -> donne mois chaque secondes le nombre de lignes que tu as déjà traité.

    Voilà tout.

    Merci

  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
    En bref, tu veux faire tourner deux macros en même temps :
    - une qui compte le nombre de lignes traitées,
    - une qui toutes les secondes affiche ce nombre de lignes.

    J'ai pigé ?

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    123
    Détails du profil
    Informations personnelles :
    Âge : 48
    Localisation : France, Calvados (Basse Normandie)

    Informations forums :
    Inscription : Novembre 2008
    Messages : 123
    Par défaut
    Kimy,

    oui, c'est exactement cela.

    jeremy

  6. #6
    Expert éminent
    Avatar de Marc-L
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2013
    Messages
    9 468
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2013
    Messages : 9 468
    Par défaut

    Bonjour, bonjour,

    VBA n'étant pas multi-tâches …

    Mais bon, tenter DoEvents en ligne n°24.

  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
    jerem7w,

    Le VBA ne peut pas utiliser de thread... J'ai tenté d'utiliser le DoEvents permettant de redonner la main au processeur (dans la limite de ma compréhension VBA) à plusieurs endroits sans succès.

    Je pense donc que la solution de contournement de ton problème serait de sortir de ta boucle de traitement tous les X lignes et de l'afficher à l'utilisateur. Je ne vois pas d'autres solutions.

    Cordialement,
    Kimy

    EDIT : j'ai également essayé à la ligne 24 comme la stipulé Marc-L.

  8. #8
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    123
    Détails du profil
    Informations personnelles :
    Âge : 48
    Localisation : France, Calvados (Basse Normandie)

    Informations forums :
    Inscription : Novembre 2008
    Messages : 123
    Par défaut
    Merci messieurs,

    Faute de thread, je sortirai de mes boucles selon une intervalle prédéfinie.

    Jeremy

  9. #9
    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,

    Regarde du coté de "GetTickCount". Lance la proc "Test" pour l'arrêt, pose un point d'arrêt dans la proc. A toi de voir comment tu veux stopper ! K s'incrémente toutes les secondes en A1 :
    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
    27
    28
    29
    30
    31
    32
     
    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 I As Long
        Dim K As Long
     
        For I = 1 To 100000000
     
            Minuterie 1000 '<-- 1 seconde
     
            K = K + 1
            Range("A1").Value = K
     
        Next
     
    End Sub
    Hervé.

  10. #10
    Expert éminent
    Avatar de Marc-L
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2013
    Messages
    9 468
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2013
    Messages : 9 468
    Par défaut

    En fait, on peut faire du "multi-tâche" avec Excel en utilisant un API Windows pour lancer une procédure en parallèle
    (sujet déjà traité sur ce forum) ou encore utiliser Excel comme donneur d'ordre à Windows pour lancer des procédures
    indépendantes en .vbs comme dans ma méthode Let It Bee de la discussion
    Accélérer une requête sur des multiples pages Web située dans le forum Contribuez

    Mais ici je n'en vois pas l'intérêt car il suffit de tester le temps au sein de la boucle :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Sub Demo()
            T! = Timer
        For L& = 1 To 100000000
            C& = C& + 1
            If Timer >= T + 1 Then T = Timer:  [A1:B1].Value = Array(Fix(T), C)
        Next
    End Sub
    __________________________________________________________________________________________

    Merci de cliquer sur pour chaque message ayant aidé puis sur pour clore cette discussion …

Discussions similaires

  1. [XL-2010] Utilisation de modules macro dans des feuilles protégées par mot de passe
    Par davimaje dans le forum Macros et VBA Excel
    Réponses: 32
    Dernier message: 14/11/2014, 17h32
  2. Detecter ecriture dans une textBox avec Timer
    Par Shargat dans le forum ASP.NET
    Réponses: 10
    Dernier message: 23/04/2009, 14h13
  3. Réponses: 12
    Dernier message: 22/12/2005, 09h22
  4. [Warning] Macro dans .lib séparé
    Par sorry60 dans le forum x86 16-bits
    Réponses: 3
    Dernier message: 20/04/2005, 17h05
  5. Macro dans excel permettant de voir si un fichier est ouvert
    Par VirginieGE dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 12/08/2004, 07h51

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