Attente de condtions

Fermé
AntoineM07 - 5 avril 2013 à 16:00
totodunet Messages postés 1377 Date d'inscription mercredi 18 mars 2009 Statut Membre Dernière intervention 5 mars 2020 - 8 avril 2013 à 12:09
Bonjour à tous,

je suis un amateur en VBA, je souhaiterai faire attendre mon programme tant qu'une condition n'est pas vérifié sans toute fois utiliser de boucles (pour pas faire "réfléchir" l'ordinateur).

Il faudrai (en gros) que la macro stop à: If a<1 then tant que "a" soit inférieur à 1
Je sais pas trop si je me suis exprimé correctement :/

Merci encore à tous pour ce forum aussi complet !

Ps. Je suis sous Windows 7 64 bits avec excel 2013 pro

9 réponses

totodunet Messages postés 1377 Date d'inscription mercredi 18 mars 2009 Statut Membre Dernière intervention 5 mars 2020 199
5 avril 2013 à 23:33
je n'ai pas trop compris
pourquoi tu ne veux pas utiliser une boucle ? puis de toute manière l'ordi est obligé de comparer à chaque fois si la nouvelle valeur est inférieur à 1 ou non.
il faut savoir que le processeur quand il fait rien, il travaille quand même toujours pour rien ;)
1
Je vous remercie de la réponse aussi rapide,
le problème que j'ai c'est que dès que je lance la macro, le programme Excel ne répond plus, ça marche très bien si je fais du pas à pas mais pas si je le laisse tourner un moment ça "plante"...
J'ai essayé de mettre une condition "sleep" mais rien à faire, je vous montre une partie de ma macro pour une meilleure compréhension.
------------------------
Declare PtrSafe Function GetAsyncKeyState Lib "User32" (ByVal vKey As Integer) As Integer
Declare PtrSafe Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)

Sub touchea()

For i = 1 To 9999
For r = 1 To 1000
If GetAsyncKeyState(65) <> 0 Then
Cells(1, 2) = Cells(1, 2) + 1
Sleep 100
End If
Next r
Next i

End Sub
------------------------
0
totodunet Messages postés 1377 Date d'inscription mercredi 18 mars 2009 Statut Membre Dernière intervention 5 mars 2020 199
6 avril 2013 à 16:30
Sleep correspond à une pause dans le programme. Il est plutôt utilisé pour le confort de l'utilisateur, le temps de lui permettre de voir pas à pas l'avancement comme visualiser le tracé d'une fonction mathématique dans un affichage graphique par exemple.
Donc si je lis bien, le programme fait 9999*1000 = 9 999 000 tours de boucle avec une pause de 100ms à chaque tour de boucle. Le temps du programme est donc d'au moins 999 900s = 277h45min... bref plus de 11 jours ! La fonction Sleep n'est vraiment pas une bonne idée.

Ce que tu veux faire c'est quand tu appuies sur la touche A, ça incrémente de +1 la valeur de la cellule Cells(1,2) ?
0
Oui en effet le temps est un peu exagéré...
Oui sinon c'est ce que je veux faire mais sans qu'Excel ne réponde plus
Merci encore Totodunet
0

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

Posez votre question
totodunet Messages postés 1377 Date d'inscription mercredi 18 mars 2009 Statut Membre Dernière intervention 5 mars 2020 199
6 avril 2013 à 19:41
en fait Excel répond plus à cause de tes boucles for je pense. c'est 9999 et 1000 qui me paraissent exagéré surtout que tu fais une boucle dans une boucle ce qui multiplie le nombre de tours. quel est l'intérêt d'utiliser ces boucles dans ton sous-programme ?
0
En fait j'aimerai un programme qui tourne 1h, je mets une boucle while avec un timer ?
0
totodunet Messages postés 1377 Date d'inscription mercredi 18 mars 2009 Statut Membre Dernière intervention 5 mars 2020 199
7 avril 2013 à 16:19
ok mais qu'est-ce que le programme doit faire pendant cette heure ?
0
Et ben incrémenter la cellule (1,2) a chaque fois que l'utilisateur appuis sur la touche (dans l'exemple, le a), c'est simplement ca pour le moment.
0
totodunet Messages postés 1377 Date d'inscription mercredi 18 mars 2009 Statut Membre Dernière intervention 5 mars 2020 199
8 avril 2013 à 12:09
ok! dans ce cas c'est l'évènement de la macro qui est à changer (à l'appui de la touche A -> executer macro), cela peut se faire en faisant :

Private Sub Workbook_Activate()
Application.OnKey("a","touchea")
End Sub
Sub touchea()
Cells(1,2).Value=Cells(1,2).Value+1
End Sub
0