Excel VBA 8.21 提取单元格中的数字 从来都不难
提取单元格中的数字 从来都不难
点击上方“Excel和VBA”,选择“置顶公众号”
致力于原创分享Excel的相关知识,源码,源文件打包提供
一起学习,一起进步~~
前几天我收到了一个小伙伴的反馈,他表示希望能够针对单元格内容中数字的提取稍微说一下,单元格中内容的提取也是很常见的操作,如果数据量小的话,我们可以用最传统的方法,手工+肉眼的方式来提取,但是如果碰到数据量大的话,就需要考虑用其他的方法了,这个其他,自然就是指VBA了。一起来看看
场景说明
简单的构造一下数据,常见的数字提取的场景,无外乎就是上面几种,数字在开头,或者结尾,或者中间,或者搭配中文,或者搭配英文,常规的就这样。
那我们就以这个数据源为引子,开启关于单元格内容提取的篇章吧,比方说提取中文,提取英文,电话。。。。
好了,撤的有点远了。
回归正题,我们用VBA将单元格中的数字提取出来
代码区
Sub sz()
Dim rng As Range, a As Range
Set rng = Application.InputBox("请选择单元格区域", "提取单元格的数字", , , , , , 8)
For Each a In rng
MyStr = a.Value
ResultStr = ""
With CreateObject("VBSCRIPT.REGEXP")
.Pattern = "\d"
.IgnoreCase = True
.Global = True
If .test(MyStr) Then
For Each Item In .Execute(MyStr)
ResultStr = ResultStr & Item
Next Item
a.Offset(0, 1) = ResultStr
End If
End With
Next a
End Sub
说到提取数字,你可能还是一点思路都没有
因为之前我们的操作都可以用VBA的一些常用方法来实现,但是这个提取数字。。。似乎没有
不过不着急,其实在之前讲解单元格拆分的时候,我们已经用过这个方法了,有没有印象,他就是正则
先来看看代码的效果
整理来说,初步效果已经达到 。
代码解析
前面已经说了,今天我们用到的方法,其实就是正则
也许很多小伙伴会非常希望讲解下VBA中正则的用法
我已经安排上了,后面会详细的讲解的,因为正则涉及的东西比较多,三言两语也说不清
这里大家就先学会这个方法
想要在VBA中使用正则,第一件事就是告诉VBA我要使用正则了,如何告诉呢?
With CreateObject("VBSCRIPT.REGEXP")
*****
end with
既然正则都需要写表达式,那么我们现在就来看看表达式怎么写
.Pattern = "\d{".IgnoreCase = True
.Global = True
这三个就是正则表达式在VBA中的结构了
其中Pattern后面的就是正则表达式
IgnoreCase表示是否忽略大小写
Global则代表是否全局匹配
常规下,都是直接按照上面的模式写,只需要更改下pattern后面的正则表达式即可,这是套路
想要获得纯数字的结果,正则表达式就是"\d"
他就是匹配数字的
利用正则查找,他肯定会返回一个结果,这个结果我们就直接判断是否为空,如何判断
If .test(MyStr) Then
For Each Item In .Execute(MyStr)
ResultStr = ResultStr & Item
Next Item
a.Offset(0, 1) = ResultStr
End If
下面这些就是基本套路了。套路这个东西,简单说,就是拿来用就好。
其中ResultStr就是最终返回的结果
有了结果,直接填入单元格中,这个简单操作,对大家来说都是so easy 啦。