Pause après appel d'une fonction

Résolu
Pierr0o Messages postés 18 Date d'inscription mardi 27 février 2007 Statut Membre Dernière intervention 3 avril 2007 - 27 févr. 2007 à 11:00
Pierr0o Messages postés 18 Date d'inscription mardi 27 février 2007 Statut Membre Dernière intervention 3 avril 2007 - 27 févr. 2007 à 11:49
Bonjour,

première venue sur ce forum, je débute en développement et je me retrouve confronté à un petit souci.

J'explique..

Je dois appeler une première fonction, qui doit m'insérer dans un tableau excel un certain nombre de données.
Par la suite, ces données doivent etre triées dans différentes feuilles suivant un critère, et ce grâce à une requète.
Jusque la pas de problème si ce n'est que les 2 fonctions s'éxecutent simultanément, ce qui fait que la 2e ne fonctionne pas étant donné qu'il faut un certain temps pour afficher les données avec la 1e fonction.

J'ai bien essayé de faire un DoEvents mais sans succès.

Y a t il un moyen simple de faire une pause, une tempo pour attendre que la 1e fonction s'éxécute pour qu'ensuite la 2e prenne le relais lorsque la 1e a fini? Sachant que le temps d'éxecution de la 1e fonction peut varier.

Cordialement, et merci pour votre aide.

Une ptite partie de mon code:

 If CDate(TXT_DateFin.Text) <= CDate(TXT_DateDeb.Text) Then
                    MsgBox "La date de début est supérieure à la date de fin!!"
                    Else
                        'on appelle la fonction Connexion_SAGE
                        Call Connexion_SAGE(TXT_DateDeb.Text, TXT_DateFin.Text)
                        'on appelle la fonction SAGE_Excel  (ici j'aimerais faire en sorte que la 1e fonction soit terminée avant que l'appel de la 2e fonction se fasse)
                        Call SAGE_Excel
                    End If

12 réponses

Pierr0o Messages postés 18 Date d'inscription mardi 27 février 2007 Statut Membre Dernière intervention 3 avril 2007
27 févr. 2007 à 11:49
Merci à tous pour votre aide, j'ai réussi à m'en sortir.

C'était bel et bien un problème avec le Refresh:

With Sheets("SAGE").QueryTables.Add(Connection:= connstring, Destination:=Sheets("SAGE").Range("A1"), Sql:=sqlstring)
 .Refresh
 

 Affectez-lui la valeur True pour renvoyer le contrôle à la procédure dès que la connexion à la base de données est établie et que la requête est soumise (la requête est mise à jour en arrière plan). Affectez-lui la valeur False pour ne renvoyer le contrôle à la procédure qu'une fois que toutes les données ont été récupérées dans la feuille de calcul.

With Sheets("SAGE").QueryTables.Add(Connection: =connstring, Destination:=Sheets("SAGE").Range("A1"), Sql:=sqlstring)
 .Refresh (False)

Et la plus aucun souci!!!   

Merci encore pour votre aide et votre rapidité.
3
drikce06 Messages postés 2236 Date d'inscription lundi 29 mai 2006 Statut Membre Dernière intervention 29 mai 2008 10
27 févr. 2007 à 11:07
Salut passe par l'API sleep, ou voit aussi avec application.screenupdating = false

Mais normalemnt avant que la deuxième fonction se lace la premiere est forcément terminé!

 Drikce 06

Si la réponse vous convient: Réponse acceptée. Si la réponse vous convient pas:
0
jrivet Messages postés 7392 Date d'inscription mercredi 23 avril 2003 Statut Membre Dernière intervention 6 avril 2012 60
27 févr. 2007 à 11:15
Salut,
Il y a quelque chose que je ne comprends pas dans ta description du problème:
En VBA il n'y a qu'un seul thread (que les pro me corrigent si je dis une bêtise) Il est donc impossible que tes deux fonctions s'execute en même temps.

Je ne comprends pas tres bien ce que tu entends par "'il faut un certain temps pour afficher les données avec la 1e fonction"

Avec le code que tu montres,  SAGE_Excel ne s'éxecute qu'UNE FOIS Connexion_SAGE terminée.
En revanche il est possible qu'un événement intervienne et interrompe l'éxecution de la premiere pour entamer la seconde

@+: Ju£i?n
Pensez: Réponse acceptée
0
Pierr0o Messages postés 18 Date d'inscription mardi 27 février 2007 Statut Membre Dernière intervention 3 avril 2007
27 févr. 2007 à 11:16
  Et bien, le temps d'aller chercher les données et de les copier dans le classeur, le 2e appel est déja lancé, j'ai fais "pas à pas" pour vérifier.

Sinon mon responsable m'a demandé de ne pas utiliser l'API sleep.

J'ai peut être trouvé une autre méthode..
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
drikce06 Messages postés 2236 Date d'inscription lundi 29 mai 2006 Statut Membre Dernière intervention 29 mai 2008 10
27 févr. 2007 à 11:17
Effectivement Jrivet d'où ma remarque (mais je ne suis pas un pro, seulement amateur) d'autant plus que le multithread n'existe pas en VBA!

 Drikce 06

Si la réponse vous convient: Réponse acceptée. Si la réponse vous convient pas:
0
cs_Exploreur Messages postés 4821 Date d'inscription lundi 11 novembre 2002 Statut Membre Dernière intervention 15 novembre 2016 15
27 févr. 2007 à 11:18
Salut,

Peut-être aussi avec une boucle do While, et une variable en Boolean..
Tu déclares ta variable(imaginons Pause As Boolean) en Public, et dans ta fonction SAGE_Excel  en fin de traitement tu la passe en True, ce qui donnerai dans ton code :

If CDate(TXT_DateFin.Text) <= CDate(TXT_DateDeb.Text) Then
                    MsgBox "La date de début est supérieure à la date de fin!!"
                    Else
                        'on appelle la fonction Connexion_SAGE
                        Call Connexion_SAGE(TXT_DateDeb.Text, TXT_DateFin.Text)
                        'on appelle la fonction SAGE_Excel  (ici j'aimerais faire en sorte que la 1e fonction soit terminée avant que l'appel de la 2e fonction se fasse)

                        Do While Pause = True
                        Call SAGE_Excel
                        Pause = False
                        Loop

                    End If

A+
Exploreur
0
drikce06 Messages postés 2236 Date d'inscription lundi 29 mai 2006 Statut Membre Dernière intervention 29 mai 2008 10
27 févr. 2007 à 11:20
Alors desactive la mise à jour de l'écran pendant ce temps là ou alors utilise application.wait ou un truc comme ça!

 Drikce 06

Si la réponse vous convient: Réponse acceptée. Si la réponse vous convient pas:
0
Pierr0o Messages postés 18 Date d'inscription mardi 27 février 2007 Statut Membre Dernière intervention 3 avril 2007
27 févr. 2007 à 11:20
Voila les 2 fonctions. Je pense que le problème vient du "Refresh". La 1e fonction n'a pas le temps de finir de copier les données que la 2e s'exécute.

Function Connexion_SAGE(DateDeb As Date, Datefin As Date)


Dim sqlstring, connstring As String


...
...

With Sheets("SAGE").QueryTables.Add(Connection:=connstring, Destination:=Sheets("SAGE").Range("A1"), Sql:=sqlstring)
 .Refresh


End With


End Function


_________________________________________________________________________

Function SAGE_Excel()


Dim compte As String, compte4021 As String, debit As Double, credit As Double




Worksheets("SAGE").Activate
Worksheets("SAGE").Range("A2").Select
compte = Worksheets("SAGE").Range("A2").Value
debit = Worksheets("SAGE").Range("B2").Value
credit = Worksheets("SAGE").Range("C2").Value


...
...   
...    


   compte4021 = Selection.Value
           
    While compte4021 <> compte And compte4021 <> ""
        ActiveCell.Offset(1, 0).Select
        compte4021 = Selection.Value
    Wend
    If compte4021 = compte Then
        ActiveCell.Offset(0, 2).Value = debit
        ActiveCell.Offset(0, 3).Value = credit
    End If


    Worksheets("SAGE").Activate
    ActiveCell.Offset(1, 0).Select
    compte = Selection.Value
    debit = ActiveCell.Offset(0, 1).Value
    credit = ActiveCell.Offset(0, 2).Value
   
Wend
   
   
End Function


 




 
0
drikce06 Messages postés 2236 Date d'inscription lundi 29 mai 2006 Statut Membre Dernière intervention 29 mai 2008 10
27 févr. 2007 à 11:22
Petit code qui permet d'attendre 1 sec, un peu lourd mais bon, sans sleep ça donne cela:

newHour = Hour(Now())
newMinute = Minute(Now())
newSecond = Second(Now()) + 1
waitTime = TimeSerial(newHour, newMinute, newSecond)
Application.Wait waitTime

 Drikce 06

Si la réponse vous convient: Réponse acceptée. Si la réponse vous convient pas:
0
drikce06 Messages postés 2236 Date d'inscription lundi 29 mai 2006 Statut Membre Dernière intervention 29 mai 2008 10
27 févr. 2007 à 11:24
Désactive la mise à jour de l'écran
Application.ScreenUpdating = False

Active la mise à jour de l'écran
Application. ScreenUpdating = True

 Drikce 06

Si la réponse vous convient: Réponse acceptée. Si la réponse vous convient pas:
0
jrivet Messages postés 7392 Date d'inscription mercredi 23 avril 2003 Statut Membre Dernière intervention 6 avril 2012 60
27 févr. 2007 à 11:30
Re,
Je persiste quand même dans l'idée que VBA ne peut être qu'a un seul endroit. de plus meme si une fonction prend du temps (en l'occurence le refresh), VBA ne continue pas et reste sur cette ligne

@+: Ju£i?n
Pensez: Réponse acceptée
0
sobullshit Messages postés 178 Date d'inscription vendredi 9 février 2007 Statut Membre Dernière intervention 8 juin 2007
27 févr. 2007 à 11:31
ça me rappel mon problème d'hier (que jrivet m'a gentiment aidé à résoudre), à ceci prêt que tout se passe sur la même form et que l'enchainement doit être automatique.
Je pense qu'en utilisant:

While Not hop
   DoEvents
Wend

où hop est Boolean et passe à true à la fin de ta première fonction.
si tintercale ça entre tes 2 fonction ça doi marcher
0
Rejoignez-nous