ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

[分享] 选枝随机、答案调整,已解决。

[复制链接]

TA的精华主题

TA的得分主题

发表于 2020-4-17 22:06 来自手机 | 显示全部楼层
好的,是我没有看清测试文档的格式要求。

TA的精华主题

TA的得分主题

发表于 2020-4-18 23:17 | 显示全部楼层
以下代码是对6楼代码的调整,亦可用于对有制表符分隔的选项及没有解析文本的题目,只作了简单测试
  1. Dim answer As String
  2. Sub test2()
  3.     '随机重排题目与选项。题目每个选项可单独一段,或以制表符分隔
  4.     Dim i As Integer
  5.     Dim j As Integer
  6.     Dim oText As String
  7.     Dim regEx As Object
  8.     Dim Match As Object
  9.     Dim data() As String   '原数据
  10.     Dim data2() As Variant '随机重排后数据
  11.     Dim r As Variant
  12.     Dim oDoc As Document
  13.    
  14.     Set oDoc = ActiveDocument
  15.     oText = oDoc.Content.Text
  16.     Set regEx = CreateObject("vbscript.regexp")
  17.     With regEx
  18.         .Global = True:
  19.         .MultiLine = True
  20.         .Pattern = "(^\d+)([\..、][^\r]*[\((])([A-Z])([\))]\r)(([A-Z][\..、][^\r\t]*[\r\t])+)(【解析】[^\r]+\r)?"
  21.         For Each Match In .Execute(oText)
  22.             ReDim Preserve data(8, i)
  23.             For j = 0 To 4
  24.                 data(j + 1, i) = Match.Submatches(j)
  25.             Next
  26.             data(6, i) = Match.Submatches(6) '解析,一个段落,可以没有解析部分
  27.             data(7, i) = myOptions(data(3, i), data(5, i), Replace(data(6, i), Chr(13), ""))
  28.             data(8, i) = answer
  29.             i = i + 1
  30.         Next
  31.     End With
  32.    
  33.     r = Randomizing(UBound(data, 2))
  34.     ReDim data2(UBound(r))
  35.     For i = 0 To UBound(r)
  36.         data2(i) = i + 1 & data(2, r(i)) & data(8, r(i)) & data(4, r(i)) & data(7, r(i))
  37.     Next
  38.    
  39.     Documents.Add.Content.Text = Replace(Join(data2, vbCrLf), Chr(13) & Chr(13), Chr(13))
  40.     MsgBox "共随机重排了" & i & "题。"
  41. End Sub

  42. Function Randomizing(n As Integer) As Variant
  43.     '题号与选项顺序随机调整
  44.     Dim c As Integer
  45.     Dim d As Object
  46.    
  47.     Set d = CreateObject("Scripting.Dictionary")
  48.     Randomize
  49.     Do Until d.Count = n + 1
  50.         c = Int(Rnd * (n + 1))
  51.         d(c) = ""
  52.     Loop
  53.     Randomizing = d.Keys
  54. End Function

  55. Function myOptions(mydata1 As String, mydata2 As String, mydata3 As String) As String
  56.     '选项与解析重排,传递参数依次为答案、选项和解析文本
  57.     Dim i As Integer
  58.     Dim n As Integer
  59.     Dim t1() As String
  60.     Dim t2() As String
  61.     Dim k
  62.    
  63.     Do While InStr(mydata2, vbTab & vbTab) > 0
  64.         mydata2 = Replace(mydata2, vbTab & vbTab, vbTab)
  65.     Loop
  66.     If InStr(mydata2, vbTab) > 0 Then mydata2 = Replace(mydata2, Chr(13), vbTab)
  67.     t1 = Split(mydata2, IIf(InStr(mydata2, vbTab) = 0, Chr(13), Chr(9)))
  68.     n = UBound(t1) - 1
  69.     k = Randomizing(n)
  70.     answer = Chr(k(Asc(mydata1) - 65) + 65)
  71.     For i = 0 To UBound(k)
  72.         t1(i) = Replace(Chr(k(i) + 65) & Mid(t1(i), 2), Chr(13), "")
  73.     Next
  74.     ReDim Preserve t1(UBound(k))
  75.     WordBasic.SortArray t1 '排序
  76.    
  77.     If mydata3 <> Empty Then t2 = Explain(k, mydata3)
  78.     myOptions = Join(t1, IIf(InStr(mydata2, vbTab) = 0, Chr(13), Chr(9))) & IIf(mydata3 <> Empty, vbCrLf & "【解析】", "") & Join(t2, "")
  79. End Function

  80. Function Explain(k As Variant, t As String) As Variant
  81.     '处理解析文本。假设除选项字母外没有相同的单独选项字母
  82.     Dim i As Integer
  83.     Dim j As Integer
  84.     Dim regEx As Object
  85.     Dim Match As Object
  86.     Dim sb() As Long
  87.     Dim atext() As String
  88.    
  89.     Set regEx = CreateObject("vbscript.regexp")
  90.     With regEx
  91.         .Global = True:
  92.         .MultiLine = True
  93.         .Pattern = "(\b[A-Z]\b)([^A-Z\r\t]+)"
  94.         For Each Match In .Execute(t)
  95.             With Match
  96.                 For j = 0 To UBound(k)
  97.                     If Chr(j + 65) = .Submatches(0) Then
  98.                         t = Left(t, .FirstIndex - 1) & Replace(t, .Submatches(0), Chr(k(j) + 65), .FirstIndex, 1)
  99.                         ReDim Preserve sb(i)
  100.                         sb(i) = .FirstIndex
  101.                         Exit For
  102.                     End If
  103.                 Next
  104.             End With
  105.             i = i + 1
  106.         Next
  107.     End With
  108.     For i = 0 To UBound(sb)
  109.         ReDim Preserve atext(i)
  110.         If i <> UBound(sb) Then atext(i) = Mid(t, sb(i) + 1, sb(i + 1) - sb(i)) Else atext(i) = Mid(t, sb(i) + 1)
  111.     Next
  112.     WordBasic.SortArray atext
  113.     Explain = atext
  114. End Function
复制代码

评分

3

查看全部评分

TA的精华主题

TA的得分主题

发表于 2020-4-19 12:00 来自手机 | 显示全部楼层
谢谢谢谢,老师的助人与分享精神令人钦佩,虽然我水平低,看不懂,但祝好人康安!手机回复,无法评分,后补。

TA的精华主题

TA的得分主题

 楼主| 发表于 2020-4-30 15:15 | 显示全部楼层
sylun 发表于 2020-4-18 23:17
以下代码是对6楼代码的调整,亦可用于对有制表符分隔的选项及没有解析文本的题目,只作了简单测试

sylun大侠,我另开一贴,解决一一个小问题,请移步搭手相助。
先谢了。
http://club.excelhome.net/thread-1534895-1-1.html

TA的精华主题

TA的得分主题

发表于 2020-5-3 20:18 | 显示全部楼层
标准化题库的设计,对于进入题库的题目本身是有格式要求的,那就是“一致”,也就是说:要符合某个“标准化命题规范”,凡是要进入题库的题目,必须要先通过“合规”审核筛选,对于不合规的内容,需要打回去返工处理。

总之,“系统”的问题,首先要用“系统”的方法解决,这才是正道。
比如,解决本问题的“系统方法”,首先是要编制一个“标准化命题规范”,其次是对题库内容的审核和筛选,最后才谈得上设计一个“题库系统”进行自动化随机命题的必要。

此外,“系统”有容易固化的通病,所以,要尽量建立一个适应能力强的系统,这样一来,“系统”的标准就最为至关重要,这个道理就象通信业的3G\4G\5G标准的代际竞争以及同代的国产和外国标准之争一样,在同一个时间节点,扩展能力强的标准通常更容易推广。

TA的精华主题

TA的得分主题

 楼主| 发表于 2020-5-3 21:20 | 显示全部楼层
谢谢指教,大虾所言极是。
一个合乎规范的题库确实重要,它使后续的处理变得容易和高效,这是毋庸置疑的。只可惜这个不是很规范的题库早已有之,如果不考虑解析部分,倒也十分好用。删除解析部分,程序能完全合乎我的要求,这在我的另一贴已经实现。但解析本就是题目的有机组成部分,删去岂不是踩背治坨,毫无意义。如果再规范试题库,只能一个一个地手动处理,繁琐至极,叫人不甘。这真是鸡肋……所以请大虾就本例深入看下,看是否有解决方案,挽救本程序功成于一篑

TA的精华主题

TA的得分主题

 楼主| 发表于 2020-5-4 16:38 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
本帖最后由 weiyingde 于 2020-5-7 11:29 编辑

谢谢以上各位,在大家的启发和点拨下,穷根究底,反复尝试,已经完美解决了问题。再次谢谢各位的帮助,谢谢。
谢谢duquancai大侠的原始代码和思路,
谢谢sylun大侠的热心帮助,
谢谢ggmmlol大侠的指导。
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

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

GMT+8, 2024-11-28 04:36 , Processed in 0.047990 second(s), 8 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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