ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

[已解决] 正则表达式求单元格公式所引用工作表名的困惑

[复制链接]

TA的精华主题

TA的得分主题

发表于 2012-1-7 09:28 | 显示全部楼层 |阅读模式
正则表达式求工作表名.rar (11.23 KB, 下载次数: 15)

假设单元格A1=SUMIF(销售!$C$6:$C$60,"出口",销售!$AN$6:$AN$60)*基础数据表!$D$91,用以下代码:
sub 检测源工作表名()
dim mystr,s1
mystr="=SUMIF(销售!$C$6:$C$60,'出口',销售!$AN$6:$AN$60)*基础数据表!$D$91"
For i = 0 To UBound(Split(mystr, "!"))
s1 = Split(mystr, "!")(i)
With CreateObject("VBSCRIPT.REGEXP")
    .Global = True
    .Pattern = "[^\u4e00-\u9fa5]"
     s1 = .Replace(s1, "")
End With
debug.print  s1
next
end sub
会发现上面正则表达式会出现结果
"销售
出口销售
基础数据表"
由于包含"出口销售"汉字,分离不出销售\基础数据表来.
想问大侠们上述正则表达式该如何改写,谢谢


TA的精华主题

TA的得分主题

发表于 2012-1-7 10:07 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2012-1-7 10:10 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
  1. Sub 检测源工作表名()

  2. Dim mystr, s1

  3. mystr = "=SUMIF(销售!$C$6:$C$60,'出口',销售!$AN$6:$AN$60)*基础数据表!$D$91"



  4. With CreateObject("VBSCRIPT.REGEXP")
  5.     .Global = True
  6.     .Pattern = "[\u4e00-\u9fa5]+(?=!)"
  7.     For Each ma In .Execute(mystr)
  8.        Debug.Print ma
  9.     Next

  10. End With

  11. End Sub
复制代码

TA的精华主题

TA的得分主题

 楼主| 发表于 2012-1-7 10:15 | 显示全部楼层
谢谢wudixin96 大侠,正是我想要的,我想知道+(?=!)的含义是什么,+是指多次出现汉字,可(?=1)不明白.

点评

(?=!)的意思呢,就是汉字必须带叹号的才提取,但本身不会被提取出来 有个名称叫 正向预搜索  发表于 2012-1-7 10:17

TA的精华主题

TA的得分主题

 楼主| 发表于 2012-1-7 13:28 | 显示全部楼层
wudixin96 发表于 2012-1-7 10:10

如果我想把找到符合正则表达式要求的工作表名称前加上'd:/[book1.xls]',replace 方法中又该如何用,谢谢!

TA的精华主题

TA的得分主题

发表于 2012-1-7 14:01 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
  1. Dim mystr, s1
  2. mystr = "=SUMIF(销售!$C$6:$C$60,'出口',销售!$AN$6:$AN$60)*基础数据表!$D$91"
  3. With CreateObject("VBSCRIPT.REGEXP")
  4.     .Global = True
  5.     .Pattern = "([\u4e00-\u9fa5]+)(?=!)"
  6.     mystr = .Replace(mystr, "'d:/[book1.xls]'$1")
  7. End With
  8. Debug.Print mystr
复制代码
这样???

TA的精华主题

TA的得分主题

 楼主| 发表于 2012-1-7 14:14 | 显示全部楼层
本帖最后由 luqiwe 于 2012-1-7 14:33 编辑
wudixin96 发表于 2012-1-7 14:01
这样???


再次谢谢wudixin96,真是太牛了,正则表达式方面的名师啊,我不清楚$1是什么含义,能否再次指教.另外我想把公式
=SUMIF(销售!$C$6:$C$60,'出口',销售!$AN$6:$AN$60)*基础数据表!$D$91 改成
=SUMIF('e:/[book1.xls]销售'!$C$6:$C$60,'出口','e:/[book1.xls]销售'!$AN$6:$AN$60)*'e:/[book1.xls]基础数据表'!$D$91
又该如何改.6楼给出的答案为:
=SUMIF('e:/[book1.xls]'销售!$C$6:$C$60,'出口','e:/[book1.xls]'销售!$AN$6:$AN$60)*'e:/[book1.xls]'基础数据表!$D$91
不符合excel公式外部引用的格式要求.即要求公式右边的单引号加在"!"前,而不是在[book1.xls]后面.

TA的精华主题

TA的得分主题

 楼主| 发表于 2012-1-7 14:35 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
摸仿了一下WUdixin96大师的思路,以下正则表达式好象可以,但不明白$1的含义.
Sub rqm()
Dim mystr, s1
mystr = "=SUMIF(销售!$C$6:$C$60,'出口',销售!$AN$6:$AN$60)*基础数据表!$D$91"
With CreateObject("VBSCRIPT.REGEXP")
    .Global = True
    .Pattern = "([\u4e00-\u9fa5]+)(?=!)"
    mystr = .Replace(mystr, "'d:/[book1.xls]$1'")
End With
Debug.Print mystr
End Sub

TA的精华主题

TA的得分主题

发表于 2012-1-7 14:40 | 显示全部楼层
$1就是代表被捕获到的汉字,你看,在汉字外有一对括号,就表示捕获组,如果有多个,就代表多个捕获。

您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

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

GMT+8, 2025-1-13 17:00 , Processed in 0.026977 second(s), 15 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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