示例需求:原始数据如下图所示,药名的字数不相同,每个汉子的拼音顺序保存在C列至G列。
现在需要将数据整理为如下3列的格式。
示例代码如下。
Sub demo()
Dim res()
cnt = 1
arr = Sheet1.[a1].CurrentRegion.Value
For i = 2 To UBound(arr)
bFirst = True
For j = 3 To 7
If arr(i, j) = "" Then
Exit For
Else
ReDim Preserve res(1 To 3, 1 To cnt)
If bFirst Then
res(1, cnt) = arr(i, 1)
bFirst = False
End If
res(2, cnt) = arr(i, 2)
res(3, cnt) = arr(i, j)
cnt = cnt + 1
End If
Next
Next
Sheet2.Range("2:60000").Clear
Sheet2.[a2].Resize(cnt - 1, 3).Value = Application.Transpose(res)
End Sub
【代码解析】
第2行代码声明数组用于保存转化后的数据。
第3行代码设置变量用于记录数据行号。
第4行代码将原始数据读取到数组中。
第5~21行代码循环处理数据。
第6行代码设置标识bFirst
为True,当前数据行为一个新的药名。
第7~20行代码循环处理某个药名的全部拼音。
第8行代码判断单元格内容是否为空,如果为空说明已经处理完当前数据行,第9行代码结束当前For循环。
第11行代码重新声明结果数组。
第12行代码判断bFirst
标识变量。
如果为True就执行第14行代码,将药名写入序号写入第一列,然后执行第15行代码,修改标识变量值为False。
第16~17行代码将药名和拼音更新到第2列和第3列。
第22行代码情况结果工作表的数据区域。
第23行代码将res
数组写入到工作表中,其中Transpose
实现数组转置。