实例需求:A列中从A3单元格开始保存原始数据,数量不确定,每个数据均为7个数字组成,现需要将数字逐个拆分B列至H列,如果H列的数字小于等于4,那么将该行数据复制一行(简称为附加行),并且最后一个数字加10,如下图中黄色单元格所示。
示例代码
Sub demo()
Dim res()
lst = Cells(Rows.Count, 1).End(xlUp).Row
If lst > 2 Then
arr = Range("A3:A" & lst).Value
r = 1
ReDim res(1 To lst * 2 - 4, 1 To 7)
For i = 1 To lst - 2
n = CStr(arr(i, 1))
For j = 1 To 7
res(r, j) = Mid(n, j, 1)
res(r + 1, j) = res(r, j)
Next
r = r + 1
If res(r, 7) <= 4 Then
res(r, 7) = res(r, 7) + 10
r = r + 1
End If
Next
[b3].Resize(r - 1, 7).Value = res
End If
End Sub
【代码解析】
第3行代码获取A列最后一个数据所在行号。
第4行代码判断A列是否有数据,如果lst大于2说明有数据。
第5行代码将A列数据读入数组。
第7行代码声明动态数组用于保存拆分数据。
第8~19行代码循环处理每个数据。
第9行代码将数据转换为字符。
第10~13行代码将数据拆分为数字,保存在结果数组res中。
此处有一个小技巧,第11~12行代码将相同的拆分数字写入了res(r, j)和res(r+1, j),此时并没有判断最后一个数字的大小,是否需要创建附加行,这样处理的好处在于,无需再次循环填写附加行。
第15行代码判断最后一个数字是否小于等于4,如果满足条件,第16行代码将最后一个数字加10。
同学们请注意res下标r的处理技巧,首先第14行代码中r+1,此时r指向第12行代码填充的行,如果满足第15行代码条件,那么下一次循环时此行的数据将被覆盖,如果第15行代码条件不满足,那么第17行代码中r+1,此时r指向一个新行。
第20行代码将结果数据写入工作表。
如果只有少量数据,是否使用上述技巧对整体性能的影响可以忽略不计,但是处理大量数据时,每次循环的开销累计起来就会相当客观。