最近在Excel2010中试用一个以前写的Excel2003的做图工具时碰到一个ChartObject对象的命名错误,这个错误产生的名称在Excel2003中可以正常使用,但到Excel2010中则产生错误。这样发现Excel2003中的ChartObject对象命名的一个奇怪现象。
在Excel工作簿中,图表可以放在两个地方,一个是做为嵌入图表放在工作表里,另外一个是放在图表工作表里。这里讨论前一种情况。
每个图表由一个Chart对象代表,而包含这个Chart对象的就是ChartObject对象。ChartObject对象的属性和方法控制嵌入图表的外观和尺寸,而Chart对象的属性和方法控制图表的内容。
针对嵌入图表,我们可以使用Activate方法激活ChartObject对象,则它所包含的Chart对象也就处于活动状态。这时可以使用ActiveChart来引用这个Chart象。
每个ChartObject对象有一个Name属性,同时每个包含的Chart对象也有一个Name属性。ChartObject对象的名称可以改变,而Chart对象的名称不能修改。如果你改变工作表的名称,Chart对象的名称也会自动改变。
在Excel2003中,你可以通过下面的方法查看ChartObject对象的名称,按下“Ctrl”键,单击图表,在名称栏会显示所选图表的ChartObject对象的名称,并且图表的选择状态也发生了改变。如图:

在立即窗口中做下面的操作(这里是中文版的内容,英文版的结果有些不同):
输入:?ActiveSheet.ChartObjects(1).Name
返回:Chart 1
输入:?ActiveSheet.ChartObjects(2).Name
返回:Chart 2
输入:?ActiveSheet.ChartObjects(1).Chart.Name
返回:Sheet1 图表 1
如果修改工作表的名称为Sheet2,Chart对象的名称会改成:
输入:?ActiveSheet.ChartObjects(1).Chart.Name
返回:Sheet2 图表 1
将ChartObject对象的名称改成中文,仍然返回”Chart 1″:
输入:?ActiveSheet.ChartObjects(“图表 1″).Name
返回:Chart 1
在ChartObject对象的名称前加一个空格或多个空格,仍然返回”Chart 1″:
输入:?ActiveSheet.ChartObjects(” Chart 1″).Name
返回:Chart 1
输入:?ActiveSheet.ChartObjects(” Chart 1″).Name
返回:Chart 1
在ChartObject对象的名称前加一个”1″,仍然返回”Chart 1″:
输入:?ActiveSheet.ChartObjects(“1Chart 1″).Name
返回:Chart 1
如果前面加了一个”1″,后面跟任何一个字符都可以返回”Chart 1″:
输入:?ActiveSheet.ChartObjects(“1D”).Name
返回:Chart 1
在ChartObject对象的名称前加”1″和多个空格,仍然返回”Chart 1″:
输入:?ActiveSheet.ChartObjects(“1 Chart 1″).Name
返回:Chart 1
输入:?ActiveSheet.ChartObjects(” 1 Chart 1″).Name
返回:Chart 1
但是在”Chart 1″前加上”2″,却返回”Chart 2″:
输入:?ActiveSheet.ChartObjects(“2Chart 1″).Name
返回:Chart 2
在”Chart 2″前加上”2″,也返回”Chart 2″:
输入:?ActiveSheet.ChartObjects(“2Chart 2″).Name
返回:Chart 2
假如工作表中只有两个图表,输入”3Chart 2″则出现错误。
接着来:
如果在立即窗口中输入下面的语句将第1个ChartObject对象的名称改成”Chart 2″。
ActiveSheet.ChartObjects(“Chart 1″).Name=”Chart 2″
在立即窗口你会发现还是可以使用”Chart 1″来指定第1个ChartObject对象,返回的名称却是”Chart 2″:
输入:?ActiveSheet.ChartObjects(“Chart 1″).Name
返回:Chart 2
如果在立即窗口中输入下面的语句将第2个ChartObject对象的名称改成”Chart 3″。
ActiveSheet.ChartObjects(2).Name=”Chart 3″
输入:?ActiveSheet.ChartObjects(“Chart 1″).Name
返回:Chart 2
输入:?ActiveSheet.ChartObjects(“Chart 2″).Name
返回:Chart 2
输入:?ActiveSheet.ChartObjects(“Chart 3″).Name
返回:Chart 3
但是
输入:?ActiveSheet.ChartObjects(“2Chart 2″).Name
返回:Chart 3
上面的这些名称变化使用的是”Chart *”,并不影响使用ChartObjects(“图表 1″)的表示方式,而使用”图表 *”来表示的话同样有上面这些变化。
这些ChartObject的名称变化并不影响其中的Chart对象的名称。总的来说,感觉ChartObject对象在处理名称时忽略了前后的空格。忽略空格后第一个字符是数字的话,则以这个数字作为序号来处理。剩下的名称定义一时没搞明白是怎么处理的。
前面说这么多,其实最终的结论是使用名称来定义ChartObject对象并不是很准确,建议使用序列号并结合Chart对象的名称来准确地定义ChartObject对象。
还好在Excel2007和Excel2010中,这种情况得到了改善。
Excel2007和Excel2010中,查看图表的名称,可以激活图表,然后选择菜单”图表工具“-〉”布局“,单击工具栏”属性“,可以在下拉窗口中看到图表名称,如下图:

在中文版的Excel2010中,可以使用ActiveSheet.ChartObjects(“图表 1″).Name或者ActiveSheet.ChartObjects(“Chart 1″).Name来表示ChartObject对象的名称,但不能在名称前和Excel2003一样添加空格和数字。
但是在Excel2007和Excel2010中仍然将两个图表的ChartObject对象定义成相同的名称。例如在输入下面的语句改变第一个图表的ChartObject对象的名称为”Chart 2″。
ActiveSheet.ChartObjects(“Chart 1″).Name=”Chart 2″
然后在立即窗口
输入:?ActiveSheet.ChartObjects(1).Name
返回:Chart 2
输入:?ActiveSheet.ChartObjects(2).Name
返回:Chart 2
注意:和Excel2003不同的是,Chart对象的名称也一起改变。
输入:?ActiveSheet.ChartObjects(1).Chart.Name
返回:Sheet1 Chart 2
输入:?ActiveSheet.ChartObjects(2).Chart.Name
返回:Sheet1 Chart 2
VBA
Chart, Excel, VBA
最近评论