ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

[已解决] 求完善代码:解析调序,有瑕疵

[复制链接]

TA的精华主题

TA的得分主题

发表于 2024-8-28 20:56 | 显示全部楼层 |阅读模式
本帖最后由 weiyingde 于 2024-9-22 11:03 编辑

将“解析”分枝的三项内容,按A、B、C、D的顺序调整。
代码如下:
Sub 要求匹配解析捕获四个()
    Dim mt, mk, oRng As Range, n&, m&, odoc As Document
    Dim str$, tt$, arr() As Range, x%
    Dim rg As Range, dic As Object, k&, ph As Paragraph
   
    Set odoc = ThisDocument
    Set dic = CreateObject("Scripting.Dictionary")
    osr = odoc.Content
    '************************
    str = Replace(osr, Chr(1), "") '替换控件
    Set ph = odoc.Paragraphs(1)
    Set wt = ph.Range.Words(ph.Range.Words.Count) '注意不要-1
    r = wt.End - Len(ph.Range.Text) + (Len(osr) - Len(str))
    '*************************
    str = Replace(str, Chr(7), "") 'osr改str
    With CreateObject("vbscript.regexp")
        .Global = True
        .Ignorecase = False
        .MultiLine = True
        .Pattern = "(^解析[^\r]*)(([A-D](?:(?![A-D\r]).)*){3})\r"
        
        For Each mt In .Execute(str)
            m = mt.FirstIndex + r: n = mt.Length
            Set oRng = odoc.Range(m, m + n - 1)
            ixsr = mt.submatches(0)
            jxlth = Len(ixsr)
            
            .Pattern = "([A-D])([^A-D\r]+)[,,;。;]"
             For Each mtt In .Execute(oRng)
                 'm2 = mtt.FirstIndex + m: n2 = mtt.Length
                 'Set oRng2 = odoc.Range(m2, m2 + n2)
                 isr2 = IIf(InStr(",,;。;", Right(mtt, 1)) > 0, Left(mtt, Len(mtt) - 1), mtt)
                 nbr = WorksheetFunction.Find(Left(mtt, 1), "ABCD")
                 dic(Val(nbr)) = isr2
             Next
             ky = dic.keys
             ky = SortAry(ky)
             For i = LBound(ky) To UBound(ky)
                srth = srth & dic(ky(i)) & IIf(i < UBound(ky), ";", "。")
             Next
             odoc.Range(m + jxlth, m + n - 1) = srth
             dic.RemoveAll
             srth = ""
        Next
    End With
End Sub

Function SortAry(arr As Variant) As Variant
    Dim i As Long
    Dim j As Long
    Dim temp As Variant
   
    ' 对数组进行升序排序
    For i = LBound(arr) To UBound(arr) - 1
        For j = i + 1 To UBound(arr)
            If arr(i) > arr(j) Then
                ' 交换元素
                temp = arr(i)
                arr(i) = arr(j)
                arr(j) = temp
            End If
        Next j
    Next i
   
    ' 返回排序后的数组
    SortAry = arr
End Function
问题:可能锚定位置不准确,导致乱版和字符重复。
D:\1

求完善代码:解析调序,有瑕疵.rar

39.89 KB, 下载次数: 8

TA的精华主题

TA的得分主题

 楼主| 发表于 2024-8-28 20:58 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
问题图片如下,请看图
12.png

TA的精华主题

TA的得分主题

发表于 2024-8-29 06:00 来自手机 | 显示全部楼层
本帖最后由 lss001 于 2024-8-29 21:27 编辑

见下下楼更新附件!

评分

1

查看全部评分

TA的精华主题

TA的得分主题

 楼主| 发表于 2024-8-29 07:09 | 显示全部楼层
lss001 发表于 2024-8-29 06:00
odoc.Range(m + jxlth, m + n - 1) = srth
....................................................... ...

我也试过,题目比较多的时候,不行。
因为我采用“替换”的思路,如果采用“边选择边移动”的思路,可能失误率要少很多。
改变目标文本的顺序,要个很你的帖子,我曾想借用他的思路和办法,奈何学艺不精,目前还不会变通,大侠若有功夫,看能不能,取其思路和办法,帮我写写代码。
https://club.excelhome.net/thread-1322288-1-1.html
二楼,duquancai的代码。

TA的精华主题

TA的得分主题

发表于 2024-8-29 08:58 | 显示全部楼层
本帖最后由 lss001 于 2024-8-29 21:27 编辑
weiyingde 发表于 2024-8-29 07:09
我也试过,题目比较多的时候,不行。
因为我采用“替换”的思路,如果采用“边选择边移动”的思路,可能 ...

见下下楼更新附件!

TA的精华主题

TA的得分主题

 楼主| 发表于 2024-8-29 09:24 来自手机 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
手机上不好操作,稍后在电脑上试试。

TA的精华主题

TA的得分主题

 楼主| 发表于 2024-8-29 12:44 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助

程序出问题,没有成功,初始一看,比duquancai大侠的还复杂,我可能一时半会还悟不出来,有功夫在针对我的代码,稍作修改,不用“覆盖式”,采用对字符串区域“移动”的方式实现,可能不会出现这种情况。

TA的精华主题

TA的得分主题

 楼主| 发表于 2024-8-29 12:54 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
我个人觉得,“覆盖”破坏了源文档的结构,造成后续定位的不准,以致再覆盖时“盖”错了位置,改错了地方。
我觉得有两种方式或许能避免:
1、倒叙式改动,从后往前调整。
2、采用duquancai大侠的方式。

TA的精华主题

TA的得分主题

发表于 2024-8-29 13:46 来自手机 | 显示全部楼层
本帖最后由 lss001 于 2024-8-31 20:06 编辑
weiyingde 发表于 2024-8-29 12:44
程序出问题,没有成功,初始一看,比duquancai大侠的还复杂,我可能一时半会还悟不出来,有功夫在针对我 ...

测试见下下楼

TA的精华主题

TA的得分主题

发表于 2024-8-29 13:51 来自手机 | 显示全部楼层
weiyingde 发表于 2024-8-29 12:54
我个人觉得,“覆盖”破坏了源文档的结构,造成后续定位的不准,以致再覆盖时“盖”错了位置,改错了地方。 ...

看了下链接,
链接中文本并未有带控件或者表之类。
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

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

GMT+8, 2024-11-19 01:55 , Processed in 0.037546 second(s), 12 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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