实例需求:材料编码保存在A列中,现需要将其拆分为名称
和规格型号
,分别保存再B列和C列。

物料编码存在如下几种形式,对应不同的拆分规则如下:
- 名称+规格组合(无空格),例如:扁钢840635
- 名称+规格数字,例如:上仓板1
- 名称(不包含规格),例如:风口
- 名称(末尾可能包含数字)+空格+规格,例如:钢管1 1/2*1540
示例代码如下。
Sub Demo()
Dim i As Long, strTxt As String, arrData
Dim objRegExp As Object, objMatch As Object
Dim c As Range: Set c = [a1].CurrentRegion
arrData = c.Value
Set objRegExp = CreateObject("vbScript.Regexp")
With objRegExp
.Global = True
.Pattern = "^((?:\D+?(?:\d+ )*))([\d\*\/\.]+)"
.IgnoreCase = True
.Multiline = False
For i = 2 To UBound(arrData)
strTxt = arrData(i, 1)
Set objMatch = objRegExp.Execute(strTxt)
If objMatch.Count = 0 Then
arrData(i, 2) = strTxt
Else
With objMatch(0)
arrData(i, 2) = Trim(.SubMatches(0))
arrData(i, 3) = .SubMatches(1)
End With
End If
Next
End With
c.Value = arrData
Set objRegExp = Nothing
Set objMatch = Nothing
End Sub
【代码解析】
第4行代码获取前三列的数据区域。
第5行代码将数据表加载到数组中。
第6行代码创建正则对象。
第9行代码设置正则匹配模式。
正则表达式 | 说明 |
---|---|
\D+? |
匹配一个或者多个非中文字符,即材料名称 |
(?:\d+ )* |
匹配材料名称中最后可能包含的数字,?: 说明括号内为非提取组 |
([\d\*\/\.]+) |
匹配一个或者多个规格字符,包含数字,型号,反斜杠和小数点 |
第12~24行代码循环遍历处理每行数据。
第13行代码将第一列数据保存到变量中。
第14行代码执行正则匹配。
第15行代码判断是否匹配成功。
如果没有匹配成功,第16行代码填写"名称"。
如果匹配成功,第19和20行代码分别填写"名称"和"规格型号"。
第25行代码将结果写入到工作表中。