之前介绍过关于
一键汇总多个sheet数据到总表的实例
,当时分享的实例里面多个sheet里面的内容格式基本相似,数据行、列都是一样的。今天就来分享一下,数据行、列不完全一样的情况。
这个实例也正好是之前有网友找我交流,然后稍微帮忙给调整了一下,这里和大家来分享一下。
他的需求是这样的,如下图:
当日的车辆信息会分别记录在每一个sheet当中,他的需求就是将每天的车辆信息汇总到一个总表当中去,如下图:
观察一下每天的车辆信息的sheet,会发现:
1、每天的车辆数量不相同,有的日期多,有的日期少。
2、每天的sheet中,如果遇到车辆信息比较多的时候,信息会分成两列。
思路
大体的思路和
Excel vba 实例(6) - 一键汇总多个sheet数据到总表
这篇文章的差不多,先遍历每一天的sheet,在当天的sheet中遍历每一行车辆信息(因为有两列车辆信息,简单化,每列都遍历一遍),将遍历的信息复制到总表当中。但是,中间需要加一些条件判断:
如果“车号”列中为空值得话,则不需要汇总该行信息。
核心代码
For Each sht In Worksheets #遍历每天的sheet
If sht.Name <> ActiveSheet.Name Then
For i = 5 To 100 #从第五行车辆信息开始,遍历sheet的每一行
If Len(sht.Range("B" & i)) > 0 Then
sht.Range("A" & i, "C" & i).Copy Cells(copy_hang, 1)
copy_hang = copy_hang + 1
End If
Next
For i = 5 To 100 #遍历sheet的另外一列车辆信息
If Len(sht.Range("F" & i)) > 0 Then
sht.Range("E" & i, "G" & i).Copy Cells(copy_hang, 1)
copy_hang = copy_hang + 1
End If
Next
End If
Next
效果图
拓展一下
从效率的角度上来说,上面的这个代码有一些毛病,在这一行:
For i = 5 To 100 #从第五行车辆信息开始,遍历sheet的每一行
这行的意思是从第5行开始遍历,一直遍历到100行。如果车辆信息有101行,那么显然101行就会没有汇总到。如果车辆信息只有10行,那么剩下的11行到100行就没必要去遍历了。
也就意味了要更智能一些:设置条件让代码自行判断需要遍历多少行
如下,加入Do while函数,增加一个判断车辆信息为空的条件。
start_hang = 5
Do While True
If Len(sht.Range("B" & start_hang)) > 0 Then
sht.Range("A" & start_hang, "C" & start_hang).Copy Cells(copy_hang, 1)
start_hang = start_hang + 1
copy_hang = copy_hang + 1
End If
If Len(sht.Range("B" & start_hang)) = 0 Then#如果车辆信息为空,则退出遍历循环
Exit Do
End If
Loop
得到的结果和上面是一样的,但是为了说明问题,来比较一下两种方式所需要的时间:
同样是233条记录,方法一所需要的时间为1.55s左右
方法二所需要的时间为1.4s左右
经过永恒君的多次测试,方法二平均要比方法一快0.15s左右,这也印证了方法二的改进可以提高效率。
如果需要源文件的话,后台回复「汇总不同」即可。其他VBA实例,可以在公号里「精华整理」-「VBA实例」进行查看。
如果你觉得文章还不错,请大家点赞分享下。你的肯定是我最大的鼓励和支持。
Excel vba 实例(18) - 一键将单列长数据平均拆成多列
收藏 | 17个Excel vba实例汇总
Excel vba 实例(17) - 遍历多个工作簿并提取内容到总表
Excel vba 实例(16) - 按指定字段分类批量提取内容
Excel vba 实例(15) - 按指定字段一键筛选并取最低价记录