一、引言
财务分析是指以财务会计报表的有关数据资料为依据,对一定时期企业的财务状况和经营成果进行分析,以评价、判断企业在经营过程中的利弊得失、财务状况及预测发展趋势,为改进企业未来财务管理工作提出整改举措的书面报告。其作用在于为企业管理者提供财务分析信息,促进企业内部管理;为企业外部投资者提供决策依据;为社会提供企业财务信息,促进证券市场的正常运行。这种管理活动量化分析的书面报告有文字、表格和图表等多种表现形式,其中图表是提供信息的一条有效途径。通过图表可以迅速、准确的获得大量的信息。与普通的数据表格相比,采用图表形式将使得枯燥乏味的数据资料变得有趣、形象、直观且易于理解,尤其适宜于各级管理者使用,并促使管理者发现数据间细微的差别,从而挖掘管理新思路。
在microsoft office 2000软件包的组件之一excel 2000中,提供了功能强大的图表绘制工具,使得创建各式各样的图表变得快捷和容易。但是,这一工具对于普通的用户来说存在两点不便之处:①用户必须学会使用excel 2000中的图表绘制工具;②图表绘制工具是以插入的形式生成各种图表,若要对同一数据源的数据表格从不同的角度分析,还要以不同的图表类型(如柱型图、折线图等)表现时,必然导致生成众多的图表,不便于浏览,不便于在同一图表上观察和分析财务数据。动态图表可以克服上述两处缺点。所谓动态图表是指在同一图表中生成从某一数据源不同角度分析获得的不同类型的图表,而无需用户掌握图表绘制工具的使用。显然,这会给财务分析带来极大的便利。本文旨在对动态图表模型的设计思想和应用实例作深入的探讨,供同行参考。
二、动态图表模型的设计思想
众所周知,构成excel 2000中图表的两个主要元素是“绘图区域”(即来自工作表的“数据源”,下同)和“图表类型”。如果这两个主要元素能够在绘制一张单一的图表时动态地生成,那么,动态图表模型的设计问题就迎刃而解了。
因此,动态图表模型设计思想的核心是:充分利用excel 2000中的“宏技术”和vba(vsiual basic for application)编程技术,使得对单一图表的“绘图区域”和“图表类型”可根据用户的选择动态地生成。
为此,应先在工作表中插入一张任意类型的基本图表,然后设计一个“确定图表选项”按钮,在此按钮弹出的“绘图选项”窗口中,可根据用户的选择动态地生成基本图表的“绘图区域”(即“数据源”)和“图表类型”。如图1和图2所示。图1表格中的阴影部分即“绘图区域”,是用户在图2中选择的绘图区域(“三季度”)。其中“销售地区”是用户“选择数据列”时的必然选项,若用户“选择数据行”,则“销售季度”是其必然选项,二者均在程序中予以确定。图1中的图表部分即动态图表。由于在图2中选择的“图表类型”是“圆饼图”,放在“选择数据行”或“选择数据列”中的“销售地区”或“销售季度”均以单选钮的形式出现,因为“圆饼图”只能描绘一个数据系列。若用户选择的“图表类型”是“折线图”或“柱型图”,则前述二者均以复选框的形式出现,同时,图表也将以用户复选确定的绘图区域被绘制。这些均在程序中加以控制。
三、动态图表模型的设计实例
为实现上述设计思想、建立动态图表模型,应完成以下设计步骤。
1.进入excel 2000后,命名一个工作表为“动态图表”,并在该工作表中建立一个模拟的“销售情况表”,如图1中的表格部分。为增加程序的可读性和绘图区域的动态扩展,模型中将命名一些区域。如表所示。
2、在表格下面插入一张图表,如插入反映全部销售情况的“柱型图”,适当调整其大小并设置其格式为所需要的格式。以后生成的动态图表均以此格式为标准格式。
3、在图表右侧填加一以自选图形表示的“确定图表选项”的命令按钮,并为其指定宏代码如下:
sub 确定绘图选项0
绘图选项窗口.show
end sub
4、在visual basic编辑器中,插入一用户窗体并命名为“绘图选项窗口”。
5、在“绘图选项窗口”中,从“视图”→“工具箱”填加所需控件,这些控件包括分组框、列表框、选项按钮、命令按钮等,并以汉字将它们分别标识(caption)和命名(name),以便识别和增强程序的可读性。如图2所承。
6、设置列表框“行选择”的rowsource属性为a3:a7,参照图1
。
7、设置列表框“列选择”的rowsource 属性为a9:a13(其中存放的是利用数组公式{trams-pose(b2:f2)}返回的转秩矩阵,即“一季度”,……,“地区合计”)。
8、按 alt+f11键,在visual basic编辑器中,双击“窗体”的“绘图选项窗口”,为相应的控件建立以下8段程序代码。
private sub userform_initialize()’用户窗口初始化
行选择.enabled=false
列选择.enabled=true
end sub
private sub取消click()’“取消”按钮的click事件代码
绘图选项窗口.hide’隐藏绘图选项窗口
end sub
private sub确定_click()’“确定”按钮的click事件代码
activesheet.chartobjects(“图表56”).activate’图表56”是系统自动为插入的图表所作的命名,该图表即为动态图表区域。
activechart.chartarea.seect dim选择季度(4),选择地区(4)’定义两个存放区域名称的数组
if选择数据列.value=true then条件语句用于判断用户点击的是“选择数据行”还是“选择数据列”,以便产生不同的绘图区域。
选择季度(0)=“一季度”:选择季度(1)=“二季度”
选择季度(2)=“三季度”:选择季度(3)=”四季度”
选择季度(4)=”地区合计”
绘图区域=“销售地区”
for i=0 to 4 ’循环语句用于动态产生“绘图区域”
if列选择.selected(i)=true then ’所应包含的区域名称字符串。
绘图区域=绘图区域+“,”+选择季度(i)’
debug.print绘图区域
end if
next i
绘图选项窗口.hide
activechart.setsourcedata source:=sheets(“动态图表”).range(绘图区域),_
plotby:=xlcolumns’图表数据产生于列。
elseif选择数据行.value=true then
选择地区(0)=“东北”:选择地区(1)=“西北”
选择地区(2)=“华东”:选择地区(3)=“西南”
选择地区(4)=“季度合计”
绘图区域=“销售季度”
for i=0 to 4’循环语句用于动态产生“绘图区域”
if行选择.selected(i)=true then’所应包含的区域名称字符串。
绘图区域=绘图区域+“,”+选择地区(i)
‘debug.print绘图区域
end if
next i
绘图选项窗口.hide
active chart.setsourcedata source:=sheets(“动态图表”).range(绘图区域),-
plotby:=xlrows’图表数据产生于行
end if
activechart.locaation where:=xllocationasobject,name:=“动态图表”
with activechart
if圆饼图.value=true then
.hastitle=true
else
.hastitle=false
end if
.axes(xlcategory,xlprimary).hastitle=false
.axes(xlvalue,xlprimary).hastitle=false
end with
range(绘图区域).select
end sub
private sub折线图_click 0
行选择.multiselect=fmmultiselectmulti
列选择.multiselect=fmmultiselectmulti
activesheet.chartobjects(“图表56”).activate
activechart.chartarea.select
activechart.charttype=xllinemarkers
activechart.applydatalabels type:=xldatala-belsshownone
end sub
private sub柱型图_click()
行选择.multiselect=fmmultiselectmulti
列选择.multiselect=fmmultiselectmulti
activesheet.chartobjects(“图表56”).activate
activechart.chartarea.select
activechart.charttye=xlcolumnclustered
activechart.applydatalabels type:=xldatala-belsshownone
end sub
private sub圆饼图_click ()
行选择.multiselect=fmmultiselectsingle
列选择.multiselect=fmmultiselectsingle
activesheet.chartobjects(“图表56”).activate
activechaft.chartarea.select
activechart.charttype=xl3dpie
activechart.applydatalabels type:=xldatala-belsshowpercent
end sub
private sub选择数据列_click()
if圆饼图.value=true then
列选择.multiselect=fmmultiselectsingle
’设置列选择的multiselect属性为单选。
else
列选择.multiselect=fmmultiselectmulti
’设置列选择的multiselect属性为复选。
end if
行选择.enabled=false
列选择.enabled=true
end sub
private sub选择数据行_click()
if圆饼图.value=true then
行选择.multiselect=fmmultiselectsingle
’设置行选择的multiselect属性为单选。
else
行选择.multiselect=fmmultiselectmulti’设置行选择的multiselect属性为复选。
end if
行选择.enabled=true
列选择.enabled=false
end sub
注释:上述代码段中,程序行末尾单引号后的内容为程序注释行。
四、结束语
上述模型的建立假定读者已掌握excel 2000的基本操作和宏代码、事件代码的建立方法。实际上,若读者对vba的编程不熟悉,则完全可以通过宏的定义和阅读来学习和掌握vba的程序结构和命令语句。甚至可以根据需要,通过复制定代码来建立和编辑上述代码段,从而减少代码的输入错误。在模型建立完成后,删除不需要的宏即可。需要说明的是,该模型的建立虽然以一个示例为背景,但动态图表模型的设计思想具有普遍意义。读者可以按照本文的设计思想,根据财务分析中对动态图表的具体需求,扩展模型的设计结构,使其更具有一般性和通用性,更符合实际财务分析的需要。