Excel精英培训网

 找回密码
 注册
数据透视表40+个常用小技巧,让你一次学会!
查看: 1264|回复: 9

[已解决]利用正则表达式获取括号内容

[复制链接]
发表于 2022-3-21 16:04 | 显示全部楼层 |阅读模式
求大神帮忙改改,运行失败,将单元格的小括号内容包括括号赋值给lf,运行时失败
  1. Sub a()
  2. Dim a
  3. Dim reg As Object '声明
  4. Set reg = CreateObject("VBScript.RegExp") '创建正则对象
  5. a = Cells(121, 1).Value
  6. With reg
  7.     .Global = False
  8.     .Pattern = "/\(.*?\)/"
  9. End With
  10. Set lf = reg.Execute(a)
  11. MsgBox lf
  12. End Sub
复制代码


最佳答案
2022-3-22 09:54
excel用账户 发表于 2022-3-22 09:46
我希望把括号也一起提取出来的话要怎么更改呢
  1. Sub TEXT1()
  2. Dim a, m, mat
  3. Dim reg As Object '声明
  4. Set reg = CreateObject("VBScript.RegExp") '创建正则对象
  5. For i = 1 To 20
  6. a = Cells(i, 1).Value
  7. With reg
  8.     .Global = True
  9.     .Pattern = "(.*)((.*))(.*)"
  10. End With
  11. Set mat = reg.Execute(a)
  12. For Each m In mat
  13. MsgBox m.SubMatches(1)
  14. Next
  15. Next
  16. End Sub
复制代码
z再教你一个方法:
execute法下生成一个符合规则的集合。而每一个符合规则的值都有submatches方法,它也是一个集合。
但是需要把规则都用英文的()括号,每一个括号做一个值。如上有三组英文括号,把符合规则的值分成了3部分:分别是括号前、括号+括号内、括号后。
我们需要第二部分,那就调用值m的submatches(1)就是第二部分了,submatches集合也是一个数组,底标是从0开始,0,1,2;所以第二部分是submatches(1)


发表于 2022-3-21 17:21 | 显示全部楼层
lf  是个对象数组 , 虽然.Global = False 让其 只有一组结果
MsgBox lf(0)
且 没有匹配时 , 会出错

===========================
a = Cells(121, 1).Value '没指定 工作表 , 不可靠
回复

使用道具 举报

发表于 2022-3-21 18:16 | 显示全部楼层
放附件吧。
提出你几个代码的错误
1.宏名称用a,下面又定义a,这不规范
2.if是一个函数,你把if用set去赋值对象也是不对的
3.msgbox是显示不出一个对象的,execute它是一个集合不能直接显示,所以要用for each去显示每一个符合规则的值
上面三个问题修改如下,试下是不是这样,最好把附件放上来看看要做个啥:
Sub TEXT()
Dim a, m, mat
Dim reg As Object '声明
Set reg = CreateObject("VBScript.RegExp") '创建正则对象
a = Cells(121, 1).Value
With reg
    .Global = False
    .Pattern = "/\(.*?\)/"
End With
Set mat = reg.Execute(a)
For Each m In mat
    MsgBox m
Next m
End Sub

回复

使用道具 举报

发表于 2022-3-21 18:54 | 显示全部楼层
林木水 发表于 2022-3-21 18:16
放附件吧。
提出你几个代码的错误
1.宏名称用a,下面又定义a,这不规范

嗯 , "lf" 是 小写的"LF" , 非常容易误读

回复

使用道具 举报

 楼主| 发表于 2022-3-22 09:07 | 显示全部楼层
林木水 发表于 2022-3-21 18:16
放附件吧。
提出你几个代码的错误
1.宏名称用a,下面又定义a,这不规范

还是无法使用,希望能把A列括号里的内容提取到B列

新建 XLS 工作表.zip

12.05 KB, 下载次数: 2

回复

使用道具 举报

发表于 2022-3-22 09:43 | 显示全部楼层
excel用账户 发表于 2022-3-22 09:07
还是无法使用,希望能把A列括号里的内容提取到B列
  1. Sub TEXT()
  2. Dim a, m, mat
  3. Dim reg As Object '声明
  4. Set reg = CreateObject("VBScript.RegExp") '创建正则对象
  5. For i = 1 To 20
  6. a = Cells(i, 1).Value
  7. With reg
  8.     .Global = True
  9.     .Pattern = "(.*)"
  10. End With
  11. Set mat = reg.Execute(a)
  12. For Each m In mat
  13. Cells(i, 2) = Replace(Replace(m, "(", ""), ")", "")
  14. Next
  15. Next
  16. End Sub
复制代码
你问题错在是:
.pattern规则不对,你要取括号里面的东西,就要把符合规律的条件弄出来。你代码你们的规则是英文的括号,而表格里面是中文的括号,它们不一样
思路:修改规则,再用replace函数替换调中文的括号就可以了

1647913445(1).jpg
回复

使用道具 举报

 楼主| 发表于 2022-3-22 09:46 | 显示全部楼层
林木水 发表于 2022-3-22 09:43
你问题错在是:
.pattern规则不对,你要取括号里面的东西,就要把符合规律的条件弄出来。你代码你们的规 ...

我希望把括号也一起提取出来的话要怎么更改呢
回复

使用道具 举报

发表于 2022-3-22 09:47 | 显示全部楼层
excel用账户 发表于 2022-3-22 09:46
我希望把括号也一起提取出来的话要怎么更改呢

那就不用replace,cells(i,2)=m
回复

使用道具 举报

发表于 2022-3-22 09:54 | 显示全部楼层    本楼为最佳答案   
excel用账户 发表于 2022-3-22 09:46
我希望把括号也一起提取出来的话要怎么更改呢
  1. Sub TEXT1()
  2. Dim a, m, mat
  3. Dim reg As Object '声明
  4. Set reg = CreateObject("VBScript.RegExp") '创建正则对象
  5. For i = 1 To 20
  6. a = Cells(i, 1).Value
  7. With reg
  8.     .Global = True
  9.     .Pattern = "(.*)((.*))(.*)"
  10. End With
  11. Set mat = reg.Execute(a)
  12. For Each m In mat
  13. MsgBox m.SubMatches(1)
  14. Next
  15. Next
  16. End Sub
复制代码
z再教你一个方法:
execute法下生成一个符合规则的集合。而每一个符合规则的值都有submatches方法,它也是一个集合。
但是需要把规则都用英文的()括号,每一个括号做一个值。如上有三组英文括号,把符合规则的值分成了3部分:分别是括号前、括号+括号内、括号后。
我们需要第二部分,那就调用值m的submatches(1)就是第二部分了,submatches集合也是一个数组,底标是从0开始,0,1,2;所以第二部分是submatches(1)


回复

使用道具 举报

 楼主| 发表于 2022-3-22 10:45 | 显示全部楼层
林木水 发表于 2022-3-22 09:54
z再教你一个方法:
execute法下生成一个符合规则的集合。而每一个符合规则的值都有submatches方法,它也 ...

十分感谢
回复

使用道具 举报

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

本版积分规则

小黑屋|手机版|Archiver|Excel精英培训 ( 豫ICP备11015029号 )

GMT+8, 2024-4-28 16:25 , Processed in 0.182392 second(s), 10 queries , Gzip On, Yac On.

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

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