微信公众号:yhjbox(永恒君的百宝箱),获取最新文章、资源。

Excel vba 实例(19) – 一键汇总不完全相同的sheet到总表

Excel VBA 实例 永恒君 2063℃ 0评论

之前介绍过关于一键汇总多个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) - 按指定字段一键筛选并取最低价记录

微信公众号:永恒君的百宝箱
个人博客:www.yhjbox.com

转载请注明:永恒君的百宝箱 » Excel vba 实例(19) – 一键汇总不完全相同的sheet到总表

喜欢 (1)
发表我的评论
取消评论
表情