我有一个Access2013多项选择题测试Db,它以随机顺序将测试问题返回到表格中。这还可以,但对于每个问题,每次的答案都以相同的顺序显示。此特定Db的每个表都设置为:
tbl测试(当然)
ID(PK)
课程
体积
问题NO
部分
问题
Ans A
Ans B
Ans C
Ans D
正确答案
我知道这不是优化的数据,因此无法随机化答案。一些网站建议拆分表,所以我现在所做的是创建两个独立的表,如下所示:
tblRnd_Ques
ID(PK)
课程
体积
问题编号
部分
问题
tblRnd_Ans
ID(PK)
Q_ID(FK)
回答
正确(是/否)
然后,我创建了通过随机化tblRnd_Ques.ID和tblRnd _Ans.Q_ID来随机化两个表的查询,然后创建了一个连接两个随机查询的查询。我想做的是将问题显示在表单中,然后在qryRnd_Ans中找到答案,并按照它们在查询中的出现顺序返回答案。需要做的是显示问题,然后在记录集中搜索以找到下一个相关答案,并将其作为答案#2等。每个问题都有一个唯一的ID号,在整个记录集中重复4次,并给出相应的答案。
我在几个网站上搜索过,寻找实现这一点的方法,包括使用FindNext等。我是VBA的新手,不知道如何让它完成我需要的任务。以下是我用来返回每个问题的代码(感谢stackoverflow之前的帮助):
Private Sub LoadNextQuestion() 'reusable code to load questions
rcdCnt = rcdCnt + 1
If (rcdCnt > 100) Or rsCourse.EOF Then
GetQuestionTotal
LogTestResults
DoCmd.OpenReport "rptResults_Test"
rsCourse.Close
DoCmd.Close acForm, "frmIntro"
DoCmd.Close acForm, "frmQues"
DoCmd.OpenQuery "qryEmptyQuestions"
DoCmd.OpenQuery "qryEmptyResults"
DoCmd.CloseDatabase
Exit Sub
End If
With rsCourse
intQues = !ID
strCDC = !CDC
intVol = !Vol
strSect = !Section
strQues = !Question
strAns = !Answer
blnCorr = !Correct
ctlQ_No = rcdCnt
ctlQuestion = !Question
ctlSection = ![Section]
MsgBox intQues & _
Chr(13) & Chr(10) & "CDC: " & strCDC & _
Chr(13) & Chr(10) & "Volume: " & intVol & _
Chr(13) & Chr(10) & "Section: " & strSect & _
Chr(13) & Chr(10) & "Q: " & strQues & _
Chr(13) & Chr(10) & "A: " & strAns & _
Chr(13) & Chr(10) & blnCorr
ctlAns_A = ![Answer]
' ctlAns_B = ![Ans B] (Commented out for testing purposes)
' ctlAns_C = ![Ans C] (Commented out for testing purposes)
' ctlAns_D = ![Ans D] (Commented out for testing purposes)
strSect = ctlSection
strCorrectAnswer = ![Correct]
optAnswer = Null 'clears previous answer
optAnswer.SetFocus
.MoveNext
End With
End Sub
我想我可能需要一个子表单来获得答案,但不知道如何正确生成问题和答案。我能得到的任何帮助都深表感谢。
我想您在查询ORDER BY子句中使用的是Rnd()函数。随机回答ID,而不是Q_ID。然后使用子窗体/子报表容器主/子链接来同步记录。我进行了测试,不需要任何VBA。使用报表/子报表排列中的这些表打印调查表。看不到在具有随机化顺序的窗体/子窗体中显示这些表是多么有用。如果将新的问题和答案添加到测试库中,而不是用于用户响应,则需要此表单/子表单。