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 :

Attendre qu'un recalcul soit effectué avant de continuer le code


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Inscrit en
    Janvier 2004
    Messages
    173
    Détails du profil
    Informations forums :
    Inscription : Janvier 2004
    Messages : 173
    Par défaut Attendre qu'un recalcul soit effectué avant de continuer le code
    Bonjour,

    j'ai fait un programme vba qui modifie une cellule dont le contenu est un argument d'une fonction d'une cellule Excel. La fonction en question est une fonction Reuters, mais si on prend une fonction par défaut de Excel, c'est pareil. Imaginons donc le cas suivant :

    Dans A1, j'ai stocké la valeur 1
    Dans A2, j'ai stocké la valeur 2

    Dans A3, il y a la formule "=A1 + A2".

    Imaginons que je fasse un programme VBA dont une instruction modifie A2 (par exemple en mettant 3). Je souhaite que mon programme attende que la cellule A3 se mette à jour avant d'exécuter la ligne suivante. Est ce possible ?

    Juste pour ceux qui veulent comprendre pourquoi : le résultat renvoyé par la fonction Reuters est primordial pour la suite de mon programme. Dans le cas de la comme, l'actualisation est très rapide, mais dans le cas de la fonction Reuters, cela peut mettre une demi seconde, suffisament pour que le programme VBA soit déjà plusieurs lignes plus loin.

    Je précise que j'ai essayé d'insérer l'instruction suivante entre mes deux lignes :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    application.wait now + TimeValue("00:00:01")
    mais le problème est qu'Excel arrête le recalcul des cellules pendant la seconde d'arrêt...

    Quelqu'un peut il m'aider ?

    Je vous remercie par avance.

  2. #2
    Membre chevronné Avatar de delphine35
    Femme Profil pro
    Analyste BO
    Inscrit en
    Novembre 2009
    Messages
    265
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Canada

    Informations professionnelles :
    Activité : Analyste BO

    Informations forums :
    Inscription : Novembre 2009
    Messages : 265
    Par défaut
    tu as essayé avec Calculate :

    Calculate
    ou
    Application.Calculate
    ou
    Worksheets(1).Calculate
    ou
    Worksheets(1).Rows(2).Calculate

  3. #3
    Membre confirmé
    Inscrit en
    Janvier 2004
    Messages
    173
    Détails du profil
    Informations forums :
    Inscription : Janvier 2004
    Messages : 173
    Par défaut
    Merci Delphine pour cette réponse aussi rapide ! Impressionant !

    C'est ce que je suis en train d'essayer en ce moment. J'applique la fonction calculate sur la cellule qui contient la formule, mais ça ne change rien. Peut être faut il l'appliquer sur la cellule qui stocke la réponse. Je vais aussi essayer de recalculer tout le classeur, on ne sait jamais. Je te redis ça dans 5 minutes.

    EDIT : non malheureusement, ça ne fonctionne pas. J'ai inséré un calculate sur tout le classeur entre mes deux lignes. Je te remercie encore pour ta suggestion.

  4. #4
    Membre confirmé
    Inscrit en
    Janvier 2004
    Messages
    173
    Détails du profil
    Informations forums :
    Inscription : Janvier 2004
    Messages : 173
    Par défaut
    J'ai trouvé une fonction programmée par quelqu'un d'autre qui permet de mettre en pause l'exécution de la macro sans arrêter les recalculs.

    Voici le code :

    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 PauseTimer(ByVal nSecond As Single) 
    Dim t0 As Single 
         'temps de référence 
         t0 = Timer 
         'boucle d'attente 
         Do While Timer - t0 < nSecond 
               Dim dummy As Integer 
               dummy = DoEvents() 
               'si on dépasse minuit,il faut 
               'retrancher un jour 
               If Timer < t0 Then 
                   t0 = t0 - 24 * 60 * 60 
               End If 
         Loop 
    End Sub
    Je pense qu'il y a une solution plus élégante, mais en attendant, je vais utiliser ça.

  5. #5
    Inactif  
    Profil pro
    Inscrit en
    Février 2010
    Messages
    517
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 517
    Par défaut
    salut

    et si tu essayais quelque-chose du genre :
    - relevé (dans une variable) de la valeur de ta cellule A3 avant l'appel de ta fonction
    - une boucle tant que la valeur de la cellule est égale au contenu de la variable :laisser la main au système, genre, donc :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    mavar = range("A3").value*
    'tes instructions d'ap^pel de fonction
     
    while range("A3").value = mavar
      doevents
    wend

  6. #6
    Membre confirmé
    Inscrit en
    Janvier 2004
    Messages
    173
    Détails du profil
    Informations forums :
    Inscription : Janvier 2004
    Messages : 173
    Par défaut
    Merci babaothe pour cette suggestion. C'est une bonne idée...que j'avais malheureusement déjà testée et qui ne fonctionne pas. En fait, le programme boucle tout le temps car la mise à jour ne semble pas s'effectuer pendant que la boucle tourne. Mais je te remercie quand même pour ton idée.

Discussions similaires

  1. Réponses: 1
    Dernier message: 22/06/2014, 18h37
  2. [PostgreSQL] Attendre la fin d'une requête avant de continuer le code
    Par renardchan dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 17/06/2011, 10h55
  3. Réponses: 19
    Dernier message: 13/01/2008, 23h33
  4. Attendre qu'une fenetre soit fermée avant de continuer.
    Par parp1 dans le forum VB 6 et antérieur
    Réponses: 2
    Dernier message: 29/05/2007, 17h43
  5. Attendre qu'une tâche soit terminée avant d'en lancer une autre
    Par guidav dans le forum Général JavaScript
    Réponses: 6
    Dernier message: 16/04/2007, 17h07

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