如何将图表做成动态可钻取数据的效果
简单的数据可以用一个图表表达出来,但复杂些的数据用一个图表来表达就显得捉襟见肘了。若将图表做成动态可钻取数据的效果,点击交互控件时,总图表发生相应变化,点击总图表中的系列时就会得到和这个系列相关的其他数据,再利用其他数据生成相应的子图表,问题就能得到解决。这样的效果利用控件、少量VBA代码外加一些公式即可实现(图1)。
1. 设置交互控件
在工作表的F1:F3分别输入月份、地区、产品,H1:H2分别输入地区、产品,I1:I2分别输入月份、产品,J1:J2分别输入月份、地区。
①构建下拉列表1
点击“开发工具→插入→表单控件→组合框”,在合适位置画出一个组合框控件,将组合框的数据源区域设置为F1:F3,单元格链接为G1。
②构建下拉列表2
点击“公式→名称管理器→新建”,名称为“z_cd”,引用位置处为“=CHOOSE(Sheet1!$G$1,Sheet1!$H$1:$H$2,Sheet1!$I$1:$I$2,Sheet1!$J$1:$J$2)”;再画出一个组合框控件,数据源区域为“z_cd”,单元格链接为G2。
在G4单元格输入“=INDIRECT(CHOOSE($G$1,"H","I","J") & $G$2)”(图2)。
2. 编写数据钻取VBA代码
点击“开发工具→Visual Basic”进入VBA编辑器,点击“插入→类模块”,选中插入的“类1”,选择“视图→属性窗口”,将类的名称改为“CEventChart”,双击这个类进入编辑窗口,输入如图3所示代码(图3)。
接下来,点击“插入→模块”,双击“模块1”,在代码编辑窗口输入如图4所示代码(图4)。
接下来,双击“ThisWorkBook”,在右侧编辑窗口输入如图5所示代码(图5)。
这样,当点击图表中的系列时,系列名称就会出现在G3单元中。
小提示:
上述代码也可以通过网盘下载(链接:https://pan.baidu.com/s/1vZhfg86pAHg5tc4UB9E4lw 密码:2zba),直接复制粘贴使用。
3. 构建图表数据源
图表的数据源是根据上述控件的当前索引值获得的。
①构建主图表数据源
分别新建名为lb_11、lb_22、lb_33的3个名称,lb_11的引用位置为“=INDEX(Sheet1!$A$1:$A$41,N(IF({1},SMALL(99*(MATCH(Sheet1!$A$2:$A$41,Sheet1!$A$1:$A$41,)<ROW(Sheet1!$2:$41))+ROW(Sheet1!$2:$41),ROW(INDIRECT("Sheet1!1:"&SUM(1/COUNTIF(Sheet1!$A$2:$A$41,Sheet1!$A$2:$A$41))))))))&""”;lb_22、lb_33的引用位置与lb_11的类似,只不过需要将公式中的A分别替换成B、C。
新建名“lb_tmp” 的名称,引用位置处输入“=CHOOSE(Sheet1!$G$1,lb_11,lb_22,lb_33)”;
新建名“sum_1” 的名称,引用位置处输入“=SUMIF(Sheet1!$A$2:$D$41,lb_11,Sheet1!$D$2:$D$41)”;
新建名“sum_2” 的名称,引用位置处输入“=SUMIF(Sheet1!$B$2:$D$41,lb_22,Sheet1!$D$2:$D$41)”;
新建名“sum_3” 的名称,引用位置处输入“=SUMIF(Sheet1!$C$2:$D$41,lb_33,Sheet1!$D$2:$D$41)”;
新建名“sum_tmp” 的名称,引用位置处输入“=CHOOSE(Sheet1!$G$1,sum_1,sum_2,sum_3)”;
其中,lb_11,lb_22,lb_22分别获取各列中的不重复值,从而形成数组;lb_tmp确定使用哪个数组作为主图表的类别图例;sum_1、sum_2、sum_3分别对各类别数组所对应的数量求和;sum_tmp确定使用哪个求和结果作为主图表的数据源。
②构建子图表数据源
新建名“lb_tmp_tmp”的名称,引用位置为“=IF(Sheet1!$G$4="月份",lb_11,IF(Sheet1!$G$4="地区",lb_22,lb_33))”;
新建名“sum_tmp_tmp” 的名称,引用位为“=SUMIFS(Sheet1!$D$2:$D$41,IF(Sheet1!$G$1=1,Sheet1!$A$2:$A$41,IF(Sheet1!$G$1=2,Sheet1!$B$2:$B$41,Sheet1!$C$2:$C$41)),Sheet1!$G$3,IF(Sheet1!$G$4="月份",Sheet1!$A$2:$A$41,IF(Sheet1!$G$4="地区",Sheet1!$B$2:$B$41,Sheet1!$C$2:$C$41)),lb_tmp_tmp)”;
其中,lb_tmp_tmp确定使用哪个数组作为子图表的类别图例;sum_tmp_tmp根据主图表中列表及子图表中列表的选择来对数量求和,从而作为子图表的数据源。
4. 插入并设置图表
插入两个饼状图。右击第1个饼图,选择“选择数据”,在弹出窗口的“图例项”处,点击“编辑”,在系列值处输入“=Sheet1!sum_tmp”;在“水平(分类)轴标签”处,点击“编辑”,在弹出窗口中输入“=Sheet1!lb_tmp”。右击第2个饼图,选择“选择数据”,在弹出窗口的“图例项”处,点击“编辑”,在系列值处输入“=Sheet1!sum_tmp_tmp”;在“水平(分类)轴标签”处,点击“编辑”,在弹出窗口中输入“=Sheet1!lb_tmp_tmp”。
最后,将每个下拉列表框都置于顶层,拖放到图表的各自位置,选中G5单元格,输入“=CONCATENATE(G3,"各",G4,"销售情况统计")”,选择图表标题,在公式编辑栏中输入“=Sheet1!$G$5”。这样,图表标题就会跟随控件的选择而进行变化了。不一样。