Microsoft 365 Générer facilement un QCM

  • Initiateur de la discussion Initiateur de la discussion M2C2
  • Date de début Date de début

Boostez vos compétences Excel avec notre communauté !

Rejoignez Excel Downloads, le rendez-vous des passionnés où l'entraide fait la force. Apprenez, échangez, progressez – et tout ça gratuitement ! 👉 Inscrivez-vous maintenant !

M2C2

XLDnaute Nouveau
Bonjour,

Pour des besoins d'enseignements, j'ai besoin de générer souvent et rapidement des QCM pour mes étudiants.
J'ai rassemblé environ 80 questions et leurs réponses dans un fichier Excel (voir un extrait en PJ)
Pour chaque question, j'ai nommé les plages "Question01" ; "Question02" ; etc ...

Je voudrais pouvoir créer de nouvelles feuilles dans lesquelles seraient présentées un tirage aléatoire de X questions parmi les 80 (Voir un ex sur la Feuille 'Epreuve #1' dans lequel un tirage de 2 questions aurait été fait sur les 5 présente dans la Base de Questions) ?

J'ai fouillé sans trouver comment, via les formules d'Excel, comment on pourrait demander "sélectionne moi aléatoirement X plages de cellules dont le nom commence par 'QuestionXX' !"

Peut-être est-ce mon choix de présentation en lignes plutôt qu'en colonnes qui n'est pas le bon ?
(Le souci, c'est que chaque question contient un nombre variable de réponses possibles !)

Je vous remercie par avance de votre aide et bravo pour ce forum très utile que je viens de découvrir !
 

Pièces jointes

Solution
Voir le module de classe ListeAléat pour trouver les explications pour chaque méthode de ce type d'objet.
Le bouton peut être mis ailleurs.
Changez la procédure comme suit :
VB:
Sub Tirage()
   Dim Wsh As Worksheet, NomPlage As String, RngSrc As Range, RngCbl As Range, N As Byte
   Set Wsh = ThisWorkbook.Worksheets.Add
   Wsh.Name = Format(Date, "dd-mm-yyyy")
   Set RngCbl = Wsh.[A1]
   Randomize
   With New ListeAléat
      .Init 85
      For N = 1 To 45
         NomPlage = "Question" & Format(.Aléat(N), "00")
         On Error Resume Next
         Set RngSrc = Feuil1.Range(NomPlage)
         If Err Then MsgBox " Plage """ & NomPlage & """ inaccessible.", vbCritical, "Tirage": Exit Sub
         On Error GoTo 0
         RngSrc.Copy...
Bonjour le fil, M2C2 (Bienvenue sur le forum)

[Suggestion en passant]
Trouver l'inspiration (ou pas) dans les archives
et/ou
Puiser dans l'existant pour éviter trop de fatigue 😉
[/Suggestion en passant]
 
Re

Dans le lien que j'ai mis, il y a plusieurs fichiers exemple
Aucun ne te convient?
Notamment un de ceux proposés par kjin
 
Merci infiniment à tous les deux
Je vais regarder ça mais j'utilise la Pack 365 sur Mac et ce que je découvre, c'est que ActiveX n'est pas aisément utilisable sur Mac !
Tout ça est trop compliqué pour mon petit besoin ... Je vais continuer à produire mes sujets "A la main" !
Merci encore pour votre aide
 
Rhooooooo ... C'est -presque- le Nirvana !-)
Si je pouvais abuser ... C'est possible d'avoir le même mais avec deux changements :
1) le bouton sur la 1ere page
2) quand on clic dessus, il créer un nouvel onglet à la date du jour avec 45 questions tirées au hasard, parmi un total de 82 qui se situent sur la 1ere page

J'ai beau regarder votre code VBA ... j'y comprend couic !
 
Voir le module de classe ListeAléat pour trouver les explications pour chaque méthode de ce type d'objet.
Le bouton peut être mis ailleurs.
Changez la procédure comme suit :
VB:
Sub Tirage()
   Dim Wsh As Worksheet, NomPlage As String, RngSrc As Range, RngCbl As Range, N As Byte
   Set Wsh = ThisWorkbook.Worksheets.Add
   Wsh.Name = Format(Date, "dd-mm-yyyy")
   Set RngCbl = Wsh.[A1]
   Randomize
   With New ListeAléat
      .Init 85
      For N = 1 To 45
         NomPlage = "Question" & Format(.Aléat(N), "00")
         On Error Resume Next
         Set RngSrc = Feuil1.Range(NomPlage)
         If Err Then MsgBox " Plage """ & NomPlage & """ inaccessible.", vbCritical, "Tirage": Exit Sub
         On Error GoTo 0
         RngSrc.Copy Destination:=RngCbl
         Set RngCbl = RngCbl.Offset(RngSrc.Rows.Count)
         RngCbl.Resize(, 2).ClearContents
         Set RngCbl = RngCbl.Offset(1)
         Next N
      End With
   RngCbl.Resize(50, 2).ClearContents
   End Sub
 
Dernière édition:
Je viens d'intégrer votre code, @Dranreb et cela fonctionne parfaitement : me voilà un enseignant heureux !
Merci encore et bravo pour votre compétence et votre générosité !
Me voilà "Supporter XLD Bronze" de votre Forum
leonardo dicaprio bravo GIF
 
Dernière édition:
- Navigue sans publicité
- Accède à Cléa, notre assistante IA experte Excel... et pas que...
- Profite de fonctionnalités exclusives
Ton soutien permet à Excel Downloads de rester 100% gratuit et de continuer à rassembler les passionnés d'Excel.
Je deviens Supporter XLD

Discussions similaires

Réponses
1
Affichages
692
Réponses
22
Affichages
2 K
Réponses
3
Affichages
951
Retour