专栏名称: Excel之家ExcelHome
excel技巧原创教程每日推送,excel表格职场模板干货仓库,图文/视频/动画等多种教学方式分享excel操作技巧教程/excel函数公式教程/excel数据透视表教程/excel图表教程/Word教程,助您轻松提高办公效率!
目录
相关文章推荐
Excel之家ExcelHome  ·  想快速给奖牌榜排个序?用SORT函数,简单又高效! ·  昨天  
Excel之家ExcelHome  ·  一对多查询的5种方法,你最喜欢哪一种 ·  3 天前  
Excel之家ExcelHome  ·  Excel暨Power BI数据规范可视化实战 ·  5 天前  
Excel之家ExcelHome  ·  按指定一级类别显示二级菜单 ·  6 天前  
完美Excel  ·  白鹤滩的初冬 ·  5 天前  
51好读  ›  专栏  ›  Excel之家ExcelHome

VBA常用小代码011:用【合并计算】汇总多表数据到总表

Excel之家ExcelHome  · 公众号  · Excel  · 2017-11-04 07:14

正文

有朋友发消息问能否用代码实现多表合并计算的功能。

嗯,先说下什么是“合并计算”。

它是Excel自带的一个功能,位于【数据】选项卡下的【数据工具】中。  

它的主要功能是根据指定的多个(单表或多表甚至多工作簿)单元格区域进行合并计算,一般常用于多表数据统计。

比如下面这个小动画,5秒即可搞定多表数据统计。

嘿~!是不是很简便很实用~

~我们现在的问题是,如何用VBA代码执行上面动画的操作过程,方便数据自动化处理。

代码如下:



Sub ConsolidateSheets()

'EH技术论坛公众号VBA编程学习与实践

    Dim Sht As Worksheet

    Dim r, k&, i&

    ReDim r(1 To 1)

    For Each Sht In Worksheets

    '遍历工作表

        If Sht.Name <> ActiveSheet.Name Then

            k = k + 1

            ReDim Preserve r(1 To k) '动态设置数组大小

            r(k) = Sht.Name & "!" & Sht.UsedRange.Address(ReferenceStyle:=xlR1C1)

            '数据区域地址以r1c1形式装入数组r

        End If

    Next

    Cells.ClearContents '清除当前表数据

    Range("a1").Consolidate sources:=r, Function:=xlSum, toprow:=True, leftcolumn:=True

    'Consolidate合并计算语句,基于行列汇总,求和形式。

    MsgBox "合并计算OK"

End Sub


 

小贴士:

1,代码将数据汇总到当前表中,因此在运行代码前,务必先激活放置汇总数据的表格。

2,在多表数据汇总合并的问题上,合并计算的优点是,它支持标题行乱序,甚至数量不一致的情况,例如一张表的标题行是语文、数学、英语,其它表的标题行为英语、语文、数学等,并不妨碍合并计算统计结果正确性。

3,但……合并计算要求标题行和列只能单行或单列。而且,除了指定的标题行和列以外的区域,均被视为统计区域,若其中含有文本,则忽略不统计。

致命的是第2点,这使得合并计算的功能大打折扣了,正因如此,该功能才鲜有人知吧。在VBA编程上,更多的时候,我们是通过ADO+SQL+字典做多表标题行乱序的数据统计。

最后附Consolidate方法的说明

Range.Consolidate(Sources, Function,TopRow, LeftColumn, CreateLinks)

The End

图文作者:看见星光

VBA编程学习与实践

易学宝微视频教程,1290个Office技巧精粹,每个技巧都与实际工作密切相关。轻松学习技巧,练就职场达人,淘宝搜索关键字:ExcelHome易学宝

本公众号主页回复关键字 大礼包 ,获取50集精彩微视频教程。