我有一个Access2013多项选择测试Db,它以随机顺序将测试问题返回给表单。这样可以正常工作,但对于每个问题,每次都会以相同的顺序显示答案。此特定Db的每个表都设置为:
tblTest(当然)
ID(PK)
场
卷
问题否
科
问题
答案
答案
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
我假设我可能需要一个子表单来获得答案,但不知道如何正确地生成问题和答案。我能得到的任何帮助都深表感谢。
答案 0 :(得分:0)
我假设您在查询ORDER BY子句中使用Rnd()函数。随机化ID的答案,而不是Q_ID。然后使用子表单/子报表容器主/子链接来同步记录。我测试过,不需要任何VBA。在报告/子报告排列中使用这些表来打印问卷。没有看到以随机顺序在表单/子表单中显示这些表是如何有用的。如果向测试库添加新问题和答案,则需要此表单/子表单,而不是用户响应。