5.8 【多表汇总】合并12个月的报表并制作产品区域动态图表
作者:凌祯      更新:2021-09-06 14:02      字数:10700
  5.8
  【多表汇总】合并12个月的报表并制作产品区域动态图表
  在进行数据整理与汇总分析时,我们一直强调可把数据源汇总到同一张工作表中,即构建统一、全面、准确的数据源,然后再根据这样的数据源去制作数据透视表、商务图表等。然而实际工作中遇见的数据源却并非如此,它们通常是一个个分散开来制作的独立sheet的统计表格(见图5-89中1~12月的销售报表,分别列示在12张工作表中)。这就需要我们利用excel高效处理的手段,将其快速合并统计到一起,并制作出符合呈现需求的商务图表(见图5-90)。
  在实际工作中,由于数据源表格设计的不规范造成数据源分散统计的情况较多,因此,快速、高效地对多个结构相同的表进行快速汇总并制作动态图表就显得尤为重要了。在本节内容中,将介绍excel多个结构相同的表,以合并计算、vba、sql三种不同方式的快速汇总,并制作出与其对应的动态图表相关的技巧内容。
  图5-89
  图5-90
  5.8.1 合并计算法汇总
  具体步骤如下。
  1 启动合并计算功能。打开示例文件,依次按住alt+d组合键和alt+p组合键,打开【数据透视表和数据透视图向导】,选择【多重合并计算数据区域】后,单击【下一步】按钮(见图5-91)。
  图5-91
  2 选择【自定义页字段】,单击【下一步】按钮(见图5-92)。
  图5-92
  3 添加数据源。在【选定区域】中单击sheet1中的数据源区域,并且单击【添加】按钮。添加数据源后,在【请先指定要建立在数据透视表中的页字段数目】选择“1”,并在【字段1】中填写“1月”。同理,依次添加2月到12月的数据。添加完毕后,单击【下一步】按钮(见图5-93)。
  图5-93
  4 导入excel。单击选择【数据透视表显示位置】,在【现有工作表】中选择任意一个空白位置,单击【确定】按钮(见图5-94)。
  图5-94
  5 调整透视表的布局。在新插入的数据透视表的字段布局区域中,将“页1”标签移至【行】中,将“行”标签移至【列】中,即展示为产品名称在上,销售成本在下的布局。选中第10、11月的数据,用拖曳方式将其移动到12月数据之前,使月份呈现升序排序的效果(见图5-95)。
  图5-95
  6 选择汇总列,单击【设计】选项卡,之后单击【分类汇总】→【不显示分类汇总】,即可完成基于透视表的合并计算功能,为后续的数据可视化呈现奠定基础(见图5-96)。
  图5-96
  说明:采用合并计算的方法,只适用于较为简单的数据源表格,例如数据源中只包含顶端或左侧两个标题列,各分表中的内容都是按照行列标题进行对应求和的情况。如果遇到行、列中有多个标题项目时,则该方案并不适用,比如在数据源中,增加了一列字段“区域”的情况。
  5.8.2 vba汇总
  当数据源区域中包含多个标题项目(如图5-97所示,在a~c列)时,分别列示的字段为月份、区域和项目。在多列标签列的情况下,我们无法使用合并计算的方法,单独地对每个标签一一对应的多个月份的工作表的内容进行汇总。在这种情况下,我们往往需要手动地把每个月份工作表中的内容复制/粘贴到一起,才能完成数据源的汇总工作。在excel中,基于相同逻辑的重复性动作,比如不断地复制/粘贴等,通常可以采用vba的方法予以处理——解决重复性劳动。
  图5-97
  1 打开示例文件,按alt+f11组合键,打开excel vba编辑器界面。单击【插入】选项卡,新建一个模块,excel自动将其命名为“模块1”,然后将vba代码复制到模块1中(见图5-98)。
  代码如下:
  图5-98
  代码说明:
  遍历当前每张工作表的名称,是否不等于(<>)“合并”,如果是的话,把该工作表中已使用的区域a1:g最大行进行复制,然后粘贴到“合并”工作表中从上至下的未填写内容的第一个空白行中。汇总完毕,弹出对话框提醒“合并完毕”。
  代码的运行:直接单击工具栏上的绿色小三角即可运行(见图5-99)。
  图5-99
  2 汇总分析。运行代码后,选中已经自动汇总到一起的数据源区域中的任意一个有字单元格。然后单击【插入】选项卡的【数据透视表】,在弹出的【创建数据透视表】对话框中,excel已经默认选取了数据源表中的连续区域作为透视来源,单击【确定】按钮。
  3 完善报表。在新建的数据透视表的工作表中,选中【数据透视表字段】区域中的各个字段,将其拖曳至字段列表的布局位置:将“月份”、“区域”、“项目”移至【行】;产品1~3移至【Σ值】,修改为“求和”(见图5-100)。
  4 透视表布局的优化。选中数据透视表区域后,单击【数据透视表工具】→【设计】选项卡,在【报表布局】中选择【以表格形式显示】,之后选择【重复所有项目标签】,这样即可将原先层叠似的报表布局更改为我们平时看到的数据透视表那样,一列一个字段地展示效果(见图5-101)。
  图5-100
  图5-101
  小结:通过这样的方法,我们完成了多个结构相同表格的快速汇总。
  5.8.3 sql汇总
  对于像5.8.2节示例中拥有多列标签结构相同的多张工作表进行合并时,除了使用vba汇总法以外,还可以使用sql方法进行汇总。
  我们通常说的sql通常指sql服务器或者sql语言。在本例中,我们指的是使用sql语言来进行多表合并的实例化操作。
  structured query language(结构化查询语言)简称sql,它是一种特殊目的的编程语言,是一种数据库查询和程序设计语言,用于存取数据以及查询、更新和管理关系数据库系统。
  对于sql语言的学习是另一个专业的知识领域。在本书中,我们不对此做全面的讲解,但是会告诉大家一些基本的sql语法,以便进行商务图表的绘制。
  select 字段名 from [表名]的含义:从某张表中取出某个字段。在sql中,用*表示该表中的所有字段,比如:select*from [表名]。
  如果需要将其他表中的内容合并到同一张表时,只需要在后面加上一个“union all”的语句,即可依次合并指定表当中的字段内容。
  所以,回到我们的示例文件中,将1~12月中每张工作表的所有字段全部合并到一起的sql语句如下:
  说明:在excel中,关联的每张表的具体表名写法如下:[表名$],即在工作表的名称后面需要加上美元符号$,并用英文状态下的方括号将其括起来。
  在掌握了上述技巧之后,我们开始构建excel多表合并的数据透视表,以便为后续动态图表的制作奠定数据基础。
  1 插入透视表。新建一个空白的工作表,单击【插入】选项卡中的【数据透视表】按钮,在弹出的【创建数据透视表】对话框中选择【使用外部数据源】,单击【选择连接】按钮,在弹出的【现有连接】对话框中单击【浏览更多】按钮,找到示例文件中的表格位置后,选择该表并单击【确定】按钮(见图5-102)。
  选择指定的工作簿,单击【确定】按钮,在弹出的【选择表格】对话框中选择任意一张工作表作为占位,如选择【'10月$'】,单击【确定】按钮。此时excel会将你所选的当前表作为数据源去创建一个透视表,并且按照图5-103所示,将它放在现有工作表即sheet1的a1单元格处开始创建。
  图5-102
  图5-103
  2 更改数据源。在新建的透视表中,单击【数据透视表工具】→【分析】选项卡,之后单击【更改数据源】右侧的小三角按钮,选择【连接属性】。
  在弹出的【连接属性】对话框中选择【定义】选项卡,将【命令类型】更改为【sql】,在【命令文本】中输入我们提前准备好的sql语句,单击【确定】按钮。之后,excel会将该透视表所关联的数据源变更为1~12月的12张工作表中的所有数据源内容(见图5-104)。
  图5-104
  3 制作透视表。数据源关联过来后,将对应的字段名称拖曳到透视表合适的字段区域中,完成1~12月数据的合并透视表制作,效果如图5-105所示。
  图5-105
  下面我们就可以基于这样一份汇总后的数据透视表,开始制作具有动态图表效果的财务年报动态图表了。
  5.8.4 制作动态年报
  1.制作绘图用的控件组
  具体步骤如下。
  1 创建数据标签。在空白表格的a1:b13单元格区域中依次输入“选项”“产品”“类别”及其二类项目名称等。
  2 插入控件。单击【开发工具】选项卡中的【插入】→【组合框】,在空白区域绘制控件(见图5-106)。
  图5-106
  选中控件框后单击鼠标右键,选择【设置控件格式】,在弹出的【设置控件格式】对话框中,在【数据源区域】中选择b2:b5单元格区域,【单元格链接】为c2单元格,单击【确定】按钮。设置完成后,控件便可下拉选项选择不同的产品类别并在c2单元格处显示相同类型的序列号。比如:选择控件下拉列表中的【产品2】,会在c2单元格中显示【2】的结果,这表示【产品2】在数据来源区域b2:b5中排第2位(见图5-107)。同理,绘制【地区】的【控件】→【组合框】。
  3 统一格式。按住ctrl键选中两个控件框,单击【格式】选项卡,之后依次将【大小】中的【高度】设置为1,将【宽度】设置为3,并利用【排列】→【对齐】→【左对齐】的方式,将两个组合框进行快速、准确的对齐(见图5-108)。
  图5-107
  图5-108
  4 插入复选框。单击【开发工具】选项卡,之后单击【插入】→【复选框】,在空白区域绘制控件。选中已经插入的【复选框】,单击鼠标右键,选择【编辑文字】,将其显示内容修改为“销售收入”。
  绘制完毕后,选中【销售收入】复选框,按ctrl+shift组合键向下拖曳控件框,进行快速复制,重复3次,快速完成【销售成本】【销售毛利】【毛利率】复选框的制作。并按照上例的方法,单击鼠标右键,选择【设置控件格式】,将每个控件链接到具体的单元格中,即c10、c11、c12、c13。设置完毕后,勾选复选框时,对应的单元格会呈现“true”的结果,反之则为“false”(见图5-109)。快速复制后的效果如图5-110所示。
  图5-109
  图5-110
  5 控件的组合。选中4个复选框控件,单击【格式】选项卡,选择【对齐】→【左对齐】+【纵向分布】,使得文本框快速对齐到适宜的位置。
  单击【开发工具】选项卡,选择【插入】→【分组框】,在4个复选框控件的外围位置绘制分组框控件,并修改控件的标题为“选择项目”。设置完毕后,选择分组框与4个复选框,然后单击鼠标右键,单击【组合】选项,将这5个元素组合为一个整体(见图5-111)。
  单击【插入】选项卡中的【文本框】,在插入的文本框中,编辑文字为“选择产品:”和“选择区域:”,设置文本框的字体、字号,并设置底纹颜色和边框均为无色。设置完毕后,将文本框与两个组合框控件进行组合(见图5-112)。
  图5-111
  至此,我们完成了动态图表中根据控件选择结果的不同,将控件的值绑定到单元格中的效果制作。而这些单元格的变化,在下一步中将作为绘制动态图表的参数来源,应用于具体的函数公式中,从而构建动态的制图数据源。这也是动态图表中能“动”的内核所在。
  2.制作绘图用的数据源
  具体步骤如下。
  1 编制空白表。在a19:e31单元格区域中分别输入“月份”“销售成本”“销售毛利”“销售毛利率-平均值”“销售收入”等,并设置单元格边框的形式(见图5-112)。
  2 编写公式,将【汇总表】中制作的统计透视表的数据引用过来(见图5-113)。
  图5-112
  图5-113
  【根据月份,查找3个产品的销售成本之和】
  在b20单元格中输入公式(=vlookup($a20,汇总表!$b:$t,2,0)+vlookup($a20,汇总表!$b:$t,8,0)+vlookup($a20,汇总表!$b:$t,14,0))。输入完成后,将其向下快速填充至b31单元格。
  说明:vlookup中的第3个参数为返回值所在数据源区域中的列号(见图5-114)。
  图5-114
  同理,在c20单元格中输入公式(=vlookup($a20,汇总表!$b:$t,2+2,0)+vlookup ($a20,汇总表!$b:$t,8+2,0)+vlookup($a20,汇总表!$b:$t,14+2,0))。输入完成后,将其向下快速填充至c31单元格。
  说明:vlookup中的第3个参数只是在b20公式的基础上+2,这是因为在数据源的【汇总表】中销售毛利所在的列号,是在销售成本后两列。
  说明:若快速确认返回值所在数据源的列号,则可以在数据源上方,选中列标签后,从左向右拖曳鼠标。随着选中范围的增加,在鼠标的右下角,会出现一个【1048576rx14c】的提示,这代表着你已经选中了多少行(r)乘以多少列(c)。这样就避免了人工数列号的烦琐,提高了工作效率(见图5-115)。
  图5-115
  同理,在d20单元格中输入公式(=sum(vlookup($a20,汇总表!$b:$t,2+3,0)+vlookup($a20,汇总表!$b:$t,8+3,0)+vlookup($a20,汇总表!$b:$t,14+3,0))/3)。输入完成后,将其向下快速填充至d31单元格。
  说明:vlookup中的第3个参数只是在b20公式的基础上+3,这是因为在数据源的【汇总表】中销售毛利率所在的列号,是在销售成本后3列。求和后,使用函数(sum()/3)使得计算的结果为三类产品的算数平均值。
  输入公式后,选中d20:d31区域,单击【开始】选项卡中的【数字】,单击其右侧的小三角并选中【百分比】,快速完成单元格格式的设置。
  同理,在e20单元格中输入公式=vlookup($a20,汇总表!$b:$t,2+4,0)+vlookup ($a20,汇总表!$b:$t,8+4,0)+vlookup($a20,汇总表!$b:$t,14+4,0)。输入完成后,将其向下快速填充至e31单元格,在此不做赘述。
  3 增加第一重嵌套,将函数公式关联上【产品类型】选择的结果(即c2单元格的值)。
  修改b20单元格公式为复合公式:=if(or($c$2=1,$c$2=4),vlookup($a20,汇总表!$b:$t,2,0),0)+if(or($c$2=2,$c$2=4),vlookup($a20,汇总表!$b:$t,8,0),0)+if(or($c$2=3,$c$2=4),vlookup($a20,汇总表!$b:$t,14,0),0)。输入完成后,将其向下快速填充至b31单元格。
  其中函数if()和or()用于与辅助列表中的复选框按钮形成联动,其中【4】表示为【合计】,也就是每个产品的数据都要参与计算。
  同理,重复该步骤操作,依次修改“销售毛利”“销售毛利率-平均值”“销售收入”公式。
  【销售毛利】
  c20=if(or($c$2=1,$c$2=4),vlookup($a20,汇总表!$b:$t,2+2,0),0)+if(or($c$2=2,$c$2=4),vlookup($a20,汇总表!$b:$t,8+2,0),0)+if(or($c$2=3,$c$2=4),vlookup($a20,汇总表!$b:$t,14+2,0),0)
  【销售毛利率-平均值】
  d20=if(or($c$2=1,$c$2=4),vlookup($a20,汇总表!$b:$t,2+3,0),0)+if(or ($c$2=2,$c$2=4),vlookup($a20,汇总表!$b:$t,8+3,0),0)+if(or($c$2=3,$c$2=4),vlookup($a20,汇总表!$b:$t,14+3,0),0)
  【销售收入】
  e20=if(or($c$2=1,$c$2=4),vlookup($a20,汇总表!$b:$t,2+4,0),0)+if(or ($c$2=2,$c$2=4),vlookup($a20,汇总表!$b:$t,8+4,0),0)+if(or($c$2=3,$c$2=4),vlookup($a20,汇总表!$b:$t,14+4,0),0)
  4 关联产品区域。在前面的公式中,vlookup函数的第2个参数一直都是【汇总表!$b:$t】。而需要跟【地区组合框】联动,就需要对应地引用不同的数据源区域作为vlookup函数的查找引用数据源区域了。
  首先需要根据c6单元格的值的不同,将每个地区对应的单元格区域函数编写出来。然后,把这个多重嵌套的函数合并到前面已经设置完成的函数公式中。
  选择任意一个空白单元格,如:在f23单元格中输入公式=if($c$6=1,汇总表!$b$7:$t$18,if ($c$6=2,汇总表!$b$19:$t$30,汇总表!$b$31:$t$42))。编写完毕后,将该公式复制一份,然后对本表中的汇总表!$b:$t进行查找、替换(见图5-116)。
  图5-116
  查找内容:汇总表!$b:$t(见图5-117),替换为if($c$6=1,汇总表!$b$7:$t$18,if($c$6=2,汇总表!$b$19:$t$30,汇总表!$b$31:$t$42))。替换后,b20单元格的公式结果如下:
  b20=if(or($c$2=1,$c$2=4),vlookup($a20,if($c$6=1,汇总表!$b$7:$t$18,if($c$6=2,汇总表!$b$19:$t$30,汇总表!$b$31:$t$42)),2,0),0)+if(or($c$2=2,$c$2=4),vlookup($a20,if($c$6=1,汇总表!$b$7:$t$18,if($c$6=2,汇总表!$b$19:$t$30,汇总表!$b$31:$t$42)),8,0),0)+if(or($c$2=3,$c$2=4),vlookup ($a20,if($c$6=1,汇总表!$b$7:$t$18,if($c$6=2,汇总表!$b$19:$t$30,汇总表!$b$31:$t$42)),14,0),0)
  图5-117
  至此,我们完成了绘图所用数据源的引用与控件的关联。
  同理,更改“销售毛利”“销售毛利率-平均值”“销售收入”的公式。
  【销售毛利】
  c20=if(or($c$2=1,$c$2=4),vlookup($a20,if($c$6=1,汇总表!$b$7:$t$18,if ($c$6=2,汇总表!$b$19:$t$30,汇总表!$b$31:$t$42)),2+2,0),0)+if(or($c$2=2,$c$2=4),vlookup($a20,if($c$6=1,汇总表!$b$7:$t$18,if($c$6=2,汇总表!$b$19:$t$30,汇总表!$b$31:$t$42)),8+2,0),0)+if(or($c$2=3,$c$2=4),vlookup ($a20,if($c$6=1,汇总表!$b$7:$t$18,if($c$6=2,汇总表!$b$19:$t$30,汇总表!$b$31:$t$42)),14+2,0),0)
  【销售毛利率—平均值】
  d20=sum(if(or($c$2=1,$c$2=4),vlookup($a20,if($c$6=1,汇总表!$b$7:$t$18,if($c$6=2,汇总表!$b$19:$t$30,汇总表!$b$31:$t$42)),2+3,0),0)+if(or ($c$2=2,$c$2=4),vlookup($a20,if($c$6=1,汇总表!$b$7:$t$18,if($c$6=2,汇总表!$b$19:$t$30,汇总表!$b$31:$t$42)),8+3,0),0)+if(or($c$2=3,$c$2=4),vlookup($a20,if($c$6=1,汇总表!$b$7:$t$18,if($c$6=2,汇总表!$b$19:$t$30,汇总表!$b$31:$t$42)),14+3,0),0))/3
  【销售收入】
  e20=if(or($c$2=1,$c$2=4),vlookup($a20,if($c$6=1,汇总表!$b$7:$t$18,if($c$6=2,汇总表!$b$19:$t$30,汇总表!$b$31:$t$42)),2+4,0),0)+if(or($c$2=2,$c$2=4),vlookup($a20,if($c$6=1,汇总表!$b$7:$t$18,if($c$6=2,汇总表!$b$19:$t$30,汇总表!$b$31:$t$42)),8+4,0),0)+if(or($c$2=3,$c$2=4),vlookup ($a20,if($c$6=1,汇总表!$b$7:$t$18,if($c$6=2,汇总表!$b$19:$t$30,汇总表!$b$31:$t$42)),14+4,0),0)
  若要与复选框内容形成联动,则修改公式如下。
  【销售成本】
  b20=if($c$11=true,if(or($c$2=1,$c$2=4),vlookup($a20,if($c$6=1,汇总表!$b$7:$t$18,if($c$6=2,汇总表!$b$19:$t$30,汇总表!$b$31:$t$42)),2,0),0)+if (or($c$2=2,$c$2=4),vlookup($a20,if($c$6=1,汇总表!$b$7:$t$18,if($c$6=2,汇总表!$b$19:$t$30,汇总表!$b$31:$t$42)),8,0),0)+if(or($c$2=3,$c$2=4),vlookup($a20,if($c$6=1,汇总表!$b$7:$t$18,if($c$6=2,汇总表!$b$19:$t$30,汇总表!$b$31:$t$42)),14,0),0),"")
  【销售毛利】
  c20=if($c$12=true,if(or($c$2=1,$c$2=4),vlookup($a20,if ($c$6=1,汇总表!$b$7:$t$18,if($c$6=2,汇总表!$b$19:$t$30,汇总表!$b$31:$t$42)),2+2,0),0)+if(or($c$2=2,$c$2=4),vlookup($a20,if ($c$6=1,汇总表!$b$7:$t$18,if($c$6=2,汇总表!$b$19:$t$30,汇总表!$b$31:$t$42)),8+2,0),0)+if(or($c$2=3,$c$2=4),vlookup($a20,if ($c$6=1,汇总表!$b$7:$t$18,if($c$6=2,汇总表!$b$19:$t$30,汇总表!$b$31:$t$42)),14+2,0),0),"")
  【销售毛利率-平均值】
  d20=if($c$13=true,sum(if(or($c$2=1,$c$2=4),vlookup($a20,if ($c$6=1,汇总表!$b$7:$t$18,if($c$6=2,汇总表!$b$19:$t$30,汇总表!$b$31:$t$42)),2+3,0),0)+if(or($c$2=2,$c$2=4),vlookup($a20,if($c$6=1,汇总表!$b$7:$t$18,if($c$6=2,汇总表!$b$19:$t$30,汇总表!$b$31:$t$42)),8+3,0),0)+if(or($c$2=3,$c$2=4),vlookup($a20,if($c$6=1,汇总表!$b$7:$t$18,if($c$6=2,汇总表!$b$19:$t$30,汇总表!$b$31:$t$42)),14+3,0),0))/if($c$2=4,3,1),"")
  【销售收入】
  e20=if($c$10=true,if(or($c$2=1,$c$2=4),vlookup($a20,if($c$6=1,汇总表!$b$7:$t$18,if($c$6=2,汇总表!$b$19:$t$30,汇总表!$b$31:$t$42)),2+4,0),0)+if (or($c$2=2,$c$2=4),vlookup($a20,if($c$6=1,汇总表!$b$7:$t$18,if($c$6=2,汇总表!$b$19:$t$30,汇总表!$b$31:$t$42)),8+4,0),0)+if(or($c$2=3,$c$2=4),vlookup($a20,if($c$6=1,汇总表!$b$7:$t$18,if($c$6=2,汇总表!$b$19:$t$30,汇总表!$b$31:$t$42)),14+4,0),0),"")
  至此,完成了根据控件变化而变化的动态数据源,下一步就开始正式的商务图表绘制工作了。
  3.绘制动态图表
  具体步骤如下。
  1 创建图表。选择绘图所用数据源a19:e31单元格区域,单击【插入】选项卡,之后依次单击【推荐的图表】→【所有图表】→【组合】,将【系列名称】中的销售毛利率-平均值的图表类型修改为【带数据标记的折线图】并勾选【次坐标轴】复选框,将【系列名称】中销售收入的图表类型修改为【簇状柱形图】(见图5-118)。
  图5-118
  2 组合图表及控件元素。将图表标题修改为“年度销售分析”,单击【设计】选项卡,之后单击【添加图表元素】→【图例】→【右侧】(见图5-119)。
  将“制作绘图用的控件组”中制作的复选框放置于图表区域合适的位置,并将其显示层次置于顶层。
  3 美化图表。选中已经插入的组合图,单击【图表工具】→【格式】选项卡,之后选择【形状填充】→【纹理】,选择【蓝色面巾纸】的样式(见图5-120)。
  图5-119
  图5-120
  单击【设计】选项卡中的【选择数据】,在打开的【选择数据源】对话框的【图例项(系列)】区域中,调整销售收入的显示顺序,使其在图表区域中呈现于第一列(见图5-121)。
  图5-121
  然后参考前面关于图表美化的相关方法,如填充颜色、边框、标记点的设置技巧等对整个动态图表进行细节的美化(见图5-90)。这里不用固化于本书呈现的视觉效果中,只要大家掌握了动态图表的制作技巧,就能够绘制出各式各样“高大上”的动态图表,甚至可以绘制第6章将要介绍的bi看板。
  当然,工作是具有延续性的,如果你们公司的领导确认了每年度的业务分析图表样式,则你所绘制的图表必须符合这种统一的标识规范。这种图表也许还有很多需要改进的地方,但建议先按照统一的规范要求完成工作。之后额外给领导提供一个b计划,也就是经过你个人设计的图表报告,这样会更好。总之,要在数据准备、工作按要求完成的基础上再做提升。