Boucle_pause

Salut

comment mettre la boucle en pause jusqu'à l'entrée de la réponse dans cell J21 et puis continuer les autres opérations comme dans cet ex

5lembmc-incr.xlsm (21.69 Ko)

Bonjour,

Tu doubles la condition de temps laissé pour la réponse par une condition de valeur dans J21 : l'une OU l'autre condition interrompt l'attente...

Mais il te faut à la suite : soit signaler que le temps est écoulé en cas de non réponse, soit évaluer la réponse et indiquer si juste ou non, puis effacer J21.

Cordialement.

merci pour la réponse

mais comment faire ça

Si tu maîtrises le code que tu as produit, tu ne devrais pas avoir de grosses difficultés à le compléter... Sinon, je ne peux m'y lancer immédiatement, je dois m'absenter, mais je regarderai à mon retour.

Cordialement.

Je t'attend bon retour

Merci

J'ai été un peu trop rapide en te disant à compléter... ! On n'est plus du tout dans la même situation consistant à afficher des valeurs en boucle à cadence régulière. On doit interagir avec l'utilisateur en fonction de ses réactions...

On reprend donc tout !

D'abord la procédure initiale ne va faire apparaître qu'une valeur et programmer le lancement d'une procédure HorsTemps au terme du délai, laquelle signalera le dépassement de délai et relancera la procédure pour l'inscription suivante. Si l'utilisateur répond, on annule le lancement de la proc. HorsTemps, on récupère sa réponse et on la fait évaluer par une procédure EvalRéponse, laquelle indiquera s'il s'agit d'une bonne ou mauvaise réponse et relancera la procédure pour l'inscription suivante.

L'utilisation d'une cellule n'est pas vraiment adéquate pour la saisie d'une réponse dans un délai bref, parce qu'elle doit être validée par la touche Entrée qui prendra un temps supplémentaire. On lui substitue une TextBox dont on pourra intercepter la valeur dès la saisie.

Les variables d'incrémentation du tour, et de fixation du délai doivent être placées en variable module, pour conserver leur valeur qui sera utilisée par plusieurs procédures. L'une des procédures se trouvant dans un autre module, le variables doivent être publiques.

Public ta, i As Integer, k As Integer

La variable k ne figurait pas dans la proc. initiale, on verra son rôle plus loin...

Le lancement de la procédure principale devra distinguer le démarrage (on attaque en début de liste) des autres relance (poursuite...) On la dote donc d'un argument optionnel booléen dont la valeur True signalera qu'on démarre à zéro, et lancée sans argument (puisque optionnel) donc avec False, elle incrémentera la liste.

Elle n'est plus affectée au bouton Démarrer mais sera lancée au démarrage par une procédure affectée au bouton.

Sub Démarrer()
    With ActiveSheet.OLEObjects("TextBox2")
        .Object.Value = ""
        .Activate
    End With
    Lembmc True
End Sub

Cette procédure (bouton), initialise la Textbox réponse (efface valeur résiduelle éventuelle), l'active (positionnement du curseur dans la TextBox, de façon que l'utilisateur n'ait qu'à taper la réponse, sans se soucier de se positionner), et lance la proc. principale avec l'argument True.

Sub Lembmc(Optional init As Boolean)
    Dim da%
    da = CInt(ActiveSheet.OLEObjects("TextBox1").Object.Value) / 1000
    ActiveSheet.OLEObjects("TextBox2").Object.Value = ""
    i = IIf(init, 1, i + 1)
    With [Plage]
        If i > .Rows.Count Then i = 0: Exit Sub
        k = Len(CStr(.Cells(i, 2)))
        ActiveSheet.Shapes("Ellipse").TextFrame.Characters.Text = .Cells(i, 1)
    End With
    ta = Now + TimeSerial(0, 0, da)
    Application.OnTime ta, "HorsTemps", ta + TimeSerial(0, 0, 1)
End Sub

Elle récupère la valeur du délai...

(NB- Comme on revient à un délai mesurant des réactions humaines, il devient loisible de l'exprimer en secondes dans la TextBox1... Je te laisse la décision, dans ce cas supprimer la division par 1000)

Elle initialise i à 1 (au démarrage lancé par le bouton) ou l'incrémente s'il s'agit de passer au tour suivant.

Elle vide la TextBox réponse...

(NB- En principe, celle-ci est vide lorsque la procédure principale intervient, mais j'ai noté que dans quelques cas le vidage ne s'exécutait pas, d'où ce doublement de la commande pour assurer le vidage.)

Elle teste la valeur de i : s'il dépasse la longueur de la liste, le jeu est fini, donc on s'arrête.

Elle initialise k au nombre de caractère de la réponse (ce qui permettra de ne pas intervenir lors de l'action de l'utilisateur pour répondre avant qu'il ait tapé un nombre de caractères suffisant).

Elle inscrit la valeur dans l'ellipse (ça, ça n'a pas changé).

Elle initialise ta : heure à laquelle le délai sera dépassé, et programme le lancement de HorsTemps sur cette heure.

Si donc l'utilisateur ne répond pas dans le délai :

Sub HorsTemps()
    Dim rép%
    rép = MsgBox("Vous n'avez pas répondu dans le temps imparti !" & Chr(10) _
     & "Voulez-vous continuer ?", vbYesNo + vbQuestion, "Temps écoulé !")
    If rép = vbYes Then Lembmc
End Sub

On le lui signale en lui demandant s'il souhaite continuer (il peut en effet vouloir recommencer, par exemple avec un délai plus long pour la réponse...)

S'il continue, on relance la proc. principale...

(NB- La réponse aux message peut s'opérer par simple appui sur Entrée pour répondre 'Oui' ou 'OK' (boutons par défaut), ce n'est que s'il répond 'Non' qu'il aura à cliquer sur le bouton 'Non'.)

S'il répond dans le délai, sa saisie déclenchera une procédure TextBox_Change qui, elle, se trouve dans le module de la feuille.

Private Sub TextBox2_Change()
    If Len(TextBox2.Value) = k Then
        Application.OnTime ta, "HorsTemps", ta + TimeSerial(0, 0, 1), False
        With TextBox2
            EvalRéponse IIf(IsNumeric(.Value), CDec(.Value), .Value)
        End With
    End If
End Sub

Une telle procédure Change intervient à chaque caractères tapé dans la TextBox. Donc pour ne pas réagir trop tôt on teste si la longueur de la réponse correspond à k, longueur attendue.

Quand c'est le cas, on annule la proc. HorsTemps, et on lance la procédure d'évaluation avec en argument la réponse (la condition est destinée à éviter une erreur en cas de non saisie de nombre...)

Il est certain qu'avec cette méthode, si l'utilisateur ne saisit qu'un caractère pour une réponse qui en exige 2, ou 2 pour une réponse qui en exige 3, sa réponse sera en fait mauvaise mais interprétée comme non réponse dans le délai. C'est lié au déclenchement sur la frappe selon le nombre de caractères saisis et intervenir sur un validation de la saisie par la touche Entrée nous ferait revenir aux inconvénients de la saisie dans une cellule.

Il m'apparaît toutefois que l'on pourrait tourner la difficulté dans la proc. HorsTemps en testant si la TextBox est vide ou non. Si elle ne l'est pas, HorsTemps, au lieu d'afficher son message, lancerait alors la proc. d'évaluation de la réponse...

Modification à faire ultérieurement si elle te convient.

Sub EvalRéponse(rép)
    Dim r, br As Boolean
    r = [Plage].Cells(i, 2)
    If rép = r Then br = True
    MsgBox IIf(br, "Bonne ", "Mauvaise ") & "réponse ! " & IIf(br, "Continuons !", _
     "La bonne réponse était : " & r & "."), vbInformation, "Votre réponse..."
    ActiveSheet.OLEObjects("TextBox2").Object.Value = ""
    Lembmc
End Sub

La proc. d'évaluation récupère la réponse à fournir et la compare avec celle fournit. Elle initialise une variable booléenne à True si la réponse est bonne, ce qui permettra de moduler le message à l'utilisateur selon la réponse.

Puis, elle vide la TextBox et relance pour la suite.

Cordialement.

7lembmc-incr.xlsm (30.00 Ko)

MERCI

est ce que on peut dérouler l’opération sans utiliser le temps c'est à dire sans afficher le msgbox (voulez vous continuer) laisser le test libre .

enfin c'est génial, Je veux apprendre plus de programmation à vous

Oui on peut !

Svp

Comment ça et aussi comment afficher la reponse bonne ou mauvaise apres l'appuyer sur le btn entrer

Il faut que tu précises le résultat final que tu veux obtenir...

Pour l'instant, on défilait les questions mais on n'enregistrait rien !

Non c'est juste Le résultat résultant après avoir appuyé sur le bouton entrer ainsi que l'operation suivante s'apparaît immédiatement après le résultat apparaît et merci

Mais que veux-tu comme résultat ?

Le détail pour chaque question ? Le nombre de réponses justes ou fausses ? ...

salut

premièrement je veux le msgbox (bon ou mauvais résultat) s’apparaît juste si j'appuie sur le btn entrer

deuxièmement enlever le temps de continuation d'une opération à l'autre c'est à dire juste après le résultat s'afficher

l'opération suivante commence.

Bonjour,

Je dois pas être bien réveillé !

Dans la version actuelle, l'utilisateur clique sur Démarrer et ça démarre...

Il répond (sans appuyer sur Entrée !) : on lui affiche bonne ou mauvaise réponse => à maintenir donc d'après ton indication ?

Il n'a pas répondu dans le délai : on lui signale et demande s'il veut continuer => à supprimer donc (message et question) selon tes indications antérieures ? On continue d'office...

Et à la fin ? Pour l'instant ça s'arrête, rien de plus. Doit-on lui afficher : x bonnes réponses sur 11 ?

Cordialement.

merci en tous les cas

C'est à toi de choisir ce que tu veux avoir... Regarde cette dernière mouture...

Cordialement.

5lembmc-incr.xlsm (30.62 Ko)

merci infiniment

Rechercher des sujets similaires à "boucle pause"