1、 题目
如下图所示,"要求:提取开头为华南和华东和东北,结尾为一部、三部和五部的部门,并按如下三种方式分别显示结果:
1. 与目标单元格同行对应显示。
2. 独立集中显示。
3. 阶梯状显示。
![083bf674754ab07eb4e611065e9edea5.png](https://i-blog.csdnimg.cn/blog_migrate/05572297c8381fe2c0207f7035d0b604.jpeg)
2、 解题思路
1. 先看Patttern属性,从题目要求来看,如果要筛选开头和结尾指定的目标字符串且并不是唯一,那就需要用到"或"元字符,即|。又因为开头和结尾的中间部门存在多个多个字符,故此需要用到任意院子和>=1的量词,即.+,或.{1,}.
2. 若要与目标单元格同行对应显示,就需要首先获取目标单元格的行号,对此我们可以设置rng变量,将rng多为结果所在单元格的行号就行了,即cells(rng.row,2),2指第二列。
3. 若要实现独立集中显示,就需要显示结果由自己独立的行列号,故此不能使用rng变量,对此我们可以借助foreach遍历中使用N变量,将他作为结果单元格的行号,即可自上而下逐行显示,即cells(n,3),3指第三列。
4. 若要阶梯状显示,就需要行列号都随N的变化而同步变化,只需要用n+1作为列号即可逐列显示,即cells(n,n+1)。
三 、VBE窗口
![3ef112d512905b3cfd654519e47774b8.png](https://i-blog.csdnimg.cn/blog_migrate/165eb97d3a4bab6c71c58ae5e924c1d4.jpeg)
![c2025718e4765f9c56ac2f2ade45b17c.png](https://i-blog.csdnimg.cn/blog_migrate/abe187414c72bd25dc17a777812b8b4e.jpeg)
![b2e6825392adf4528abe8d44d7efe7b7.png](https://i-blog.csdnimg.cn/blog_migrate/bcda282d40fb8ba01a0a8d6a84992a0c.jpeg)
4、 代码分享
'与目标单元格同行对应显示结果
Sub 按照开头和结尾的要求提取字符1()
Dim regx As Object, rng, mat, k, n%
Set regx = CreateObject("Vbscript.regexp")
With regx
.Global = True
.Pattern = "^(华南|华东|东北).*(一部|三部|五部)$"
For Each rng In [a1:a25]
Set mat = .Execute(rng)
For Each k In mat
n = n + 1
Cells(rng.Row, 2) = k
Next
Next
End With
End Sub
第二种和第三种只需要改一下行列号即可。
5、 总结
1. N=n+1的意思是每一次n+1的结果都作为下一次加数n,这样就实现了一种循环,如果不对n值设初值,默认n=0, 当n=0时N=1。
2. +1作为等差值,可以根据需要修改。
3. 这种等式多用在foreach、doloop等循环语句中。