ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

[已解决] 在有控件的文档中,正则如何精准锚定目标位置?

[复制链接]

TA的精华主题

TA的得分主题

发表于 2024-8-24 17:07 | 显示全部楼层 |阅读模式
本帖最后由 weiyingde 于 2024-8-27 15:33 编辑

我这里有一段代码:
Sub 要求匹配解析捕获四个()
    Dim mt, mk, oRng As Range, n&, m&, str$, tt$, arr() As Range 'arr()不申明也没关系
    Dim rg As Range, x%, dic As Object, k&, a
    Set Ydoc = ThisDocument
    Set dic = CreateObject("Scripting.Dictionary")
    osr = Ydoc.Content
    str = Replace(Replace(osr, Chr(7), ""), Chr(1), "")
    With CreateObject("vbscript.regexp")
        .Global = True: .Ignorecase = False: .MultiLine = True
       .Pattern = "(^解析\s+)([A-D].+?)([A-D].+?)([A-D].+?)$"
        For Each mt In .Execute(str)
        m = mt.FirstIndex: n = mt.Length '整个解析
        'ljx = Len(mt.submatches(0))
        Set oRng = Ydoc.Range(m, m + n)
         MsgBox oRng
        Next
    End With
End Sub

       这段分别放在三个文档当中,执行一样的命令,完成一样的任务:锚定题目中的“解析”部分。
       这三个文档,基本一样,唯一的不同是:一个文档有按钮、表格;第二个文档只有表格;第三个文档,只有文本。
       为了消除表格和按钮对正则匹配目标的位置产生影响,我加了一句:
       osr = Ydoc.Content
       str = Replace(Replace(osr, Chr(7), “”), Chr(1), “”)
      执行的结果是:有命令按钮的文档正则不能精准锚定目标位置,其他的两个文档运行正常。
      我删去  str = Replace(Replace(osr, Chr(7), “”), Chr(1), “”),有表格的也不能精准定位。
      这说明  Replace(osr, Chr(7), “”) 是可以消除表格对正则精准定位的干扰?
      那么,Replace(Replace(osr, Chr(7), “”), Chr(1), “”)为什么不能呢?
      加上一句什么代码,能够消除命令按钮所带来的影响呢?
      盼高人施援手,巧破局,接难关,扫疑惑,解难题。


     请分别测试三个文档……

有控件的文档正则如何精准铆钉目标位置.rar

91.23 KB, 下载次数: 9

TA的精华主题

TA的得分主题

 楼主| 发表于 2024-8-24 19:01 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
再次顶帖,盼高人施援手,巧破局,通难关,扫疑惑,解难题。

TA的精华主题

TA的得分主题

发表于 2024-8-24 19:23 来自手机 | 显示全部楼层
本帖最后由 lss001 于 2024-8-24 19:27 编辑
weiyingde 发表于 2024-8-24 19:01
再次顶帖,盼高人施援手,巧破局,通难关,扫疑惑,解难题。


正则已经匹配了,
只是转换过程中出现了一些问题。
VBE中打开本地窗口查看一下就知道了

TA的精华主题

TA的得分主题

发表于 2024-8-24 19:29 来自手机 | 显示全部楼层
本帖最后由 lss001 于 2024-8-25 10:58 编辑

可参考一下14楼

TA的精华主题

TA的得分主题

 楼主| 发表于 2024-8-24 19:46 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
lss001 发表于 2024-8-24 19:29
对于替换问题
str = Replace(Replace(osr, Chr(7), 0), Chr(1), 0)
根据你说的测试结果,

匹配结果,不是目标结果,起始范围有误。

TA的精华主题

TA的得分主题

发表于 2024-8-24 19:50 来自手机 | 显示全部楼层
weiyingde 发表于 2024-8-24 19:46
匹配结果,不是目标结果,起始范围有误。

起始范围
应该不是按照匹配前
应该是按照匹配后重新设置

TA的精华主题

TA的得分主题

 楼主| 发表于 2024-8-24 20:09 | 显示全部楼层
本帖最后由 weiyingde 于 2024-8-24 20:30 编辑

       替换为零,肯定是不成立的。我百度了一下,知道word的字符计数规则和正则的计数规则不一样。
       word中一些不可见特殊的字符,像制表符等,不计数。正则则所有的字符都在计数范围之内。
       Range(start,end)是按照word的字符计数规则的;而firstindex、length分明是正则的计数规范的;
       很明显,同一个文档,如果有表格和嵌入式按钮等,word和正则的计数有很大差别:正则因为囊括了特殊字符,数字一定会比word统计的要多。所以,要确保二者字符计数的标准一致,必须在内存(为了避免破坏源文档,当然不能在文档中处理)中对特殊字符做处理,排除哪些word不统计的特殊字符,才确保两种所锚定的目标范围一致。
       因此,当二者的计数标准不一致时,产生这个问题是很正常的,关键是要找到解决问题的方法,正如此,目前还在探索……
       换言之,用Replace(osr, Chr(7), “”)处理了word不计数的表格中的特殊字符,剩下了word和正则都计数字符;而Replace(osr, Chr(1), “”)却未处理好按钮的问题,导致了错误的发生……

TA的精华主题

TA的得分主题

发表于 2024-8-24 22:27 来自手机 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
本帖最后由 lss001 于 2024-8-25 11:39 编辑

参考一下14楼更新

TA的精华主题

TA的得分主题

 楼主| 发表于 2024-8-25 07:36 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
本帖最后由 weiyingde 于 2024-8-25 09:41 编辑

       我私下做了实验,经测试,正则表达式把一楼的:.Pattern = "(^解析[^\r]*)([A-D](?:(?![A-D\r]).)*)\r" ,改为:.Pattern = "(^解析[^\r]*)([A-D](?:(?![A-D\r]).)*){3}\r",多匹配了一个。
      现以第一个匹配(匹配第一个题目的“解析”)为例:
      一、采用第一个表达式——"(^解析[^\r]*)([A-D](?:(?![A-D\r]).)*)\r",其所有匹配是:
            (1)一个母串mt——整个“解析”
            (2)两个子串:mt.submatches(0)——整个“解析”;mt.submatches(1)——第一个解析的第三个“分解析”。
            
     二、采用第一个表达式——"(^解析[^\r]*)([A-D](?:(?![A-D\r]).)*)\r",,其所有匹配是:
             (1)一个母串mt——整个“解析”
             (2)两个子串:mt.submatches(0)——“解析”二字;mt.submatches(1)——第一个解析的第三个“分解析”。
       比较两个表达式,第二个比起一个要好。

       三、再拿quqiyuan网友的的表达式——.Pattern = "(^解析\s+)([A-D].+?)([A-D].+?)([A-D].+?)$"做实验:
       (1)一个母串mt——整个“解析”
       (2)子串1—mt.submatches(0)——"解析"二字;子串2—mt.submatches(1)——"解析"第1部分;子串3—mt.submatches(2)——"解析"第2部分;子串3—mt.submatches(3)——"解析"第3部分.
       经过三轮实验比较,得出以下结论:
       第一个子母不分,其实只有两个匹配,跟目标比,漏匹了3个——“解析”以及“解析”的前两个部分;第二个分了字母,但漏匹的结果与第一个表达式一样。
       quqiyuan网友的的表达式,达到了预期效果,但表达式不够简洁,经过分析,发现:”([A-D].+?)”连写了三次,能否改为:([A-D].+?){3}呢?
       再试一下,看看效果是否与预料的一样……
       结果:一个母串——mt;两个子串——“解析”二字,“解析”第三部分。
       结论:quqiyuan网友的的表达式.Pattern = "(^解析\s+)([A-D].+?)([A-D].+?)([A-D].+?)$",是目前所有求助当中能够达到预期效果的最优表达式。
       困惑: "(^解析\s+)([A-D].+?)([A-D].+?)([A-D].+?)$",明明是三个“(^解析\s+)”,为什么不能写成: "(^解析\s+)([A-D].+?){3}$"?
      怪哉?!!
      继续探索……
      愿有缘人相遇于危难之际,有慈悲者施以援手。
      你的举手之劳,或许能够解答我多日之困。
      再次对上述所有的帮助者深表感谢

TA的精华主题

TA的得分主题

发表于 2024-8-25 08:45 来自手机 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
本帖最后由 lss001 于 2024-8-25 08:48 编辑
weiyingde 发表于 2024-8-25 07:36
我私下做了实验,经测试,正则表达式把一楼的:.Pattern = "(^解析[^\r]*)([A-D](?:(?![A-D\r]).)*) ...


\r回车
"(^解析[^\r]*)([A-D](?:(?![A-D\r]).)*)\r"
$结束
"(^解析[^\r]*)([A-D](?:(?![A-D\r]).)*)$"
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

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

GMT+8, 2024-11-18 18:22 , Processed in 0.045038 second(s), 9 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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