ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

搜索
EH技术汇-专业的职场技能充电站 妙哉!函数段子手趣味讲函数 Excel服务器-会Excel,做管理系统 效率神器,一键搞定繁琐工作
HR薪酬管理数字化实战 Excel 2021函数公式学习大典 Excel数据透视表实战秘技 打造核心竞争力的职场宝典
让更多数据处理,一键完成 数据工作者的案头书 免费直播课集锦 ExcelHome出品 - VBA代码宝免费下载
用ChatGPT与VBA一键搞定Excel WPS表格从入门到精通 Excel VBA经典代码实践指南
查看: 189|回复: 2

按百分比提取题库各类型题存至令一工作簿,求教

[复制链接]

TA的精华主题

TA的得分主题

发表于 2024-2-3 08:55 | 显示全部楼层 |阅读模式
学习制作VBA窗体,过程中对题库科目类型和题型进行随机抽选遇到疑问,请各位老师指点下,新年之前谢谢各位老师了。

现在有题库存放再sheet5中,题库分为判断题,单选题和多选题三部分。

题库抽题.zip (108.18 KB, 下载次数: 0)   VBA存放在模块1中。

image.png
按frm_D6kaoshishuliang窗体中考试科目和数量,对应题库中随机抽取40%的判断题,40%的单选题和20%的多选题,然后将随机抽取的试题存放到sheet4模拟考试组题中存储。


同时根据窗体中出题的总数,再答题窗体frm_D6kaoshi中对应的答题卡内显示出对应数量的控件。后期准备利用控件来快速看对应序号的试题。
'请老师帮助,谢谢了。希望带个注解。。。。。

image.png
image.png
image.png
image.png

Sub 出题()
'按frm_D6kaoshishuliang窗体中考试科目和数量,对应题库中随机抽取40%的判断题,40%的单选题和20%的多选题,然后将随机抽取的试题存放到sheet4模拟考试组题中存储。
'比如目前是煤矿瓦斯抽采作业,试题数量为50,那就从对应题库中按比例抽取判断题,单选题和多选题,存放到sheet4中,;

'再组题页面,我的答案存放再最后一列,答案为frm_D6kaoshi再答题过程中对应题号确定的我的答案。

'第二步:同时根据窗体中出题的总数,再答题窗体frm_D6kaoshi中对应的答题卡内显示出对应数量的控件。后期准备利用控件来快速看对应序号的试题。
'请老师帮助,谢谢了。希望带个注解。。。。。



    Dim arr, arr_choosed(), sarr(), arr_choosed2(), arr_choosed3()
    Dim St_num As Long, i As Long, St_Type As String   '定义题目数量和试题类型
   
    Dim n As Long, dic As Object, j As Long
    Dim M As Long '定义变量
    Dim L As Long
   
    Dim Z As Long
    Dim dic2 As Object
    Dim dic3 As Object
   
   
    If frm_Cmulu.Caption = "煤矿瓦斯抽采作业----模拟考试目录" Then   '此处判断条件为后期新增加题库改动增加部分
        arr = Sheet5.Range("a2", "s" & Sheet5.Range("a" & Rows.Count).End(xlUp).Row)
   
   
    St_num = frm_D6kaoshishuliang.ComboBox2.Value '数量=考试数量窗体的值
    'numQuestion = St_num
   
    St_Type = frm_D6kaoshishuliang.Label2.Caption  '试题类型
   
   
    Sheet4.Range("g6") = "正在答题" '设置答题状态
    Sheet4.Range("g2") = frm_A1denglu.TextBox1.Value  '用户名取的是登录窗体用户名
    Sheet5.Range("g4") = Format(Now, "yyyy/m/d hh:mm")
   
    For i = 1 To UBound(arr)
        If arr(i, 13) = St_Type And arr(i, 3) = "判断题" Then
            n = n + 1
            ReDim Preserve arr_choosed(1 To n)
            arr_choosed(n) = arr(i, 1)
        End If
    Next
   
    For i = 1 To UBound(arr)
        If arr(i, 13) = St_Type And arr(i, 3) = "单选题" Then
            M = M + 1
            ReDim Preserve arr_choosed2(1 To M)
            arr_choosed2(M) = arr(i, 1)
        End If
    Next
   
     For i = 1 To UBound(arr)
       If arr(i, 10) = St_Type And arr(i, 3) = "多选题" Then
           L = L + 1
            ReDim Preserve arr_choosed3(1 To L)
           arr_choosed3(L) = arr(i, 1)
        End If
    Next
   
   
   
    '判断题目数量是否足够
    If n < St_num * 0.4 Then
        MsgBox "题库中没有足够判断题目!"
        Exit Sub
    End If
   
    If M < St_num * 0.4 Then
        MsgBox "题库中没有足够单选题目!"
        Exit Sub
    End If
   
    If L < St_num * 0.2 Then
        MsgBox "题库中没有足够多选题目!"
        Exit Sub
    End If
   
   
    '随机出题
    Set dic = CreateObject("scripting.dictionary")
    Do
        
        dic(arr_choosed(Application.RandBetween(1, n))) = ""
        
        
    Loop Until dic.Count = St_num * 0.4
   
   
    Set dic2 = CreateObject("scripting.dictionary")
    Do
        
        dic2(arr_choosed2(Application.RandBetween(1, M))) = ""
        
        
    Loop Until dic2.Count = St_num * 0.4
   
   
   
    Set dic3 = CreateObject("scripting.dictionary")
    Do
        
        dic3(arr_choosed3(Application.RandBetween(1, L))) = ""
        
        
    Loop Until dic3.Count = St_num * 0.2
   
   
   
    ReDim sarr(1 To St_num, 1 To 3)
   
    For j = 0 To dic.Count - 1
        Z = Z + 1
        sarr(Z, 1) = Z
        sarr(Z, 2) = dic.keys()(j)
        sarr(Z, 3) = arr(dic.keys()(j), 12)
    Next
   
    For j = 0 To dic2.Count - 1
        Z = Z + 1
        sarr(Z, 1) = Z
        sarr(Z, 2) = dic2.keys()(j)
        sarr(Z, 3) = arr(dic2.keys()(j), 12)
    Next
   
   
    For j = 0 To dic3.Count - 1
        Z = Z + 1
        sarr(Z, 1) = Z
        sarr(Z, 2) = dic3.keys()(j)
        sarr(Z, 3) = arr(dic3.keys()(j), 12)
    Next
   
    Unload frm_D6kaoshishuliang
    Sheet4.Range("a2", "f" & Sheet4.Range("a" & Rows.Count).End(xlUp).Row).ClearContents
    Sheet4.Range("a2").Resize(St_num, 3) = sarr
    frm_D6kaoshi.Show
    MsgBox "试题已生成完毕,请考试开始答题!"
   
    End If
   
End Sub

请老师们帮忙看看。。。。。谢谢了提前祝福大家新年快乐。。。。


TA的精华主题

TA的得分主题

 楼主| 发表于 2024-2-3 08:56 | 显示全部楼层
需要做全局变量吗?

TA的精华主题

TA的得分主题

发表于 2024-4-19 14:08 | 显示全部楼层
不错的思路!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

手机版|关于我们|联系我们|ExcelHome

GMT+8, 2024-11-25 21:33 , Processed in 0.038514 second(s), 13 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

沪公网安备 31011702000001号 沪ICP备11019229号-2

本论坛言论纯属发表者个人意见,任何违反国家相关法律的言论,本站将协助国家相关部门追究发言者责任!     本站特聘法律顾问:李志群律师

快速回复 返回顶部 返回列表