Excel VBA 8.27从中间提取部分文本 正则并不是唯一选择

正则提取太复杂?部分场景可以用函数


点击上方“Excel和VBA”,选择“置顶公众号”

致力于原创分享Excel的相关知识,源码,源文件打包提供

一起学习,一起进步~~


昨天我们学习了如何通过left和right这两方法来实现单元格内容的提取,一起先来回顾下

left代表的是从单元格内容的左边提取指定字符长度的内容

right代表的是从单元格内容的右边提取指定字符长度的内容

同时上节我们也留下了一个小悬念,那就是如果我想要从中间提取呢?是不是又要动用正则呢?

其实正则并不是唯一的选择,单纯从中间提取指定字符长度的话,我们还有另外一个方法

场景说明

这里我们继续用上节课的数据源

今天我们要实现的是从中间提取

从中间提取的话,我们先来介绍下方法

MID(文本,开始位置,提取文本的长度)

很明显这个解释非常的不专业,但是换成中文解释的话,大家应该会更好理解一点

我们先来看看代码

代码区

Sub zj()Dim rng As Range, a As RangeSet rng = Application.InputBox("请选择单元格区域", "提取单元格中间三位", , , , , , 8)For Each a In rng    a.Offset(0, 1) = Mid(a, 3, 3)Next aEnd Sub

来看看效果

效果是有了,仔细分析下,是从第三位开始,往后提取三位得到的结

似乎效果有点呆板,不是很完美,不够灵活,如果我不是指定从第三位开始呢?我想要灵活一点呢?

又或者我不仅仅是想要提取3位,我想要提取剩下的所有呢?

来继续

Sub zjj()Dim rng As Range, a As RangeSet rng = Application.InputBox("请选择单元格区域", "提取单元格中间三位", , , , , , 8)Starts = Application.InputBox("请输入开始位置", "提取初始位置的确定", , , , , , 2)For Each a In rng    a.Offset(0, 1) = Mid(a, Starts, Len(a) - Starts)Next aEnd 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这三个方法都可以用来按照字符长度来提取文本,不过他们有自己的特定使用场景,如果针对一些更加复杂的场景,他们就无法胜任了,大家在工作中,应该结合自己的使用场景来灵活选择方法

正则是一个方法,但并不是唯一,并不是一定要花费时间再去了解正则的构造和写法,办法总比问题多,大家一定要记住这一点。

(0)

相关推荐