实例需求:规格数据保存在A1单元格,其中包含多行数据,每行数据都是有多个字段组合而成,现在需要将数据拆分为C列至H列的数据(假设第2行的标题行已经存在)。
如果希望高效拆分数据,一般来说都会用到正则,只要正则匹配表达式构建正确,其他的部分基本上就是套路了,没有什么复杂的。
Sub Demo()
Dim regExp As Object, regExpMHs As Object, mh, smh, res()
Set regExp = CreateObject("vbscript.regExp")
regExp.Global = True
regExp.Pattern = "([一-龟]+)\s+([一-龟]+)\s+(\d+)\*(\d+)\*(\d+)=(\d+)"
Set regExpMHs = regExp.Execute([a1])
If regExpMHs.Count > 0 Then
ReDim res(1 To regExpMHs.Count, 1 To 6)
r = 1
For Each mh In regExpMHs
c = 1
For Each smh In mh.submatches
res(r, c) = smh
c = c + 1
Next
r = r + 1
Next
End If
[c3].Resize(r - 1, c - 1).Value = res
Set smh = Nothing
Set mh = Nothing
Set regExpMHs = Nothing
Set regExp = Nothing
End Sub
【代码解析】
第3行代码创建正则表达式对象。
第5行代码设置匹配模式。
正则表达式 | 说明 |
---|---|
([一-龟]+) | 匹配一个或者多个中文字符,即商品名称为第一个捕获组 |
\s+ | 匹配一个或者多个空白字符 |
([一-龟]+) | 匹配一个或者多个中文字符,即类别为第二个捕获组 |
(\d+)\*(\d+)\*(\d+)=(\d+) | 匹配数学表达式中的一个或者多个数字,分别为第3~6个捕获组 |
第6行代码执行正则匹配。
第7行代码判断是否匹配成功。
第8行代码定义动态数组用于保存结果数据。
第10~17行代码循环遍历匹配对象。
第12~15行代码序号遍历捕获组,第13行代码将数据写入数组。
第19行代码将结果写入工作表中C3单元格为左上角的区域。
第20~23行代码清空对象变量,释放系统资源。