Excel财务数据合并与分析建模案例视频精讲
上QQ阅读APP看书,第一时间看更新

2.1.2 结构完全相同的特殊表格:不同工作簿内的工作表

合并计算工具,除了适用于同一个工作簿内的多个工作表汇总外,还适合不同工作簿的工作表汇总,只要保证各工作簿的工作表结构相同即可。

例如,文件夹里有三个工作簿,分别保存三个城市门店各月的销售数据,如图2-19所示,每个工作表结构及数据示例如图2-20所示。现在的任务是将这三个工作簿的所有工作表数据合并起来。

图2-19 文件夹里的三个工作簿

图2-20 某个工作簿内的工作表

1.使用合并计算工具

这种跨工作簿合并计算稍微烦琐,但不复杂,主要步骤如下。

步骤1 使用“打开”命令按钮,打开所有要合并的工作簿。

步骤2 新建一个工作簿,设计汇总表结构(与某个原工作表相同,复制一个结构即可)。

步骤3 单击“合并计算”命令按钮,打开“合并计算”对话框(参考图2-9)。

步骤4 分别激活每个工作簿的每个工作表,添加区域,如图2-21所示。

图2-21 添加每个工作簿的工作表数据区域

步骤5 选中“创建指向源数据的链接”复选框,然后单击“确定”按钮,得到如图2-22所示的合并表。

图2-22 合并表数据

步骤6 关闭源数据工作簿。

步骤7 单击左侧边条上的二级按钮,展开合并表,如图2-23所示。

图2-23 展开合并表

步骤8 单击B列的各单元格,观察公式编辑栏的引用公式,可以看到每一行引用了哪个工作簿、哪个工作表的数据。

步骤9 在每个城市上手动插入空行,用SUM函数对该城市求和,并输入相应城市和门店名称,如图2-24所示。可以先处理1月份的数据,然后以此为参照,处理其他月份的数据。

图2-24 输入城市和地区名称

2.使用VBA

上述的合并计算方法比较麻烦,尤其是在要汇总的工作簿和工作表很多的场合,此时,可以使用VBA,单击一个按钮即可实现合并,得到各工作簿工作表的合计数。

针对上述案例,下面是参考代码,这里已确定了要汇总的具体工作簿。

    Sub 汇总()
      Dim wbx As Workbook
      Dim wsx As Worksheet
      Dim ws As Worksheet
      Dim i As Integer, j As Integer, k As Integer, l As Integer
      Dim arr As Variant, s
      Set ws = ThisWorkbook.Worksheets("汇总")
      arr = Array("北京.xlsx", "深圳.xlsx", "苏州.xlsx")
      For k = 0 To UBound(arr)
        Workbooks.Open Filename:=ThisWorkbook.Path & "\" & arr(k)
      Next k
      For i = 3 To 15
        For j = 2 To 9
          s = 0
          For k = 0 To UBound(arr)
            Set wbx = Workbooks(arr(k))
            For l = 1 To wbx.Worksheets.Count
              Set wsx = wbx.Worksheets(l)
              s = s + wsx.Cells(i, j)
            Next l
          Next k
          ws.Cells(i, j) = s
        Next j
      Next i
      For k = 0 To UBound(arr)
        Workbooks(arr(k)).Close savechanges:=False
      Next k
    End Sub

如果要汇总的工作簿有很多,也不清楚每个工作簿具体的名字,可以使用下面的代码将指定文件夹内的所有要汇总的文件搜索出来。

    Sub 搜索()
      Dim fPath As String
      Dim fName As String
      Dim f(1 To 100) As String
      Dim i As Long
      fPath = ThisWorkbook.Path & "\"
      fName = Dir(fPath, 0)
      i = 0
      Do While Len(fName) > 0
        f(i + 1) = fPath & fName
        fName = Dir()
        i = i + 1
      Loop
    End Sub