ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

[已解决] 怎样避免按钮等控件影响正则表达式的准确匹配

[复制链接]

TA的精华主题

TA的得分主题

发表于 2024-8-23 08:00 | 显示全部楼层 |阅读模式
本帖最后由 weiyingde 于 2024-8-27 16:00 编辑

我有一段代码,要求匹配和提取各题的选枝。代码如下
Public Function 录入选枝(Odoc As Document)
    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 dic = CreateObject("Scripting.Dictionary")
    osr = Odoc.Content.Text 'Osr=ActiveDocument.Content
    str = Replace(osr, Chr(7), "")
    With CreateObject("vbscript.regexp")
        .Global = True: .Ignorecase = False: .MultiLine = True
        .Pattern = "((?!\))^[A-D][\..][^\r]+\r)+(?!解析[\r]+\r)"
        For Each mt In .Execute(str)
            Nb = Nb + 1
            ft = mt.FirstIndex
            lh = mt.Length
            Set oRng = Odoc.Range(ft, ft + lh)
            Set dic(mt) = oRng.FormattedText
            ReDim Preserve arr(1 To Nb)
            Set arr(Nb) = oRng.FormattedText
        Next
    End With
tm = dic.Items
'录入选枝 = arr
录入选枝 = tm
End Function

Sub 写入选枝()
Dim Odoc As Document
Set Odoc = ActiveDocument
For Each isr In 录入选枝(Odoc)
    asr = asr & isr
Next
Documents.Add.Content = asr
End Sub

代码的意图是,用正则匹配和提取选枝,然后生成新文档。
我提供了两个测试文档。
文档1没有按钮,正则能正常运行,文档2有按钮,不能,为什么?
请大侠支招,怎样才能避免干扰,是这段程序能正常运行。

测试文档.rar

92.78 KB, 下载次数: 11

TA的精华主题

TA的得分主题

 楼主| 发表于 2024-8-23 09:48 | 显示全部楼层
本帖最后由 weiyingde 于 2024-8-23 10:15 编辑

测试3,直接匹配,不通过文档字符的位置来获取相应文本的话,可以实现。
Sub 录入选() '(Odoc As Document)
    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 dic = CreateObject("Scripting.Dictionary")
    Osr = ActiveDocument.Content
    str = Replace(Osr, Chr(7), "")
    With CreateObject("vbscript.regexp")
        .Global = True: .Ignorecase = False: .MultiLine = True
        .Pattern = "((?!\))^[A-D][\..][^\r]+\r)+(?!解析[\r]+\r)"
        For Each mt In .Execute(str)
         MsgBox mt
        Next
    End With
End Sub

这再次说明,源文档中有按钮等控件的存在,会影响到正则所匹配的文本的精准定位。
结论:嵌入式控件,一定会当字符串,作为文档的一部分。以致正则已经匹配了正确字符串,在word定位时,由于嵌入式空间的存在,影响了正则所锚定的目标字符首尾位置的精准定位。
我们在消除表格对文档所带来的影响用Replace(ActiveDocument.Content, Chr(7), ""),那么对于控件的影响,能否借用一下?若如此,又该如何表达呢?

TA的精华主题

TA的得分主题

 楼主| 发表于 2024-8-23 18:22 | 显示全部楼层
有大侠路过吗,请搭把手指教指教!先谢了。

TA的精华主题

TA的得分主题

发表于 2024-8-23 19:05 来自手机 | 显示全部楼层
本帖最后由 lss001 于 2024-8-23 19:29 编辑
weiyingde 发表于 2024-8-23 18:22
有大侠路过吗,请搭把手指教指教!先谢了。


以下这句代码有问题
str = Replace(osr, Chr(7), "")
是否应该是写成如下
str = Replace(Replace(osr, Chr(7), 0), Chr(1), 0)

评分

1

查看全部评分

TA的精华主题

TA的得分主题

 楼主| 发表于 2024-8-23 19:24 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
lss001 发表于 2024-8-23 19:05
以下这句代码有问题
str = Replace(osr, Chr(7), "")
是否应该是写成如下

谢谢指教,解决问题。为什么“0”却没有统计在字符数之列。

TA的精华主题

TA的得分主题

发表于 2024-8-23 19:30 来自手机 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
weiyingde 发表于 2024-8-23 19:24
谢谢指教,解决问题。为什么“0”却没有统计在字符数之列。

解决方案,请参考参考一下楼上更正代码

TA的精华主题

TA的得分主题

 楼主| 发表于 2024-8-23 20:02 | 显示全部楼层
lss001 发表于 2024-8-23 19:30
解决方案,请参考参考一下楼上更正代码

好的,谢谢你,还是懵懵懂懂的接受了

TA的精华主题

TA的得分主题

 楼主| 发表于 2024-8-23 20:08 | 显示全部楼层
lss001 发表于 2024-8-23 19:30
解决方案,请参考参考一下楼上更正代码

chr(1)是什么呢?百度没查出来,用msgbox chr(1)显示的好像是个小方框。请问到底是什么?

TA的精华主题

TA的得分主题

发表于 2024-8-23 20:08 来自手机 | 显示全部楼层
本帖最后由 lss001 于 2024-8-23 22:12 编辑
weiyingde 发表于 2024-8-23 20:02
好的,谢谢你,还是懵懵懂懂的接受了


主要是Asc与Chr的转换问题
这样说应该是清楚了

TA的精华主题

TA的得分主题

 楼主| 发表于 2024-8-23 20:13 | 显示全部楼层
lss001 发表于 2024-8-23 20:08
主要是Ascii与Chr的转换问题
这样说应该是清楚了

chr(7)是指表格,chr(1)是不是按钮呢?
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

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

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

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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