Sélection aléatoire de questions en fonction d'un thème

Bonjour à tous,

Je m'entraîne depuis quelques temps sur Excel à créer des fichier qui permettent de gagner du temps dans la vie de tous les jours.

Je ne m'étais encore jamais lancé dans du VBA et je rencontre de nombreuses difficultés pour parvenir à mon objectif.

Dans le cadre de mon travail, j'ai énormément d'informations à retenir et ceci nécessite un entretien régulier des connaissances. Je souhaite donc créer un programme qui génère automatiquement et aléatoirement des questions prélevées dans un base de données, ceci en respectant un thème sélectionné lors du lancement.

Vous trouverez un trame de mon travail en pièce-jointe. Elle rendra sans doute tout cela plus clair.

J'ai longuement cherché sur internet mais je ne parviens pas à appliquer à mon problème les diverses solutions que j'ai trouvées

1- Sur le premier UserForm vous pouvez voir que j'ai inséré une liste. Je souhaiterai qu'apparaissent dans celle-ci les thèmes définis en "DATA" et suivants lesquels sont classées les différents questions qui sont dans "QUESTIONS"

L'objectif est qu'en cliquant sur "Démarrer questionnaire", seules les questions correspondantes au thème sélectionné soient prises en compte. Je ne parviens'arrive malheureusement pas à faire afficher ma liste dans la macro, et encore moins à faire que le choix est un impact sur la suite...

2- Sur le deuxième UserForm, la tâche est plus complexe (à mes yeux de béotien)

a- J'aimerais qu'apparaissent dans le grand cadre une question sélectionnée aléatoirement dans la banque de questions, toujours fonction du thème initialement désiré.

b- Que s'affiche dans les 4 cadres en-dessous les 4 choix de réponses possibles.

c- Que le fait de cliquer dans la case à valiser indique s'il s'agit de la bonne réponse. Le cas échéant, que la bonne réponse soit surlignée de rouge.

d- Que le fait de cliquer sur "nouvelle question" génère une nouvelle questions sur ce même UserForm

e- Que le fait de cliquer sur "Résultats" indique le pourcentage de réussite.

Sans doute me suis-je lancé dans un chantier trop compliqué pour mon humble niveau mais il s'agit là d'un besoin essentiel. Je persévère depuis quelques temps mais toutes mes tentatives se soldent pas des échecs...

Le fichier "BETA" qui est joint risque de vous paraître ridicule. Mon niveau étant faible, vous l'aurez compris, toutes les choses que j'ai créée ne sont peut-être pas les plus à même de remplir le cahier des charges que je me suis fixé.

Je vous remercie par avance pour votre partage de connaissances.

Bien cordialement,

Flavien.

60beta.xlsm (65.10 Ko)

Bonjour,

vous pouvez vous inspirez de QCM et QCM_USF dans la partie téléchargement.

Les codes sont accessibles, il y a peut-être aussi des commentaires....

La page de téléchargement ? Voyez dans ma signature

@ bientôt

LouReeD

Bonjour,

Salut LouReed !

Ayant vu ton fichier, je n'ai pas pu m'empêcher de tripatouiller...

Mes premières modifs :

1) Ajout d'une colonne (en B) sur QUESTIONS, pour le n° de question dans le thème, laquelle sera servie automatiquement à la sélection du thème :

Private Sub Worksheet_Change(ByVal Target As Range)
    Dim n%
    If Target.Count > 1 Then Exit Sub
    If Not Intersect(Target, [QThm]) Is Nothing Then
        If Target <> "" Then
            n = WorksheetFunction.CountIf([QThm], Target.Value)
            Target.Offset(, 1) = n
        End If
    End If
End Sub

Pas de prise en charge des effacements éventuels, trop d'éléments sont encore indécis, mais on pourra y revenir le cas échéant.

Et la première colonne (Thème) est nommée : QThm (en dynamique, intitulé exclus)

2) Ton tableau sur DATA, repositionné en A1 (c'est une vraie maladie que de vouloir toujours sauter la 1re ligne et/ou la 1re colonne !!! , histoire de s'obliger à des contorsions par la suite), intitulé réécrit en Thème (conforme au libellé de la base QUESTIONS, quand on adopte un libellé, on évite de le faire varier... ), une colonne ajouter pour : Nb Questions, et tableau ainsi modifié converti en tableau Excel !

La colonne ajoutée prend une formule :

=NB.SI(QThm;[@Thème])

et la colonne Thème est nommée : LstThm, nom qui vient définir la liste de validation de la colonne A de QUESTIONS.

Ainsi si tu ajoutes un thème il sera automatiquement intégré, le tableau s'étendra (avec la formule), et la liste de validation le prendra en compte sans autre intervention.

Ce premier post avant d'attaquer le vif du sujet, était principalement destiné à me tenir informé des interventions sur le sujet...

Cordialement.

Pas encore réagi !

Bon ! Après pas mal d'autres modifications assorties de code pour que l'ensemble fonctionne, que je n'ai pas le temps pour le moment de décrire ni d'expliquer, voilà un fichier...

J'ai conservé le masquage des 2 premiers Userforms qui resteront chargés tant que tu ne fais pas Quitter. Une session questions commence donc au démarrage sur Lancer et se termine sur Quitter : à tout moment tu peux visualiser tes résultats, cumulés sur l'ensemble de la session. Chaque réaffichage du Userform questions se fait avec une nouvelle question tirée aléatoirement parmi les questions du thème. Les questions ne reviennent pas durant une même session. Quand tu as épuisé les questions d'un thème, un message te le signale et évidemment pas de nouvelle question dans ce cas, la dernière réponse reste en attendant que tu retournes au choix ou quitte. Une réponse est définitive, elle conduit à l'affichage du résultat, bon ou mauvais : la bonne réponse se colore en vert dans tous les cas, si la réponse donnée est mauvaise elle se colore en rouge.

Là le test est une loterie... ! mais j'ai tout de même fait 60% de bonnes réponses ! Je n'ai testé que sommairement, donc signaler les bogues ou autres anomalies... Pour l'instant, objectif repas !

Cordialement.

Bonjour et merci pour vos réponses !

J'ai pour l'instant essayé de reprendre le fichier QCM_USF de LouReed pour comprendre comment tout cela fonctionne.

C'est d'un niveau très élevé pour moi malgré les tutoriaux que j'ai pu effectuer jusqu'à alors et mes différentes bidouilles

Il n'y avait effectivement aucun intérêt à sauter la première colonne haha...

Il me semble comprendre au travers de vos réponses que vous mettez un fichier à ma disposition issu de mon draft mais je ne vois aucun fichier joint à votre message. Peut-être ai-je mal compris

Je comprends tout à fait l'importance de conserver la même nomenclature. Il était effectivement maladroit de ma part de la changer en fonction de la page. En revanche, je ne savais pas qu'il est possible de faire en sorte qu'un liste s'agrandisse d'elle même en cas d'ajout de données.

Si vous avez un petit exemple sur tableur des explications que vous m'avez fournies je suis preneur car mon niveau de débutant ne me permet pas de comprendre en l'état... Je suis désolé. J'apprends excel sur le tas et c'est un domaine assez complexe à débroussailler

Encore merci pour votre aide

Mes excuses très plates ! J'ai oublié de joindre le fichier !

93kiemar-beta.xlsm (75.92 Ko)

Bonsoir,

c'est là qu'on voit que je suis loin d'être un programmeur VBA !

Quand je lit un code où je ne comprend rien !

Il me reste du chemin !

Bonne chance à vous "autodidacte" Kiemar !

@ bientôt

LouReeD

MFerrand a écrit :

Mes excuses très plates ! J'ai oublié de joindre le fichier !

Super merci beaucoup. N'ayant pas Excel à portée de main, je regarderai ça dès que j'en aurai le temps et je reviendrai vers vous sans faute.

LouReeD a écrit :

Bonsoir,

c'est là qu'on voit que je suis loin d'être un programmeur VBA !

Quand je lit un code où je ne comprend rien !

Il me reste du chemin !

Et oui... Je n'ai jamais eu le temps de faire une formation sur excel et je n'ai malheureusement pas des heures entières à y consacrer, étant par ailleurs très largement occupé par mon métier. J'essaie d'apprendre au fur et à mesure de mes besoins, ce qui n'est sans aucun doute pas la bonne solution car ça porte souvent à mettre la charrue avant les boeufs. Je fais quelques tutoriaux rudimentaires et je me lance. Pour information, j'ai découvert le VBA vendredi soir J'y ai passé tout mon temps libre du week-end J'ai certes appris, mais le domaine m'est encore terriblement inconnu

Cependant, comme le disait Jacques Coeur, "à coeur vaillant, rien d'impossible". Donc je compte bien persévérer tant que je n'ai pas atteint mon objectif. Grâce à votre aide, cela me paraît d'autant plus atteignable !

Merci encore et bonne soirée à vous deux.

Re !

Pour créer un nom de plage dynamique, on utilise une définition de la plage utilisant une formule, au cas particulier, pour QThm :

=DECALER(QUESTIONS!$A$2;;;NBVAL(QUESTIONS!$A:$A)-1)

On définit ainsi une plage débutant en A2 et dimensionnée en lignes sur le nombre de valeurs de la colonneA -1 (pour tenir compte de l'intitulé). Le nom couvrira toujours la plage à la dimension utilisée qu'elle aura à tout moment...

Pour LstThm :

=Tableau1[Thème]

Là on ne référence simplement que la colonne du tableau Excel. Ces tableaux étant auto-extensibles, la plage est naturellement dynamique.

Définitions des noms à voir dans le gestionnaire de noms.

Entre autres modifications, j'ai ajouté une 3e colonne au tableau sur la feuille Data, avec une formule (EQUIV) qui recherche la première occurrence du thème dans la plage QThm. La Base étant triée par thèmes (et n° de question dans chaque thème), cela indique la position de la question 1 de chaque thème dans la plage. Ce qui permet à la fonction TirageQ qui opère le tirage de la question selon le thème qu'on lui passe en argument, de l'utiliser pour renvoyer directement la position de la question tirée dans la plage de questions...

Je suppose que tu auras besoin de plus d'explications... Je te laisse regarder de plus près avant, d'autant que cela prend plus de temps d'expliquer que d'écrire le code !

Pour information, j'ai découvert le VBA vendredi soir

C'est donc tout frais !!! Cela se fait difficilement en un jour ! Tout au plus tu pourrais avoir assimilé le contenu d'un chapitre...

Tu en as encore pas mal en réserve, dans un premier temps, pour pouvoir utiliser ce qu'on t'apporte et l'analyser, il convient que tu soies familiarisé avec l'éditeur et ses différents composants, et que tu aies une vue minimale sur les types de modules, et les variables et procédures et leur portée, de façon à ne pas passer ton temps à te poser des questions sur les cas les plus courants d'utilisation de ses éléments que tu cotoyer en permanence en programmant.

Bonne soirée.

Bonjour,

MFerrand a écrit :

Pour information, j'ai découvert le VBA vendredi soir

C'est donc tout frais !!! Cela se fait difficilement en un jour ! Tout au plus tu pourrais avoir assimilé le contenu d'un chapitre...

Tu en as encore pas mal en réserve, dans un premier temps, pour pouvoir utiliser ce qu'on t'apporte et l'analyser, il convient que tu soies familiarisé avec l'éditeur et ses différents composants, et que tu aies une vue minimale sur les types de modules, et les variables et procédures et leur portée, de façon à ne pas passer ton temps à te poser des questions sur les cas les plus courants d'utilisation de ses éléments que tu cotoyer en permanence en programmant.

Oui, c'est effectivement tout frais et j'ai en plus très peu de temps à y consacrer !

J'ai effectué quelques tutoriels et lu des explications sur les bases du langage VBA. J'ai aussi observé en détails la construction des différents programmes que j'ai pu trouver afin de voir leur structure et de pouvoir comprendre plus rapidement la logique qui compose ce langage.

MFerrand a écrit :

Je suppose que tu auras besoin de plus d'explications... Je te laisse regarder de plus près avant, d'autant que cela prend plus de temps d'expliquer que d'écrire le code !

Je te remercie énormément pour ton aide, le programme que tu m'as fourni répond exactement à une partie de mes besoins et ça m'est d'une grande aide. J'ai observé en détails la façon dont tu as écris les lignes de code mais je t'avoue qu'il y a en effets de nombreux points que je ne comprends pas encore.

Je te prie de m'excuser pour les délais de réponse mais comme je te l'ai déjà dit, je n'ai que très peu de temps à consacrer à cela malgré l'importance que ce programme a pour moi

J'ai une question sans doute très bête qui concerne le tableau excel en lui-même.

Je ne parviens à comprendre quelles sont les références de cette formule :

=MATCH([@Thème];QThm;0)

Merci encore pour ton aide précieuse.

Bonne soirée,

Flavien

Bonsoir,

Ça, c'est sur ton petit tableau Data. Tu travailles sur un Excel anglais pour avoir MATCH...

En français c'est la fonction EQUIV, cette fonction cherche une valeur dans une liste et renvoie son rang dans la liste (ou #N/A si elle ne trouve pas).

Le premier argument est la valeur cherchée : [@Thème] qui n'est autre que la valeur en première colonne de ton tableau, exprimé en référence structurée car il s'agit d'un tableau Excel.

Le second est la plage dans laquelle on le recherche : QThm désignée par son nom (voir ci-après).

Le 3e : 0 indique qu'on recherche la valeur exacte.

La plage nommée QThm est la colonne A de la Base de questions (feuille QUESTIONS) à partir de A2. Tu noteras que la référence est définie par une formule :

=DECALER(QUESTIONS!$A$2;;;NBVAL(QUESTIONS!$A:$A)-1)

qui permet de définir la hauteur de la plage à partir du nombre de valeur dans la colonne, ce qui en fait un nom de plage dynamique, toujours adapté à la dimension de la plage.

Le petit tableau Data, pour revenir à ce dernier, liste les thèmes en première colonne, laquelle est également nommée (LstThm), et également dynamique, là du fait qu'il s'agit d'un tableau Excel, lequel l'est automatiquement. Cette liste alimente une liste déroulante et la liste de la ComboBox de ton premier formulaire.

Avec ces deux autres colonnes ce tableau permet de disposer d'informations en permanence. La 2e colonne calcule pour chaque thème le nombre de questions figurant dans la Base, ce qui facilitera le tirage aléatoire des questions de chaque thème.

La 3e indique la ligne où commence chaque thème. On vient donc chercher l'information ici plus rapidement que l'on avait à la calculer chaque fois que l'on en a besoin.

Cela permet par exemple à la fonction de tirage des questions : TirageQ, une fois tiré le numéro d'ordre de la question dans le thème, consigné dans une variable x, d'appliquer un correctif à x :

    x = x + [LstThm].Cells(Thm, 3) - 1

en lui ajoutant le numéro de ligne de début du thème dans la base, prélevé dans cette colonne (Thm est la variable indiquant le rang du thème dans la liste, donc la ligne dans ce tableau), diminué de 1 car les questions commencent à 1, et renvoyer ainsi directement le numéro de ligne de la question tirée dans la base.

NB-Tous les numéros de ligne dont il est question sont des numéros de ligne dans les plages nommées et non dans la feuille, ne t'inquiète donc pas si en regardant de près tu constates un décalage (en principe de 1 les plages commençant ligne 2) avec la ligne de la feuille... A partir du moment où on dispose de noms, on adresse en utilisant les plages nommées, sans plus avoir à se préoccuper des feuilles.

Cordialement.

Rechercher des sujets similaires à "selection aleatoire questions fonction theme"