2.4 交互式图表
针对数据较多的情况,也可以根据数据源创建交互式图表,在图表内根据需要选择特定的数据进行展示。如图2-11所示,是根据图2-1中原始数据源所创建的交互式图表。在该图表内,能够根据需要单击不同区域下方的复选框,从而展示指定区域的数据。在图2-11中,展示了“地区2”和“地区5”的数据情况,能够很方便地比较两个不同区域之间的差异。
图2-11 交互式图表
当数据源发生改变时,一定会导致图表内容同步变化。因此,要实现图2-11所示的交互式图表,可以从数据源着手,让数据源根据复选框的情况来变化。在Excel内,当数据单元格的值为“#N/A”(空值,可以通过函数“=NA()”得到)时,该单元格的值不会出现在图表内。根据上述分析,可以在数据源和图表之间建立联系,当复选框被选中时,数据源显示本来的值,这样数据源就会出现在图表内;当复选框未被选中时,数据源显示“#N/A”,这样数据源就不会出现在图表内。
当不需要显示单元格的值时,将该单元格设置为“#N/A”,这时该单元格不会出现在图表内;当需要某单元格的值出现在图表内时,则需要显示单元格的原始数据内容。简单来说,单元格的内容需要不断地在“#N/A”和其实际值之间进行切换,以达到让交互式图表显示的目的。
根据以上分析,单元格的值要么是“#N/A”,要么是原始值(实际值)。所以,要创建一个和原始数据区域结构一致的“中间表格”,根据实际需要让“中间表格”的值在原始值和“#N/A”之间进行切换,从而达到让交互式表格显示的目的。要想让“中间表格”中单元格的值能够在不同的值之间进行切换,可以通过公式实现。通过引用公式,让其在满足不同的条件时,显示不同的值。
如果将数据源(原始数据区域)称为“原始表格”,将“中间表格”称为“逻辑表格”,则它们与图表之间的对应关系如图2-12所示。在原始表格内,存储的是全部的数据源,这部分数据是需要显示的数据,但是该部分数据与图表之间并没有直接的联系,它们之间通过逻辑表格建立联系。逻辑表格与原始表格具有相等的大小,表格中任意一个单元格都与原始表格中对应位置上的单元格存在着对应关系。逻辑表格内单元格的值可能为“#N/A”,也可能为原始表格对应位置上单元格的值。它根据图表内复选框的选中情况,来决定到底是显示原始表格内的值还是显示“#N/A”。
图2-12 关系图
在这个实现过程中,划分了不同的模块,让不同的模块完成不同的功能,各个模块分工合作,以让逻辑更清楚、操作更方便。原始表格只负责存储原始数据,至于图表到底显示哪些数据,不需要在原始表格内进行任何设置。也就是说,原始表格和最终的图表没有任何直接联系。逻辑表格负责决定哪些数据要最终显示在图表中,其既与原始表格相关,又与图表相关,相当于原始表格和图表之间沟通的桥梁。图表只负责最终的显示,其要显示的数据直接来源于逻辑表格。
1.逻辑表格的设计与实现
逻辑表格需要创建一个新的单元格区域,在该单元格区域内决定哪些原始数据直接显示出来,哪些以“#N/A”显示,如图2-13所示。数据显示以行为单位,为每一行建立一个标记,来决定当前行的显示状态。在B11:H17区域复制原始数据的表格结构,在其右侧I11:I17区域设置一个标识列,用来决定每个单元格所对应的左侧一整行数据的显示形式。标识列内的值可以为逻辑值“True”“False”,也可以直接用数字1和0表示。
图2-13 逻辑列
可以通过公式进行设置,当I列内单元格的逻辑值为“True”或者“1”时,使该行显示对应区域的实际产品销量;当I列内单元格的逻辑值为“False”或者“0”时,使该行显示“#N/A”,如图2-14所示。
图2-14 显示示例
从图2-14中可以看到,单元格I12、I13、I16的值为1,其对应的区域“地区1”“地区2”“地区5”的产品销量都正常显示。单元格I14、I15、I17的值为0,其对应的区域“地区3”“地区4”“地区6”的产品销量都显示为“#N/A”(NA()的值)。根据此时的逻辑表格创建折线图,如图2-15所示。
图2-15 折线图
从图2-15中可以看到,区域“地区1”“地区2”“地区5”的产品销量都出现在图表内,而区域“地区3”“地区4”“地区6”的产品销量都未出现在图表内。可以通过改变I列单元格的值来控制在折线图内显示不同区域的销量。
要实现图2-14所示的效果,可以通过逻辑列的值控制其左侧对应区域的数据显示,在单元格C12内输入公式,然后拖动其填充柄至整个C12:H17单元格区域。下面来看一下单元格C12的逻辑:
· 当单元格I12的值为逻辑真时,显示原始数据单元格(单元格C3)的值。
· 当单元格I12的值为逻辑假时,显示“#N/A”。
根据以上逻辑,C12单元格的公式为:
=IF(I12, C3, NA())
单元格区域C12:H17引用的值始终在I列,针对列要采用绝对引用;针对I列中行的引用随着行的改变而改变,所以在行方向上要采用相对引用。综上,针对单元格I12要采用混合引用形式“$I12”。最终在单元格C12内输入的公式为:
=IF($I12, C3, NA())
在单元格C12内输入上述公式后,拖动其右下角的填充柄,填充整个C12:H17单元格区域,即可完成逻辑表格的制作。
下面,在此表格的基础上制作交互式图表。
2.图表的设计与实现
要实现如图2-11所示的折线图内的复选框,需要在图表内添加复选框,然后对复选框进行设置。
插入复选框等控件需要使用“开发工具”选项卡实现。在默认情况下,在Excel的功能区中没有“开发工具”这个选项卡,所以首先要将该选项卡添加到Excel功能区内。在Excel主界面上依次单击“文件”→“选项”,会出现如图2-16所示的“Excel选项”对话框,选择“自定义功能区”选项,在右侧的“自定义功能区”中选择“主选项卡”,选中其中的“开发工具”,并单击“确定”按钮。此时在Excel功能区内会出现“开发工具”选项卡。
图2-16 “Excel选项”对话框
在“开发工具”选项卡的“控件”组内,单击“插入”,出现如图2-17所示的下拉列表,在下拉列表内选中“表单控件”中第1行第3个“复选框”控件。通过在工作表内拖动鼠标绘制的方式,将该控件插入到Excel工作表内。
图2-17 插入“复选框”
按照上述方式,插入6个复选框控件,并将这些按钮依次放置在图表的顶部。用鼠标右键单击“地区1”下方的复选框,弹出如图2-18所示的“设置控件格式”对话框。将鼠标定位到该对话框内“单元格链接”右侧的文本框,然后用鼠标选中单元格“I12”,在当前控件与单元格I12之间建立链接关系。通过链接的方式,在单元格I12与当前的复选框之间建立了联系,当复选框被选中时,单元格I12的值为逻辑值“真”(TRUE);当复选框未被选中时,单元格I12的值为逻辑值“假”(FALSE)。至此,通过复选框就能够控制地区1右侧数据的显示形式了。当勾选复选框时,I12的值为真,地区1的销量区域显示为销量的实际值,地区1的销量出现在折线图中;当未勾选复选框时,I12的值为假,地区1的销量区域显示为“#N/A”,地区1的销量不出现在折线图中。
图2-18 “设置控件格式”对话框
在“设置控件格式”对话框的“单元格链接”文本框中通过鼠标选取的方式选取单元格区域后,Excel会自动调整单元格区域的引用形式。例如,本例中选取单元格“I12”后,Excel自动将其调整为“$I$12”。
按照上述方式,将每个控件依次与单元格区域I12:I17建立联系,即可实现交互式图表。
这样的方式看起来可能略显复杂,但是分层处理的思想无论是在实际问题解决中,还是在程序设计中,都应用得非常广泛。例如,在程序设计中存在一种叫作MVC(Model View Controller,模型-视图-控制器)的编程模式。在这种模式中,将要处理的问题划分为模型、视图、控制器三层进行处理。模型层是负责处理应用程序数据逻辑的模块,该部分负责数据的存储等工作;视图层负责数据的可视化,它要显示的数据来源于模型层;控制层(控制器)负责模型层和视图层之间的连接,可以将控制层理解为连接模型层和视图层的桥梁。MVC的分层处理思想对管理复杂的应用程序非常有帮助,它能够让用户更专注于问题的一个方面。例如,在处理数据存储时,仅仅关心模型层就好了;在设计显示界面时,只关心界面的美观效果即可;控制器主要关注将模型层和视图层进行有效的连接。这样,即使显示界面发生变化,也不需要在模型层做出任何调整,较好地实现了逻辑、数据、界面的分离。MVC分层模型也为分组开发提供了便利,采用这种模式,不同的开发人员可同时开发视图、控制器逻辑和业务逻辑。在Excel中处理复杂问题时,可以借鉴这种处理方式。