VBA之正则表达式(31)-- 指定格式数据拆分

79 篇文章 6 订阅
49 篇文章 18 订阅

实例需求:按照指定规则从A列示例数据提取相应的内容,如下图所示。

在这里插入图片描述

提取规格:

  • 1、第一段,第1个字符“-”前的字符,结果为字符串格式
  • 2、第二段,第1个“-”字符与第2个“-”字符中间的字符,结果为数字格式
    提取数字后,结果=1,则返回:1
    提取数字后,结果=2,则返回:2
    其余返回:0
  • 3、第三段、第2个“-”字符与第3个“-”字符中间的字符,结果为字符串格式
    注意:有些编号没有第三个“-”,要判断。

示例数据:

A001-Y1-655-1-A
A006-01-085
A384-M1-221-1-A
A526-01-002-1-B
ADD-03-0018
B001-A1-001-1-B
B003-01-159
B008-F1-018-1-A
H108-1-157
H109-01-032
HC154-02-031
HDMINA315-01-602
HMC380-1117HMC380-1118
IM076-01-031
IP-020-024
JC-01-C013-A1-001-1-A
LC003-03-001
MK010-01-300SKD11
NA159-01-01-024cushioncut

示例代码:

Sub Demo()
    Dim regExp As Object, regExpMHs As Object
    Set regExp = CreateObject("vbscript.regExp")
    regExp.Global = True
    regExp.Pattern = "(.*?)(-|$)"
    arr = [a1].CurrentRegion
    For i = 2 To UBound(arr)
        Set regExpMHs = regExp.Execute(arr(i, 1))
        If regExpMHs.Count > 0 Then
            For j = 0 To 2
                arr(i, 2 + j) = regExpMHs(j).submatches(0)
                If j = 1 Then
                    arr(i, 2 + j) = Val(arr(i, 2 + j))
                    If arr(i, 2 + j) < 0 Or arr(i, 2 + j) > 2 Then arr(i, 2 + j) = 0
                End If
            Next
        End If
    Next
    [a1].CurrentRegion.Value = arr
    Set regExpMHs = Nothing
    Set regExp = Nothing
End Sub

代码解析:
第3行代码创建正则表达式对象。
第4行代码设置全局匹配。
第5行代码设置匹配规则。

正则表达式说明
(.*?)非贪婪匹配任意字符,为第一个提取组
(-|$)匹配减号或者行结束位置

第6行代码将数据区域内容保存在数组中。
第7~18行代码使用For语句循环处理数据。
第8行代码执行正则匹配。
第9行代码判断是否匹配成功,如果匹配成功,那么Count属性返回为匹配结果的数量。
第10~16行代码循环处理3个被提取的字符串。
第11行代码将第j个匹配结果中的第一个捕获组保存在数组中。
如果j=1,说明是第二段内容,第13行代码使用val函数,将其转换为数值,如果字符串的首个字符为非数字,那么函数返回值为0。
第14行代码根据提取规则,判断第二段内容,如果不是0和1,则统一替换为0。
第19行代码将数据写入工作表。
第20~21行代码清空对象变量,释放系统资源。

多掌握一些VBA的内置函数,代码实现起来就更容易。

  • 1
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值