当前位置: 软件志 >资讯 > 图表中的交互 数据钻取还能这么用

图表中的交互 数据钻取还能这么用

更新时间:2019-06-19 11:04:37    浏览次数:193+次
简单的数据可以用一个图表表达出来,但复杂些的数据用一个图表来表达就显得捉襟见肘了。若将图表做成动态可钻取数据的效果,点击交互控件时,总图表发生相应变化,点击总图表中的系列时就会得到和这个系列相关的其他数据,再利用其他数据生成相应的子图表,问题就能得到解决。这样的效果利用控件、少量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)。

图表中的交互 数据钻取还能这么用图片1

2. 编写数据钻取VBA代码

点击“开发工具→Visual Basic”进入VBA编辑器,点击“插入→类模块”,选中插入的“类1”,选择“视图→属性窗口”,将类的名称改为“CEventChart”,双击这个类进入编辑窗口,输入如图3所示代码(图3)。

图表中的交互 数据钻取还能这么用图片2

接下来,点击“插入→模块”,双击“模块1”,在代码编辑窗口输入如图4所示代码(图4)。

图表中的交互 数据钻取还能这么用图片3

接下来,双击“ThisWorkBook”,在右侧编辑窗口输入如图5所示代码(图5)。

图表中的交互 数据钻取还能这么用图片4

这样,当点击图表中的系列时,系列名称就会出现在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”。这样,图表标题就会跟随控件的选择而进行变化了。不一样。