Pierr0o
Messages postés18Date d'inscriptionmardi 27 février 2007StatutMembreDernière intervention 3 avril 2007
-
27 févr. 2007 à 11:00
Pierr0o
Messages postés18Date d'inscriptionmardi 27 février 2007StatutMembreDerniè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
Pierr0o
Messages postés18Date d'inscriptionmardi 27 février 2007StatutMembreDerniè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)
jrivet
Messages postés7392Date d'inscriptionmercredi 23 avril 2003StatutMembreDernière intervention 6 avril 201260 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
cs_Exploreur
Messages postés4821Date d'inscriptionlundi 11 novembre 2002StatutMembreDernière intervention15 novembre 201615 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
Pierr0o
Messages postés18Date d'inscriptionmardi 27 février 2007StatutMembreDerniè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
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
jrivet
Messages postés7392Date d'inscriptionmercredi 23 avril 2003StatutMembreDernière intervention 6 avril 201260 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
sobullshit
Messages postés178Date d'inscriptionvendredi 9 février 2007StatutMembreDerniè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