Excel VBA 8.27从中间提取部分文本 正则并不是唯一选择
正则提取太复杂?部分场景可以用函数
点击上方“Excel和VBA”,选择“置顶公众号”
致力于原创分享Excel的相关知识,源码,源文件打包提供
一起学习,一起进步~~
昨天我们学习了如何通过left和right这两方法来实现单元格内容的提取,一起先来回顾下
left代表的是从单元格内容的左边提取指定字符长度的内容
right代表的是从单元格内容的右边提取指定字符长度的内容
同时上节我们也留下了一个小悬念,那就是如果我想要从中间提取呢?是不是又要动用正则呢?
其实正则并不是唯一的选择,单纯从中间提取指定字符长度的话,我们还有另外一个方法
场景说明
这里我们继续用上节课的数据源
今天我们要实现的是从中间提取
从中间提取的话,我们先来介绍下方法
MID(文本,开始位置,提取文本的长度)
很明显这个解释非常的不专业,但是换成中文解释的话,大家应该会更好理解一点
我们先来看看代码
代码区
Sub zj()
Dim rng As Range, a As Range
Set rng = Application.InputBox("请选择单元格区域", "提取单元格中间三位", , , , , , 8)
For Each a In rng
a.Offset(0, 1) = Mid(a, 3, 3)
Next a
End Sub
来看看效果
效果是有了,仔细分析下,是从第三位开始,往后提取三位得到的结
似乎效果有点呆板,不是很完美,不够灵活,如果我不是指定从第三位开始呢?我想要灵活一点呢?
又或者我不仅仅是想要提取3位,我想要提取剩下的所有呢?
来继续
Sub zjj()
Dim rng As Range, a As Range
Set rng = Application.InputBox("请选择单元格区域", "提取单元格中间三位", , , , , , 8)
Starts = Application.InputBox("请输入开始位置", "提取初始位置的确定", , , , , , 2)
For Each a In rng
a.Offset(0, 1) = Mid(a, Starts, Len(a) - Starts)
Next a
End Sub
从这个新的代码来看,我们增加了一个弹窗,可以灵活的指定起始位置,这里我们实现的效果是从指定的位置开始,将这个位置后面的所有的内容全部都提取出来
作为参考,可以和上面的仅仅提取三位作一个 对比
代码解析
好了,有了代码之后,我们就可以分析下这个MID方法的使用了。
MID(文本,开始位置,提取文本的长度)
来看看我们的这个中文
MID(文本,开始位置,提取文本的长度)
a.Offset(0, 1) = Mid(a, 3, 3)
a.Offset(0, 1) = Mid(a, Starts, Len(a) - Starts)
1.文本,在我们这个案例中,代表的单元格的内容,也就是a
2.文本开始位置,我们第一个案例中,我们设置的是从第三个位置开始的,所以是3,而在第二案例中,我们借助inputbox方法,通过交互的方式的得到了我们实际输入的想要起始的位置,也就是 Starts
3.提取文本的长度,我们第一个案例中设置的是提取3位,所以就是3,而在第二个案例中,我们需要提取的是指定位置Starts后面所有的字符,这里我们就需要重新构造下,通过len()方法得到文本的总长度,再减去开始位置的字符位置,就是剩下的所有字符的长度了
我们可以按照上面的这个图来理解下。其实就是简单的减法,起始位置,代表的也是前面的字符数(即红色部分)
今天的代码看起来比较的复杂,因为mid()方法中,部分的参数还需要我们另外构造,虽然代码量看起来比正则多了一些,但是理解是比较好理解的。
left,right,mid这三个方法都可以用来按照字符长度来提取文本,不过他们有自己的特定使用场景,如果针对一些更加复杂的场景,他们就无法胜任了,大家在工作中,应该结合自己的使用场景来灵活选择方法
正则是一个方法,但并不是唯一,并不是一定要花费时间再去了解正则的构造和写法,办法总比问题多,大家一定要记住这一点。