存档

文章标签 ‘Chart’

Excel中ChartObject对象名称的疑问

2010年9月21日

最近在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对象的名称,并且图表的选择状态也发生了改变。如图:
ChartObject Name Excel2003

在立即窗口中做下面的操作(这里是中文版的内容,英文版的结果有些不同):
输入:?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中,查看图表的名称,可以激活图表,然后选择菜单”图表工具“-〉”布局“,单击工具栏”属性“,可以在下拉窗口中看到图表名称,如下图:
ChartObject Name 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 , ,

【转】制作图表的十四个基本技能

2009年7月20日

来源 – PHD

图表是数据的可视化,在工作中的应用十分重要,可以想象一个没有图表的PPT是什么样子。

PHD总结的制作图表的14个基本技能,很多不知道怎么翻译。

  1. 知道什么时候不需要图表
  2. 知道基本的图表类型 – bar charts, line charts, scatter charts, bubble charts, pie charts, dot plots and more
  3. 知道怎样裁剪、预处理、纠正你的数据,这样以便于做图
  4. 知道如 vlookup, match, index, indirect 的这些公式,这样你就能够得到你想要的数据
  5. 知道什么是无意义的图表,知道怎样去掉它
  6. 知道 应该避免的图表 的类型和使用它们的害处
  7. 知道使用多少颜色和什么颜色。理解对比和重复的概念
  8. 知道 简单化 比复杂化更有效
  9. 知道 图表就是故事给予相应的优先度
  10. 知道 怎样使用图表模板
  11. 知道图表的概念,如 dynamic charts, sparklines, tag clouds, combining 2 chart types
  12. 知道工具的局限性,在特定场合下使用正确的工具(Excel用于简易图表, manyeyes 用于复杂图示, R 用于有趣和精心制作的东东, Google spreadsheets 用于地图?和 组织结构图 等.)
  13. 知道我们周围有更加漂亮的例子,从它们中学习 [what your zoo can teach you about visualization]
  14. 遇到困难时知道到哪里去寻找帮助 – PeltierTech, PHD Charting Pages, Google.

阅读全文…

Spreadsheet ,

提取丢失数据源的图表中的数据

2009年5月25日

如果图表从另外一个文件的数据创建或链接到另外一个文件,当该文件因损坏不可用或被删除后,可以使用微软帮助中的这个方法来提取图表数据。

先在含有图表的文件中打开VBE窗口,添加新模块,将下面的过程放入模块中。
在工作表中选择图表,运行宏过程GetChartValues,将在工作表“ChartData”(如果不存在则创建该工作表)中放置图表的源数据。

Sub GetChartValues()
    Dim NumberOfRows As Integer
    Dim X As Object
    Dim Counter As Integer
    Dim strSheet As String
 
    Counter = 2
 
    ' 计算数据源总行数
    NumberOfRows = UBound(ActiveChart.SeriesCollection(1).Values)
    strSheet = ActiveSheet.Name     ' 保存当前工作表名称
    
    ' 新建工作表并更名为"ChartData"
    Sheets.Add
    On Error Resume Next
    ActiveSheet.Name = "ChartData"
    ' 如果工作表"ChartData"已经存在,则删除新建的工作表
    If Err.Description <> "" Then
        Application.DisplayAlerts = False
        ActiveSheet.Delete
        Application.DisplayAlerts = True
    End If
    Worksheets("ChartData").Select
    Cells.Clear
    Worksheets("ChartData").Cells(1, 1) = "X Values"
    Worksheets(strSheet).Select
 
    ' 将X轴数据写入到工作表
    With Worksheets("ChartData")
        .Range(.Cells(2, 1), _
        .Cells(NumberOfRows + 1, 1)) = _
        Application.Transpose(ActiveChart.SeriesCollection(1).XValues)
    End With
 
    ' 遍历图表中的所有系列并将它们的数据写入到工作表
    For Each X In ActiveChart.SeriesCollection
        Worksheets("ChartData").Cells(1, Counter) = X.Name
        With Worksheets("ChartData")
            .Range(.Cells(2, Counter), _
            .Cells(NumberOfRows + 1, Counter)) = _
            Application.Transpose(X.Values)
        End With
        Counter = Counter + 1
    Next
End Sub

示例文件下载:Box.net | SkyDrive

VBA , ,

让嵌入图表响应事件

2009年3月22日

Excel中的图表可以嵌入到工作表中,也可以单独作为图表工作表存在。作为单独图表工作表存在的图表可以响应事件,如下图:

而嵌入到工作表中的图表包含在ChartObject中,不能响应事件。如果需要让嵌入图表响应事件,需要使用类模块来创建Chart对象。

下面介绍让嵌入图表响应事件的方法。
假设工作表Sheet1中已经存在一个散点图,图表中包括两个系列,如下图:

阅读全文…

VBA , ,