ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

[分享] 正则替换实现$1回调的尝试

[复制链接]

TA的精华主题

TA的得分主题

 楼主| 发表于 2019-11-24 09:41 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
liu-aguang 发表于 2019-11-24 09:29
对$1应用于函数很有开创意义。

谢谢鼓励 ,开始想法是用vba 模拟出  js语言中 正则对象对$1变量 回调的支持,
4楼代码 扩展实现了对 $1,$2 两个变量的 回调函数。

TA的精华主题

TA的得分主题

发表于 2019-11-24 09:49 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
zopey 发表于 2019-11-24 09:41
谢谢鼓励 ,开始想法是用vba 模拟出  js语言中 正则对象对$1变量 回调的支持,
4楼代码 扩展实现了对 $1 ...

我曾经也去尝试过,但没有成功。不过你实现了但我没有看懂。

TA的精华主题

TA的得分主题

发表于 2019-11-24 15:52 | 显示全部楼层
本帖最后由 aoe1981 于 2019-11-24 16:00 编辑
liu-aguang 发表于 2019-11-24 09:49
我曾经也去尝试过,但没有成功。不过你实现了但我没有看懂。

为了辅助理解引号的叠加作用,我测试了以下代码:
  1. Sub ss()
  2.     a = 3
  3.     b = 4
  4.     c = 2
  5.     Range("a1") = Evaluate("=3+5")
  6.     Range("a2") = "=3+5"
  7.     Range("a3") = Evaluate("3+5")
  8.     Range("a4") = "3+5"
  9.     Range("b1") = Evaluate("""")
  10.     Range("b2") = """"
  11.     Range("b3") = Evaluate("""""")
  12.     Range("b4") = """"""
  13.     Range("b5") = Evaluate("""""""")
  14.     Range("b6") = """"""""
  15.     Range("b7") = """ & 3 & """
  16.     Range("b8") = """" & 3 & """"
  17.     Range("b9") = """ & cheng(" & """$1""" & "," & """$2""" & "," & 2 & ") & """
  18.     Range("b10") = """ & cheng(" & 3 & "," & 4 & "," & 2 & ") & """
  19.     Range("b11") = Evaluate("""=cheng(3,4,2)""")
  20.     Range("b12") = Evaluate("""=cheng(a,b,c)""")
  21.     Range("b13") = Evaluate("""=cheng(" & a & "," & b & "," & c & ")""")
  22. End Sub
  23. Sub ssss()
  24.     Range("c1") = "a2"
  25.     Range("c2") = """a2"""
  26.     Range("c3") = """""a2"""""
  27. End Sub
复制代码


前三点规律是肯定的:
1.引号必须成对出现;
2.引号内部连用的两个引号会执行为一个引号;
3.变量名中自带引号时,比如:"$1",则应当输入为:"""$1""";
4.……待补充

代码测试结果一道附录如下:
image.png


其中的自定义函数是:
  1. Function cheng(a, b, c)
  2.     cheng = a & b * c
  3. End Function
复制代码



算是备注的学习笔记吧。

评分

2

查看全部评分

TA的精华主题

TA的得分主题

发表于 2019-11-24 16:19 | 显示全部楼层
zopey 发表于 2019-11-24 09:41
谢谢鼓励 ,开始想法是用vba 模拟出  js语言中 正则对象对$1变量 回调的支持,
4楼代码 扩展实现了对 $1 ...

要实现所谓“回调”(我的理解是“返回调用”,其作用类似于“递归调用”),似乎必须借助于自定义函数,下面的代码是不可以:
  1. Sub pey_testb1()
  2.     sss = "string=1+count=101;string=1+count=225"
  3.     bbb = "count="
  4.     kkk = 5
  5.     Debug.Print sss
  6.     Debug.Print zz1(sss, bbb, kkk)
  7. End Sub
  8. Function zz1(mystr, qz, bs)
  9.     With CreateObject("VBSCRIPT.REGEXP")
  10.         .Global = True
  11.         .Pattern = "(" & qz & ")(\d*)"
  12.         zfc = "" & """$1""" & " & " & """$2""" & " * " & bs & ""
  13.         zz1 = Evaluate("""" & .Replace(mystr, "" & """$1""" & " & " & """$2""" & " * " & bs & "") & """")
  14.     End With
  15.     Debug.Print zfc
  16. End Function
复制代码


也有可能是我写错了,讨教一二。

TA的精华主题

TA的得分主题

 楼主| 发表于 2019-11-24 20:16 | 显示全部楼层
aoe1981 发表于 2019-11-24 16:19
要实现所谓“回调”(我的理解是“返回调用”,其作用类似于“递归调用”),似乎必须借助于自定义函数, ...

直接写公式  也是可以的,只要能从 各种引号中 绕出来。

TA的精华主题

TA的得分主题

 楼主| 发表于 2019-11-24 22:31 | 显示全部楼层
zopey 发表于 2019-11-24 20:16
直接写公式  也是可以的,只要能从 各种引号中 绕出来。
  1. Sub pey_testb2()
  2.     sss = "string=1+count=101;string=1+count=225"
  3.     bbb = "count="
  4.     kkk = 5

  5.     Debug.Print zz1(sss, bbb, kkk)
  6. End Sub
  7. Function zz1(mystr, qz, bs)
  8.     With CreateObject("VBSCRIPT.REGEXP")
  9.         .Global = True
  10.         .Pattern = "(" & qz & ")(\d*)"

  11.          temp = "=""" & .Replace(mystr, """ & ""$1"" & " & "$2" & "*" & bs & " & """) & """"
  12.     End With
  13.    
  14.     Debug.Print temp
  15.     zz1 = Evaluate(temp)
  16. End Function
复制代码


TA的精华主题

TA的得分主题

发表于 2019-11-25 17:22 | 显示全部楼层

TA的精华主题

TA的得分主题

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

老师,Replace的第2个参数是一个函数,请问:函数名qukh前面的字符&与函数括号后紧挨的字符&,在这里起什么作用,有什么说法?

TA的精华主题

TA的得分主题

 楼主| 发表于 2019-12-11 23:31 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
liu-aguang 发表于 2019-12-11 20:41
老师,Replace的第2个参数是一个函数,请问:函数名qukh前面的字符&与函数括号后紧挨的字符&,在这里起什 ...

字符& 作用就是连接 字符串,qukh 在触发 Evaluate前 ,不会计算函数值,只是个字符串。
看 16楼的 temp,应能理解。

评分

1

查看全部评分

TA的精华主题

TA的得分主题

发表于 2019-12-12 08:33 | 显示全部楼层
zopey 发表于 2019-12-11 23:31
字符& 作用就是连接 字符串,qukh 在触发 Evaluate前 ,不会计算函数值,只是个字符串。
看 16楼的 temp ...

明白了,该解法真是奇思妙想。另外按你的解题思路,构造表达式可以再精解一点:Evaluate("""" & .Replace(txt, """&qukh(""$1"")&""") & """")
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

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

GMT+8, 2024-11-18 11:46 , Processed in 0.033014 second(s), 7 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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