如何快速汇总多sheet表数据成总表

举个例子,

如下图所示。一个工作簿包含了多张工作表,每张工作表的标题行数和排列顺序是相同的,不过数据区域可能包含合并单元格……

image

使用以下代码可以将多表数据汇总,并保留源表的合并单元格格式等。

Sub GetShData1()
    Dim sht As Worksheet, rng As Range
    Dim k As Long, intLastRow As Long
    With Application '取消屏幕刷新等
        .ScreenUpdating = False
        .Calculation = xlCalculationManual
    End With
    Cells.Clear '清空数据
    For Each sht In Worksheets '遍历表
        If sht.Name <> ActiveSheet.Name Then
            Set rng = sht.UsedRange '已使用单元格区域
            If IsEmpty(rng) = False Then '判断是否空表
                k = k + 1 '计数器
                If k = 1 Then
                    rng.Copy Range("a1") '复制粘贴数据
                Else
                    intLastRow = Cells.Find("*", _
                        LookIn:=xlFormulas, SearchOrder:=xlByRows, _
                        SearchDirection:=xlPrevious).Row + 1
                    rng.Copy Cells(intLastRow, 1) '粘贴数据
                End If
            End If
        End If
    Next
    With Application '恢复屏幕刷新
        .ScreenUpdating = True
        .Calculation = xlCalculationAutomatic
    End With
    MsgBox "已汇总:" & k & "个工作表。"
End Sub

上述代码虽然解决了多表汇总的问题,但比较简陋,有很多细节问题未能正确处理;比如……

1 丨
它将每张表的标题行都复制到了汇总表,实际上,只需要保留首张工作表的标题行就可以了。
2 丨
如果分表处于筛选状态,直接复制粘贴会造成数据遗漏,毕竟绝大部分Excel版本都是默认只复制筛选状态下可见单元格的数据。
3 丨
汇总结果未提供数据来源工作表的表名。为了体现社会主义核心价值观,敬业、诚心、友善……我们最好还是增加一个字段,显示工作表名称。

image

进化后的代码如下……


Sub GetShData()
    Dim sht As Worksheet, rngData As Range
    Dim i As Long, intLastRow As Long
    Dim intTitCount, intYesOrNo As String
    Dim rngLast As Range, rngFirst As Range
    intTitCount = getTitCount() '获取用户输入的标题行数
    If intTitCount = False Then Exit Sub
    intYesOrNo = MsgBox("是否需要保留源表格式、公式等?", vbYesNo)
    Call disAppSet '取消屏幕刷新,公式重算等
    Cells.Clear '清空当前表数据
    For Each sht In Worksheets '遍历工作表
        If sht.Name <> ActiveSheet.Name Then
            Set rngData = sht.UsedRange '有效单元格区域
            If IsEmpty(rngData) = False Then '判断工作表是否非空
                If sht.AutoFilterMode = True Then
                    sht.Cells.AutoFilter '取消筛选,避免数据复制遗漏
                End If
                k = k + 1 '计数器
                If k = 1 Then '如果是第一张工作表
                    rngData.Copy '复制源表单元格
                    Range("b1").PasteSpecial xlPasteColumnWidths '粘贴列宽
                    Call rngPaste(Range("b1"), intYesOrNo) '粘贴数据
                    Set rngFirst = Cells(1, 1) '开始单元格
                    intLastRow = GetIntLastRow '结束行
                    Set rngLast = Cells(intLastRow, 1) '结束单元格
                    Range(rngFirst, rngLast) = sht.Name '填充工作表名称
                Else
                    rngData.Offset(intTitCount).Copy '扣除标题复制
                    Call rngPaste(Cells(rngLast.Row + 1, 2), intYesOrNo)
                    intLastRow = GetIntLastRow
                    Set rngFirst = rngLast.Offset(1) '开始单元格
                    Set rngLast = Cells(intLastRow, 1) '结束单元格
                    Range(rngFirst, rngLast) = sht.Name '填充工作表名称
                End If
            End If
        End If
    Next
    Call rngFormat(intTitCount)
    Call reAppSet '恢复屏幕刷新等
    MsgBox "一共汇总了" & k & "张工作表。"
End Sub

'获取用户输入的标题行数
Function getTitCount()
    Dim intTitCount
    intTitCount = InputBox("请输入标题行的行数", _
                        Title:="公众号Excel星球", _
                        Default:=1)
    If StrPtr(intTitCount) = False Then
        getTitCount = False
        Exit Function
    End If
    If IsNumeric(intTitCount) = False Then
        MsgBox "标题行的行数只能输入数字。"
        getTitCount = False
        Exit Function
    End If
    If intTitCount < 0 Then
        MsgBox "标题行数不能为负数。"
        getTitCount = False
        Exit Function
    End If
    getTitCount = intTitCount
End Function

'取消屏幕刷新,公式重算等
Sub disAppSet()
    With Application
        .ScreenUpdating = False
        .Calculation = xlCalculationManual
        .DisplayAlerts = False
    End With
End Sub

'恢复屏幕刷新等
Sub reAppSet()
    With Application
        .ScreenUpdating = True
        .Calculation = xlCalculationAutomatic
        .DisplayAlerts = True
    End With
End Sub

'最后存在数据的行
Function GetIntLastRow()
    GetIntLastRow = Cells.Find("*", _
        LookIn:=xlFormulas, SearchOrder:=xlByRows, _
        SearchDirection:=xlPrevious).Row
End Function

'粘贴子过程
'两个参数
'一个粘贴区域起始单元格
'一个粘贴的方式,是否只粘贴数值
Sub rngPaste(ByVal rng As Range, ByVal intYesOrNo As Long)
    If intYesOrNo = 6 Then '是否保留源表格式
        rng.PasteSpecial xlPasteAll '粘贴全部
    Else
        rng.PasteSpecial xlPasteValues '粘贴数值
    End If
    'Application.CutCopyMode = False
End Sub

'将B列格式复制到A列
Sub rngFormat(ByVal intTitCount As Long)
    Range("b:b").Copy
    With Range("a1")
        .PasteSpecial xlPasteFormats '粘贴B列格式
        .Value = "工作表名" '填写工作表来源
        .Resize(intTitCount, 1).Merge '合并多行标题
        .HorizontalAlignment = xlCenter '水平居中
        .VerticalAlignment = xlCenter '垂直居中
        .EntireColumn.AutoFit '自动列宽
        .Select
    End With
End Sub
打完收工!!
原文链接:

https://mp.weixin.qq.com/s/0pxi_xn-a8A10f7mM-YxEw

示例文件下载,百度网盘▼

https://pan.baidu.com/s/1MT-r6M7LLBbftZYlCPlurQ
提取码: sm2a

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 215,539评论 6 497
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,911评论 3 391
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 161,337评论 0 351
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,723评论 1 290
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,795评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,762评论 1 294
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,742评论 3 416
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,508评论 0 271
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,954评论 1 308
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,247评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,404评论 1 345
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,104评论 5 340
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,736评论 3 324
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,352评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,557评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,371评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,292评论 2 352