ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

[求助] 选枝随机重排:思路闭塞、混乱,求开塞。

[复制链接]

TA的精华主题

TA的得分主题

发表于 2020-4-10 08:36 | 显示全部楼层 |阅读模式
本帖最后由 weiyingde 于 2020-4-10 13:04 编辑

下面的程序是对杜大侠的代码进行模仿改造,由于学艺不精,无以延续,求大侠开塞。
1、感觉思路不通。因为要修改原文内容,这会不会是Excel删除一样,必须是倒序?
我对word查找的机理不是很熟悉,私下以为:顺序修改,每改动一次,会对原先查找到的range地址产生影响,造成定位不准……
不知是也不是……
2、程序没有达到预期效果,或根本不是要的结果。
………………
若是duquancai杜大侠或sylun大侠亲临指教,则喜出望外。
期盼高人路过,翘首有缘人搭手。

Sub 选枝随机重排()
Dim mt, mk, oRng As Range, n&, m&, str$
Dim rg As Range, arr(), x%, d As Object, k&, a
Set dic = CreateObject("Scripting.Dictionary")
Set RegE = CreateObject("vbscript.regexp")
RegE.Pattern = "[\((][A-Z]{1,}[\))](?:\r)"
istr = Replace(ActiveDocument.Content, Chr(7), "")
    With CreateObject("vbscript.regexp")
        .Global = True: .IgnoreCase = False: .MultiLine = True
        .Pattern = "^\d+[\..、][^\r]*[\((]([A-Z])[\))]\r(([A-Z][\..、][^\r]*\r)*)(【解析】[^\r]+)"
       For Each mt In .Execute(istr)
            fst0 = mt.firstindex
            lth0 = mt.Length
            Set rng0 = ActiveDocument.Range(fst0, fst0 + lth0)
            
            '原想获取答案填写出的地址,但后面无法对打乱选枝后的答案重新进行操作,所以注释了。
            'For Each mt1 In RegE.Execute(mt)
            '    fst1 = mt1.firstindex
            '    lth1 = mt1.Length
            '    Set rng1 = ActiveDocument.Range(fst1, fst1 + lth1)
            'Next
            sr1 = mt.submatches(0)
            .Pattern = "([A-Z])[\..、]((?:(?!([A-Z][\..、])).)*)"
      
            For Each mk In .Execute(rng0.Text)
                fst2 = mk.firstindex
                lth2 = mk.Length
                Set rng2 = ActiveDocument.Range(fst2 + 2, fst2 + 2 + lth2)
                k = k + 1: Set dic(k) = rng2
               
                '以下是对答案选枝进行标注,以便在更新选址之后,再更新答案。
                '但不知如何更新。
                sr2 = mk.submatches(0)
                sr3 = IIf(sr1 = sr2, "√", "")
                sr4 = mk.submatches(1) & sr2
                x = x + 1: ReDim Preserve arr(1 To x): arr(x) = sr4

            Next
               ar = Rndcq(arr, x)
               For i = 0 To dic.Count - 1
                   dic.Items()(i).Text = ar(i + 1)
               Next
               x = 0: k = 0: dic.RemoveAll
        Next
    End With
End Sub
Function Rndcq(arr, r As Integer)
    Dim arr1(), arr2%(), sr%, x%, y%, num%, k%
    k = UBound(arr)
    ReDim arr2(1 To k): ReDim arr1(1 To r)
    For y = 1 To k
        arr2(y) = y
    Next
    Randomize
    For x = 1 To r
        num = (Rnd() * ((k - x + 1) - 1) + 1) \ 1
        arr1(x) = arr(arr2(num))
        sr = arr2(num)
        arr2(num) = arr2(k - x + 1)
        arr2(k - x + 1) = sr
    Next x
    Rndcq = arr1
End Function

选枝随机1.rar

23.17 KB, 下载次数: 8

TA的精华主题

TA的得分主题

 楼主| 发表于 2020-4-10 14:41 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2020-4-10 15:18 | 显示全部楼层
我有一个思路:在每段的段前插入一个随机数字(作为排序的序号),然后再对段落排序。

TA的精华主题

TA的得分主题

发表于 2020-4-10 15:23 | 显示全部楼层
比如:文档有10段,先生成10个随便数,并插入到各段的段首,
然后用ActiveDocument.Content.Sort SortOrder:=wdSortOrderAscending
排序后,再把之前插入的序号删除。

评分

1

查看全部评分

TA的精华主题

TA的得分主题

发表于 2020-4-10 16:13 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
ming0018 发表于 2020-4-10 15:23
比如:文档有10段,先生成10个随便数,并插入到各段的段首,
然后用ActiveDocument.Content.Sort SortOrde ...

对正文排序,学习了

TA的精华主题

TA的得分主题

发表于 2020-4-10 21:08 | 显示全部楼层
什么意思哦,本想看看这个内容,下载时WINDOWS竟然报发现病毒。

TA的精华主题

TA的得分主题

 楼主| 发表于 2020-4-11 09:56 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
ming0018 发表于 2020-4-10 15:23
比如:文档有10段,先生成10个随便数,并插入到各段的段首,
然后用ActiveDocument.Content.Sort SortOrde ...

谢谢提醒,我在duquancai大侠的代码的启发下,已经解决。
实现了:
1、随机选枝。(A、B、C、D等选枝项随机排版)
2、排序后仍将正确答案在答案处进行了更新。
下一步要实现的是在“解析”中A-D的提示序号进行相应调整。
但这个目前还没有思路。

TA的精华主题

TA的得分主题

发表于 2020-4-11 19:08 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
期待分享代码,学习一下。



                                            莫愁前路无知己,天下谁人不识君!只道是:海内存知己,天涯若比邻!  
    您需要登录后才可以回帖 登录 | 免费注册

    本版积分规则

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

    GMT+8, 2024-11-24 11:31 , Processed in 0.035704 second(s), 15 queries , Gzip On, MemCache On.

    Powered by Discuz! X3.4

    © 1999-2023 Wooffice Inc.

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

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

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