楼主 kevinchengcw |
Q: 如何利用vba代码依指定规律拆分及重组数据? A:数据如下图所示:
拆分及重组规则: 1. 当字符串中有空格时,依空格后面“/”两侧数字对前面数据进行拆分重组(注:“/”两侧数字之和等于最开始的数字),如:“12C25 2/5/5”,12=2+5+5,拆分重组后应得到“2 C25 5 C25 5 C25” 2. 当字符串中没有空格时,;()全部替换成掉,其余的独立数字或字母开头后跟数字的拆分以及其他的非字母及数字的字符拆分成独立单元,如“A10@100/200(4)”应得到“A10 @ 100 / 200 4”
代码如下:
- Sub test()
- Dim N&, Arr, ArrT, Str$, I&, ArrResult
- Arr = [a1].Resize(Cells(Rows.Count, 1).End(3).Row, 1).Value '将目标区域写入数组
- ReDim ArrResult(1 To UBound(Arr), 1 To 1) '定义一个与目标区域相同大小的数组用于存放结果(当然也可以直接改写目标区域数组)
- With CreateObject("vbscript.regexp") '创建正则项目
- .Global = True '全局有效
- For N = LBound(Arr) To UBound(Arr) '循环数组各项
- .Pattern = "([A-Z]+\d+)" '定义通用正则项目(用于提取字母开头后跟数字的字符串)
- If Arr(N, 1) Like "* *" Then '判断当前数组内容中是否有空格
- ArrT = Split(Arr(N, 1), " ") '有则依空格拆分放入数组
- ArrT(0) = .Replace(ArrT(0), " $1") '将字母开头后跟数字的字符串前添加个空格
- Str = Split(ArrT(0) & " ", " ")(1) '提取数组第二段的内容
- ArrT = Split(ArrT(1), "/") '依/拆分放入数组
- For I = LBound(ArrT) To UBound(ArrT) '循环与前面得到的字母开头后跟数字的字符串相组合,结果写入结果数组中
- ArrResult(N, 1) = ArrResult(N, 1) & ArrT(I) & " " & Str & IIf(I = UBound(ArrT), "", " / ")
- Next I
- Else '如果没有空格
- Arr(N, 1) = .Replace(Arr(N, 1), " $1") '将字母开头后跟数字的字符串前添加个空格
- .Pattern = "([/@x+])" '将指定字符两侧增加空格
- Arr(N, 1) = .Replace(Arr(N, 1), " $1 ")
- .Pattern = "[();]" '将指定字符替换成空格
- Arr(N, 1) = .Replace(Arr(N, 1), " ")
- Arr(N, 1) = WorksheetFunction.Trim(Arr(N, 1)) '去掉多余的空格
- ArrResult(N, 1) = Arr(N, 1) '结果放入结果数组中
- End If
- ArrResult(N, 1) = Replace(ArrResult(N, 1), " ", vbTab) '将结果数组中空格全部替换成制表符(这一步也可以省略,后面直接用空格拆分)
- Next N
- End With
- [k1].Resize(UBound(ArrResult), 1) = ArrResult '将结果数组写入目标区域
- Columns("K").TextToColumns Tab:=True '对目标区域所在列进行分列处理,依制表符拆分
- End Sub
详见素材源帖. |