美文网首页
Excel vba 实例(19) - 一键汇总不完全相同的she

Excel vba 实例(19) - 一键汇总不完全相同的she

作者: 永恒君的百宝箱 | 来源:发表于2019-10-15 10:36 被阅读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) - 按指定字段一键筛选并取最低价记录


    相关文章

      网友评论

          本文标题:Excel vba 实例(19) - 一键汇总不完全相同的she

          本文链接:https://www.haomeiwen.com/subject/kmijmctx.html