Intersepter le clic gauche de la souris pour l'annuler

Bonsoir à tous,

petit soucis sur une application :

C'est un QCM, il y a un compte à rebours pour répondre aux questions, le choix de la réponse se fait par un clic sur une des 4 cellules correspondantes, à ce moment là que la réponse soit bonne ou pas, on affiche la nouvelle question avec les 4 nouvelles réponses et on relance le compte à rebours. Jusque là tout va bien.

Lorsque le compte à rebours arrive à 0, alors on affiche la nouvelle question avec les 4 nouvelles réponses et on relance le compte à rebours. Jusque là tout va bien.

Mais si pendant ce petit laps de temps, le joueur clic sur une des cellules de réponse, alors ce clic est "conservé" en mémoire, et lors de la fin d'affichage de la question suivante, le clic est "libéré" et empêche le joueur de jouer "correctement"...

Ma question : lors du lancement de la macro de changement de question par le fait du compte à rebours à 0, est-il possible de "dire" à Excel de ne pas prendre en compte les différents clic de souris, et qu'une fois que la question est affichée, alors on redonne la main à la souris ?

voici le fichier :

Merci par avance.

@ bientôt

LouReeD

Bonsoir LouReed, (re plutôt)

Un peu long à lire pour entrer dans le mécanisme (surtout le soir avancé ), mais selon ta description, je suppose que tu mémorises le clic sur procédure d'évènement.

La solution me paraît donc d'interrompre l'interception d'évènements entre la fin d'une question et le début de la suivante, quitte pour bien baliser ce passage en affichant : "réponse enregistrée" ou "temps écoulé pas de réponse" juste après avoir mis EnableEvents à False, puis "Nouvelle question" ou "Question suivante", suivie de EnableEvents à True, suivi de l'affichage de la question.

Cordialement.

Bonsoir,

j'ai essayé en mettant le enable à false dans la procédure de changement automatique de question puis à true juste après l'affichage des questions, mais en fait rien ne change, si je clic sur les quatre réponses alors l'application grade en mémoire les clics et les quatre question suivantes "jouent" toutes seules...

Faut-il pour que cela marche faire apparaître les messages dont vous parlez ?

@ bientôt

LouReeD

Si tu prends en compte le clic sur l'évènement SelectionChange, lorsque celui-ci est interrompu, le clic ne devrait pas être pris en compte.

(NB- prenant en compte le clic gauche, tu es obligé de déplacer la sélection à l'affichage de la question, car un clic sur la cellule sélectionnée ne déclenche pas l'évènement).

Si la question n'admet qu'une réponse, il faut que tu prévois de modifier la réponse si le questionné se ravise et la change avant la fin du temps.

Je suppose que tu enregistres les réponses dans une variable (une par question ou un tableau) propre à chaque question. Si aucun clic durant une question, aucune réponse ne devrait être enregistrée pour la question, si changement de réponse en cours de temps seule la dernière doit être dans la variable.

Pour ce qui est de l'affichage du déroulement, ça me semblait un bon moyen de baliser les séquences :

Events = False

Affichage fin de question

====quand l'affichage a lieu, plus d'évènement ! (puisque arrêté avant)

Il me semble qu'il faut un DoEvents juste avant False (pour dernier clic à prendre).

Question suivante

Events = True

Là un autre DoEvents avant True (pour éliminer les clics nuls)

Je suis peut-être à côté par rapport à ton programme, mais il me semble que le problème ne peut venir que des clics de sélection intervenant durant l'exécution d'une procédure, et donc soit traités à la fin, soit durant un DoEvents.

En fait, une question est posée, la cellule active est la W1 (je crois) les quatre réponses sont situées sur des plages nommées Rep_1

Rep_2, Rep_3 et Rep_4.

Le joueur n'a la possibilité que de cliquer une fois sur une des 4 plage. Lors d'un clic, le clic est détecté par sélection_change.

Si target dans une des plages rep_x alors on regarde si c'est sur la bonne réponse, dans ce cas, bonne ou mauvaise réponse, on annule le chronomètre, la procédure "question suivante" est lancée, elle affiche une nouvelle question, avec les quatre réponses, et initialise le chronomètre de réponse. W1 est activé. Si clic en dehors des plages Rep_x alors W1 est sélectionné pour attendre un nouvel essai.

Ca , ça marche.

Un chrono est lancé, si le chrono arrive à zéro, alors la procédure, question suivante est lancée, elle affiche une nouvelle question, avec les quatre réponses, et initialise le chronomètre de réponse. W1 est activé.

Tout ceci fonctionne.

Le problème est le suivant :

lors de la réflexion sur une question (chronomètre > à 0, question posée, réponses affichées ou pas), si on clic "à la suite" A, B, C et D, alors ces quatre clic sont "conservés" en mémoire par excel, du coup au premier clic, dès que le réponses sont affichées, la procédure de teste de réponse est lancée, avec celle-ci celle "nouvelle question", la nouvelle question est affichée, ainsi que le réponses et là la clic sur B est traité, et lance la procédure de teste de réponse est lancée, avec celle-ci celle "nouvelle question", la nouvelle question est affichée, ainsi que le réponses et là le troisième clic est traité et lance la procédure de teste de réponse est lancée, avec celle-ci celle "nouvelle question", la nouvelle question est affichée, ainsi que le réponses et là le quatrième clic est traité et la procédure de teste de réponse est lancée, avec celle-ci celle "nouvelle question", la nouvelle question est affichée, ainsi que le réponses ect...

S'il y avait eu un 5ième clic sur la croix de fermeture d'Excel, et bien Excel demande si l'on veut enregistrer avant de quitter, etc...

J'ai essayé comme vous avez dit de mettre des Application.EnableEvents à false , à true après, j'ai essayé avec une variable pour "shunter" la sélection_change de la feuille "jeu", mais rien y fait....

Dans l'absolu ce n'est pas très grave, mais il arrive à certain joueur de cliquer sur une réponse après réflexion à la question 1 (par exemple) juste après que le chrono de réponse soit passé à 0, du coup le clic arrive trop tard pour la question 1, mais il arrive trop tôt pour la question 2...

Pouvez vous m'aider Maréchal ? Là je calle...

Le code est sur le fichier un peu plus haut....

@ bientôt

LouReeD

Bonjour,

lors de la réflexion sur une question (chronomètre > à 0, question posée, réponses affichées ou pas), si on clic "à la suite" A, B, C et D, alors ces quatre clic sont "conservés" en mémoire par excel (...)

Je crois qu'il faut que tu trouves le pourquoi de la chose !

Je n'ai pas trop été enclin à plonger dans ton code, déjà volumineux... et j'ai pensé qu'illustrer le mécanisme que je préconisais allait me prendre moins de temps !

J'ai donc fait une démo simpliste (comme j'aime ! )...

Par rapport aux indications que j'avais exprimées sur un post précédent, je me suis aligné sur ton schéma : une seule réponse (la première) à chaque question doit être prise en compte. D'autre part, la réflexion se poursuivant toujours, j'ai incliné à penser qu'interrompre les évènements n'était pas la bonne formule et je lui substitue une variable booléenne pour donner cours ou non à l'enregistrement de la réponse.

J'ai donc fait une base de questions-réponses sur feuille QR : 4 questions, chacune occupe une ligne, en A la question, en B:E les 4 réponses à chaque question. Plage nommée : QuRp.

Sur la 1re feuille, emplacement des question et réponses délimité. La zone de réponses est nommée : ZRép.

Les questions sont formulées pour l'exemple en "Question x" (x allant de 1 à 4), et les réponses : "Réponse @" (@ variant de A à D, suivi d'un point, suivi du numéro de la question [pour que l'on puisse éventuellement identifier par la suite qu'il s'agit bien de la réponse à la bonne question (mais vu la méthode utilisée, cela n'apporte aucune preuve...)]

Deux boutons sur la feuille : un pour lancer le questionnaire, l'autre pour le réinitialiser. Le bouton de lancement est désactivé une fois le questionnaire lancé, la réinitialisation le rétablit actif pour lui permettre de lancer à nouveau.

4 variables publiques niveau module : t (pour fixer le moment où le temps de réponse sera écoulé), qec (integer, sert à conserver le numéro de la question en cours), Rép(1 To) (tableau d'integer pour enregistrer pour chaque question [indice 1 à 4] un numéro de réponse selon la cellule cliquée [1 à 4, correspondant à A à D]), AttRép (booléenne, à True lorsqu'on attend une réponse, à False dans le cas contraire).

La réinitialisation, outre effacer la zone Question-Réponse pour redémarrer, remet qec à 0 et vide le tableau Rép. AttRép est à False (soit parce qu'on vient d'ouvrir le classeur, soit parce que systématiquement ramené à False en cas de réponse donnée, ou de non réponse dans le temps imparti), et t importe peu puisque initialisé à chaque question.

Le schéma fonctionnel :

  • Le bouton de lancement lance la procédure Questionnement (qui affichera chaque question successivement).
  • Cette proc. incrémente qec, pour avoir le numéro de question à poser, elle déplace la sélection hors de la zone réponse, affiche la question et les réponses voulues (qec les identifie...), puis met AttRép à True, initialise t (maintenant + 10 s.) et programme le lancement d'une procédure CpteTmps au temps t (soit 10 secondes plus tard).
  • La main est alors au questionné. S'il répond : la procédure SelectionChange intervient : vérification que une seule cellule est sélectionnée et qu'elle se trouve dans la zone réponse, si AttRép est True la proc. se poursuit et commence par remettre AttRép à False, et annule le déclenchement programmé de CmpteTmps à l'instant t. Elle enregistre alors la réponse en définissant le rang de la cellule sélectionnée dans la zone réponse. Si le tampon contient des instructions en attente d'exécution, c'est le moment de les éliminer (DoEvents, voir plus loin...). La proc. lance alors la procédure CpteTmps avec l'argument True (argument optionnel) qui indique à cette procédure qu'une réponse a été donnée.
  • Si le questionné n'a pas répondu dans le temps imparti, la procédure CpteTmps est lancée, car programmée, avec l'argument False (par défaut).
  • La procédure CpteTmps intervient donc à l'issue de chaque question : elle teste la valeur de qec pour savoir s'il s'agit de la dernière question (auquel cas elle ne relancera pas pour la suivante) et définit un message en conséquence. Elle complète le message selon qu'elle a été lancée avec True ou False (réponse fournie ou non), mais si False, AttRép n'a pas été ramenée à False et elle le fait. Dans ce cas, elle opère aussi un vidage éventuel du tampon par DoEvents (voir plus loin...) Enfin, elle relance Questionnement pour la question suivante, ou si la dernière passée, elle lance l'affichage des Résultats.
  • La proc. Résultats est juste là à des fins de vérification pour la démo... Inutile de s'étendre.

- J'ai placé 2 DoEvents aux emplacements où si une manipulation du questionné se trouve en attente, on la vide sans que cela puisse impacter les réponses, par acquis de conscience. Mais je vois mal la possibilité d'introduire quelque chose dans le déroulement : réponse = un msg s'affiche, il ne peut rien faire que OK et question suivante ; temps écoulé = msg et même schéma...

Je te laisse triturer cette démo dans tous les sens : si tu parviens à me produire ton erreur (ou une autre), je m'y replonge... Sinon cela devrait permettre d'analyser comparativement ton mécanisme d'enchaînement des questions et détecter le point qui provoque ton erreur.

Cordialement.

Bonsoir,

comment vous dire .... Merci !

Non pas d'avoir trouver une solution... mais pour l'effort effectué pour créer cette petite application !

J'ai enlevé vos MSGBOX, et votre code fonctionne, dès un clic, la question change, avant même d'avoir pu cliquer une deuxième fois !

Le soucis sur mon application est que le joueur a le temps de cliquer plusieurs fois car il peut y avoir une temporisation sur l'affichage des réponses pour laisser le temps au joueur de lire la question sans que ce temps soit pris en compte dans le chrono de réponse. Durant ce temps, on peut donc cliquer plusieurs fois et ces clics sont mémorisés..... [20 minutes plus tard, après un Nième essai]

Voilà c'est trouvé ! Dans le code "Nouvelle question" :

Sleep ([Temp_Rep].Value)

DoEvents

ActiveSheet.Cells(1, 23).Activate

Application.EnableEvents = True

un Sleep pour l'affichage des réponses

à l'issue de la tempo on "efface" les différents clics qui ont eu lieu lors de cette tempo,

on active la cellule d'attente pour "retirer" la dernière sélection du joueur"

on remet la surveillance événementielle de la feuille.

Et ô miracle cela fonctionne ! merci encore à vous pour m'avoir mis sur la voie !!!!

Parce que je voulais à tous prix d'avoir à "mettre" des MsgBox lors d'une partie pour limiter "les actions joueur"

J'en ai profiter comme vous l'avez suggérer de "neutraliser" les boutons lors du jeu, car en effet le bouton "Arrêt" était accessible pendant la tempo d'affichage des réponses, également celui de réglage...

C'est une mauvaise nouvelle pour Sébastien, il va falloir que je mette cette nouvelle version en ligne.

Je vous dis @ bientôt sur le forum

LouReeD

Content que tu aies abouti !...

Rechercher des sujets similaires à "intersepter clic gauche souris annuler"