嵌入式图表和图表工作表
图表在工作表中有两种存在方式:
- 嵌入式图表与工作表的数据在一起,或者与其他的嵌入式图表在一起。
- 图表工作表是特定的工作表,只包含单独的图表。
(1)嵌入式图表
当希望图表作为工作表的一部分,与数据或其他图表在一起时,嵌入式图表是最好的选择。Chart对象代表每一个嵌入式图表,包含在ChartObject对象里。
每个Excel工作表都有一个ChartObjects集合,包含工作表中每个嵌入式图表。为了在工作表中添加新的嵌入式图表,在集合中添加ChartObject对象,其语法为:
WorksheetObject.ChartObjects.Add(Left,Top,Width,Height) |
其中,参数Left和参数Top指定图表左上角的位置,参数Width和参数Height指定图表尺寸。所有4个参数都以磅为单位。该方法返回对新创建的ChartObject对象的引用,使用Chart属性引用所包含的图表。例如:
Dim co As ChartObject Dim ch As Chart Set co = Worksheets("Sheet1").ChartObjects.Add(50, 50, 250, 165) Set ch = co.Chart |
执行上述代码后,在工作表Sheet1中放置一个新的空嵌入式图表,使用变量ch来引用该图表。
(2)图表工作表
当希望图表显示最大尺寸,而且不会妨碍数据或其他图表时,使用图表工作表。Chart对象代表图表工作表。与嵌入式图表不同,不需要ChartObject对象,因为图表工作表的位置是固定的,其尺寸取决于工作表的尺寸。每个工作簿都有一个Charts集合,包含该工作簿中的所有图表工作表。
注意,工作簿的Charts集合不会引用嵌入式图表,仅仅是图表工作表。相反,工作表的ChartObjects集合仅仅引用嵌入式图表。要添加新的图表工作表,使用Add方法:
Charts.Add |
该方法返回对新图表的引用。下面的代码在活动工作簿中添加新的图表工作表,并且包含对新图表的引用:
Dim ch As Chart Set ch = ActiveWorkbook.Charts.Add |
执行上述代码后,使用变量ch操控图表。
Chart对象
以下图所示的工作表为例,简要介绍Chart对象及其应用。
要指定图表数据,需要调用Chart对象的SetSourceData方法。语法为:
SetSourceData(Source,PlotBy) |
其中,参数Source是包含数据的工作表区域,可以通过行列标识符或者名称来指定该参数值。参数PlotBy是一个常量,指定数据系列是行区域(xlRows)还是列区域(xlColumns)。
如上图所示的工作表,设置图表源数据的代码如下:
ch.SetSourceData Source:=Worksheets("Sheet1").Range("B3:F6"),PlotBy:=xlRows |
假设ch引用Chart对象。下面的过程基于上图工作表数据创建一个嵌入式图表:
Sub CreateEmbeddedChart() Dim co As ChartObject Dim ch As Chart Set co = Worksheets("Sheet1").ChartObjects.Add(50, 100, 250, 165) Set ch = co.Chart ch.SetSourceData Source:=Worksheets("Sheet1").Range("B3:F6"), PlotBy:=xlRows End Sub |
说明:
- 图表中自动添加了数据系列和类别标签。
- 在水平轴中绘制类别;垂直轴中绘制数值。
- 自动创建图表图例,以识别数据系列。
- 图表的垂直轴根据数据值自动缩放。
- 在没有指定图表类型时,默认使用簇状柱形图。
生成的图表如下图所示。
下面,来指定图表的类型。
Chart对象的ChartType属性控制图表的类型,并且Excel提供了一组预定义常量指定该属性。每个常量不仅指定基本类型(例如条形图、柱状图或折线图),而且也指定每种类型的子类型,包括图表是否作为二维或三维显示。
下表列出了一些经常使用的类型。
常量 | 说明 |
---|---|
xlBar | 条形图 |
xlLine | 折线图 |
xlArea | 面积图 |
xlPie | 饼图 |
xlColumn | 柱状图 |
xlPyramid | 棱锥图 |
下面的示例代码演示了如何设置图表类型,使用了上图工作表的数据,指定带标记的折线图。
Sub CreateChartSheet() Dim ch As Chart Set ch = ActiveWorkbook.Charts.Add ch.SetSourceData Source:=Worksheets("Sheet1").Range("B3:F6"), PlotBy:=xlRows ch.ChartType = xlLineMarkers End Sub |
生成的图表如下图所示。
控制图表外观
除了图表的类型外,还有许多选项用来控制图表看起来的样子,其中一些选项仅仅为表现外观,而另一些选项则表现图表传递给查看者的信息。
1、显示图表标题
在图表上方可以显示图表标题。下面列出的Chart对象的两个属性控制图表标题:
- HasTitle属性。True/False值,指定是否显示标题。
- ChartTitle,控制标题的详细信息。
要显示图表标题,必须设置ChartTitle对象的属性并且设置HasTitle为True。下面的代码在图表中显示标题“家电销售量”:
ch.HasTitle = True ch.ChartTitle.Text = "家电销售量" |
其中,变量ch引用已经存在的图表。注意,在设置ChartTitle对象的任何属性之前,必须将HasTitle属性设置为True,否则,会发生错误。
本例中,简单地设置图表标题文本后,将采用默认的字体、位置等设置,可以使用下表列出的ChartTitle对象属性来修改图表标题的外观。
属性 | 说明 |
---|---|
AutoScaleFont | True/False,指定标题的字体尺寸是否随图表尺寸而自动改变。默认值为True。 |
HorizontalAlignment | 指定标题的左-右对齐。设置为xlLeft、xlCenter(默认值)或xlRight |
Left | 从标题的左边缘到图表区的左边缘的距离,以磅为单位 |
Top | 从标题的顶边缘到图表区的顶边缘的距离,以磅为单位 |
Text | 标题的文本。默认为空 |
2、图表坐标轴文本
大多数Excel图表都有两个坐标题,饼图除外。水平坐标轴是类别轴,垂直坐标轴是数值轴。默认情况下,坐标轴没有标题,但可以添加标题。
以Chart对象的Axes集合的方式引用图表的坐标轴。通过使用常量xlCategory和xlValue指定坐标轴。例如,代码:
图表对象.Axes(xlCategory) |
引用图表的类别坐标轴。而代码:
图表对象.Axes(xlValue) |
引用数值坐标轴。
要对坐标轴添加标题,设置HasTitle属性为True,然后使用AxisTitle.Text属性来设置标题。例如,假设变量ch引用已存在的图表:
ch.Axes(xlValue).HasTitle=True ch.Axes(xlValue).AxisTitle.Text="销售量" |
要移除坐标轴标题,只须设置HasTitle属性为False。要修改已有的坐标轴标题,改变AxisTitle.Text属性的值。
注意,通过设置HasTitle为False移除坐标轴标题,将彻底删除标题,而不是简单地隐藏标题。在试图处理AxisTitle对象之前,确保设置HasTitle为True,否则会发生错误。
下面列出的程序改进了上文中的程序,不仅创建了图表,而且也添加了图表标题和坐标轴标题:
Sub CreateEmbeddedChartWithTitles() Dim co As ChartObject Dim ch As Chart Set co = Worksheets("Sheet1").ChartObjects.Add(50, 100, 250, 165) Set ch = co.Chart ch.SetSourceData Source:=Worksheets("Sheet1").Range("B3:F6"), PlotBy:=xlRows ‘添加图表标题 ch.HasTitle = True ch.ChartTitle.Text = "家电销售量" ‘添加类别轴标题 ch.Axes(xlCategory).HasTitle = True ch.Axes(xlCategory).AxisTitle.Text = "期间" ‘添加数值轴标题 ch.Axes(xlValue).HasTitle = True ch.Axes(xlValue).AxisTitle.Text = "销售量" End Sub |
结果如下图所示。
处理图表中的字体
可以编写VBA代码来修改图表中任何文本的字体。与特定项(图表标题、坐标轴标题等)相关的Font对象控制文本外观。图表中的文本项和相关的Font对象如下表所示。
文本项 | FONT对象 |
---|---|
图表标题 | Chart.ChartTitle.Font |
类别坐标轴标题 | Chart.Axes(xlCategory).AxisTitle.Font |
数值坐标轴标题 | Chart.Axes(xlValue).AxisTitle.Font |
图例文本 | Chart.Legend.Font |
类别坐标轴刻度标签 | Chart.Axes(xlCategory).TickLabels.Font |
数值坐标轴刻度标签 | Chart.Axes(xlValue).TickLabels.Font |
上表列出的所有对象都有AutoScaleFont属性,默认值为True,表明当图表尺寸改变时字体尺寸自动改变。因此,设置字体尺寸仅仅设置了当时相对于图表尺寸的初始字体尺寸,如果图表本身调整的话,实际字体尺寸也变化。
下面的代码修改图表标题为14磅Arial类型的粗体。
With 图表对象.ChartTitle.Font .Name="Arial" .Bold=True .Size=14 End With |
下面的代码将图表图例文本修改为10磅、红色的Times New Roman字体。
With 图表对象.Legend.Font .Name="Times New Roman" .Color=RGB(255,0,0) .Size=10 End With |
下表列出了Font对象通常使用的属性。
属性 | 说明 |
---|---|
Bold | True/False,指定字体是否为粗体。 |
Color | 字体的颜色,一个RGB值。 |
Italic | True/False,指定字体是否为斜体。 |
Name | 字体的名字。 |
下面的代码对上文中的示例作了进一步的改进,修改了字体以获得更好的外观。
Sub CreateEmbeddedChart() Dim co As ChartObject Dim ch As Chart Set co = Worksheets("Sheet1").ChartObjects.Add(50, 100, 250, 165) Set ch = co.Chart ch.SetSourceData Source:=Worksheets("Sheet1").Range("B3:F6"), PlotBy:=xlRows ‘添加图表标题 ch.HasTitle = True ch.ChartTitle.Text = "家电销售量" ‘修改字体 With ch.ChartTitle.Font .Name = "Arial" .Size = 14 .Color = RGB(0, 0, 255) End With ‘添加类别坐标轴标题并设置其字体. ‘同时修改刻度标签. With ch.Axes(xlCategory) .HasTitle = True .AxisTitle.Text = "期间" .AxisTitle.Font.Name = "Arial" .AxisTitle.Font.Size = 10 .TickLabels.Font.Name = "Arial" .TickLabels.Font.Size = 8 End With ‘添加数值坐标轴标题并设置其字体. ‘同时修改刻度标签的字体. With ch.Axes(xlValue) .HasTitle = True .AxisTitle.Text = "销售量" .AxisTitle.Font.Name = "Arial" .AxisTitle.Font.Size = 10 .TickLabels.Font.Name = "Arial" .TickLabels.Font.Size = 8 End With ‘修改图例字体 With ch.Legend.Font .Name = "Arial" .Size = 10 .Color = RGB(255, 0, 0) End With End Sub |
结果如下图所示。
ChartWizard方法
如果你在Excel中创建过图表,那么可能使用过图表向导。在经过一系列的对话框选择后,创建图表。这对应于VBA中的ChartWizard方法。ChartWizard方法指定图表数据、图表类型、以及图表的外观。有时,使用该方法比每次分别设置Chart对象的单个属性更容易。ChartWizard方法的语法如下:
图表对象.ChartWizard(Source,Gallery,Format,PlotBy, _ CategoryLabels,SeriesLabels,HasLegend,Title,CategoryTitle,ValueTitle,ExtraTitle) |
其中,参数Source指定绘制图表的数据区域,Range对象。
参数Gallery是一个xlChartType常量,指定图表的类型:xlArea、xlBar、xlColumn、xlLine、xlPie、xlRadar、xlXYScatter、xlCombination、xl3DArea、xl3DBar、xl3DColumn、xl3DLine、xl3DPie、xl3DSurface、xlDoughnut、xlDefaultAutoFormat。
参数Format是一个1-n范围的数字值,指定内置的自动格式或者图表子类型。自动格式的类型和数值,n的最大值取决于参数Gallery。
参数PlotBy,取值为xlRows(默认值)或者xlColumns,指定数据系列是行还是列。
参数CategoryLabels,包含分类标签的列数(如果PlotBy=xlRows)或者行数(如果PlotBy=xlColumns)。
参数SeriesLabels,包含数据系列标签的行数(如果PlotBy=xlRows)或者列数(如果PlotBy=xlColumns)。
参数HasLegend,包括图例时值为True,否则为False。默认值为True。
参数Title,图表的标题文本。默认没有标题。
参数CategoryTitle,分类坐标轴标题文本。默认没有标题。
参数ValueTitle,数值坐标轴标题文本。默认没有标题。
命名和引用图表
- 在创建图表工作表时,Excel自动为图表命名,默认的名字是Chart1、Chart2,等等。同样,嵌入式图表也被赋予了名字,默认为图表 1、图表 2,等等,注意数字之前有一个空格。
- 通过给Name属性赋新的名字,能够重命名ChartObject对象。
- 使用Workbook对象的Charts属性引用一个已存在的图表工作表。Charts属性返回一个集合,包含工作簿中每个图表工作表,可以通过在集合中的位置来引用图表工作表,但通过图表工作表的名字来引用可能更好一些:
Charts(图表工作表名称)
例如,下面的代码打印指定的图表工作表:
Charts("销售图表").PrintOut
- 要引用指定的嵌入式图表,必须使用ChartObject对象。例如,下面的代码删除工作表Sheet1中指定的图表:
Worksheets("Sheet1").ChartObjects("汇总图").Delete
锁定图表
默认情况下,用户可以修改Excel中的图表,然而有时我们可能不想让用户对图表作修改。这时,可以锁定或保护图表,使得不能修改图表,但仍然能够查看和打印图表。
要锁定和保护图表,调用Chart对象的Protect方法:
图表对象.Protect(password) |
其中,参数password可选,用于指定保护密码。
下面的代码取消对图表的保护:
图表对象.UnProtect(password) |
ChartObject对象
ChartObject对象代表嵌入式图表,除图表本身的特性外,还控制着图表的位置和大小。下表列出了ChartObject对象的属性和方法。
属性 | 说明 |
---|---|
BottomRightCell | 返回Range对象,引用图表右下角的工作表单元格。只读 |
Chart | 返回对包含的图表的引用 |
Height | 图表的高度,以磅为单位 |
Left | 图表左侧相对于工作表左边缘的位置,以磅为单位 |
Placement | 指定ChartObject如何粘附于其下方的工作表单元格。允许设置值为xlMoveAndSize、xlMove、xlFreeFloating |
PrintObject | 如果为True(默认),那么在打印工作表时打印图表。如果为False,则不打印图表 |
Top | 图表顶部相对于工作表顶部的位置,以磅为单位 |
TopLeftCell | 返回Range对象,引用图表左上角的工作表单元格。只读 |
Visible | True/False,指定图表是否可见 |
Width | 图表的宽度,以磅为单位 |
方法 | 说明 |
---|---|
BringToFront | 在所有重叠的图表上方显示图表 |
Copy | 将ChartObject复制到Windows剪贴板 |
CopyPicture | 复制图表的图像到Windows剪贴板 |
Cut | 将ChartObject剪切到Windows剪贴板 |
Delete | 删除ChartObject |
SendToBack | 在所有重叠的图表后面显示图表 |
当添加或删除嵌入式图表下方区域的单元格时,Placement属性起作用。例如,假设图表跨列B至列F,在该区域插入两个新列,此时的结果取决于Placement属性的设置:
- xlMoveAndSize。图表的大小和位置改变以适应添加或删除的行/列。
- xlMove。图表的位置改变以适应添加或删除的行/列,但大小保持不变。
- xlFreeFloating。大小和位置都不会发生改变。
下面的示例程序演示了ChartObject的一些属性和方法。程序遍历当前工作簿中的所有工作表,将所有嵌入式图表复制到新工作表中,并且程序指定了新工作表的名字以及所复制的图表的大小。
- 使用Worksheets.Add方法在工作簿中添加新工作表。
- 设置新工作表的Name属性。
- 遍历工作簿的Worksheets集合。
- 检查每个工作表的Name属性,以避免处理新工作表。
- 遍历每个工作表的ChartObjects集合。
- 使用Copy方法复制每个ChartObject到剪贴板。
- 使用Worksheet.Paste方法将ChartObject粘贴到新工作表中。
示例程序清单如下:
Sub CopyEmbeddedChartsToNewSheet(name As String, width As Integer, height As Integer) ‘复制当前工作簿中所有嵌入式图表到指定名称的新工作表 ‘复制的图表指定了宽度和高度并且在单列中排列 ‘图表之间的垂直距离 Const SPACE_BETWEEN_CHARTS = 20 Dim newWS As Worksheet Dim oldWS As Worksheet Dim co As ChartObject Dim yPos As Integer Dim count As Integer ‘关闭屏幕更新,避免在复制图表时屏幕闪烁 Application.ScreenUpdating = False ‘添加和命名新工作表 Set newWS = Worksheets.Add newWS.name = name For Each oldWS In Worksheets ‘不要从新工作表中复制 If oldWS.name <> name Then ‘遍历该工作表中的ChartObjects For Each co In oldWS.ChartObjects ‘复制到剪贴板 co.Copy newWS.Range("A1").Select ‘粘贴到新工作表 newWS.Paste Next End If Next ‘图表的位置和大小 count = 0 For Each co In newWS.ChartObjects co.width = width co.height = height ‘距工作表左边缘的距离 co.Left = 30 ‘距工作表顶部的距离 co.Top = count * (height + SPACE_BETWEEN_CHARTS) + SPACE_BETWEEN_CHARTS count = count + 1 Next ‘打开屏幕更新 Application.ScreenUpdating = True End Sub Sub TestCopyEmbeddedCharts() CopyEmbeddedChartsToNewSheet "所有图表", 240, 140 End Sub |
在程序代码中,每次粘贴操作之前为什么要选择新工作表中的单元格A1,这是因为当粘贴图表到工作表中时,会选择所粘贴的图表。此时,当试图粘贴下一图表时,Excel会认为要将其粘贴到所选择的图表中,这会导致错误。
由于CopyEmbeddedChartsToNewSheet过程包含参数,因此不能直接调用该过程,必须从另一过程调用。
程序运行后的结果如下图所示。
使用散点图
散点图,又称作XY图,不同于Excel中的其他类型的图表。大多数图表根据分类绘制数值,而散点图绘制值对,水平轴和垂直轴都是值。很多情形都适合于用散点图来表现。
散点图中的每一点都有X值和Y值,X值决定点的水平位置,Y值决定点的垂直位置。
散点图的数据组织与其他图表类型的数据类似,不同点在于分类标签被X值取代。下图所示的工作表中为准备绘制散点图的数据,第1列包含的是X值,另外2列包含的是Y值。
创建散点图的VBA代码不同于创建其他类型的图表,必须指定源数据区域和图表类型,也可以应用可选的格式诸如图表和坐标轴标签。下面是基于上图所示的数据创建的嵌入式散点图的VBA代码:
Sub CreateScatterChart() Dim co As ChartObject Dim ch As Chart Set co = Worksheets("Sheet2").ChartObjects.Add(50, 200, 250, 165) Set ch = co.Chart ch.SetSourceData Source:=Worksheets("Sheet2").Range("B3:D9"), PlotBy:=xlColumns ch.ChartType = xlXYScatterLines ‘添加图表标题 ch.HasTitle = True ch.ChartTitle.Text = Worksheets("Sheet2").Range("A1").Value ‘添加分类轴标题 With ch.Axes(xlCategory) .HasTitle = True .AxisTitle.Text = "相对人数" End With ‘添加数值轴标题 With ch.Axes(xlValue) .HasTitle = True .AxisTitle.Text = "获胜概率" End With End Sub |
结果如下图所示。
1、散点图的类型
Excel支持几种类型的散点图,如下表所示。
CHARTTYPE常量 | 说明 | |
---|---|---|
xlXYScatter | 数据点作为标记,没有线条 | |
xlXYScatterLines | 数据点作为标记,通过直线连接 | |
xlXYScatterLinesNoMarkers | 没有标记,只是直线 | |
xlXYScatterSmooth | 数据点作为标记,通过平滑线条连接 | |
xlXYScatterSmoothNoMarkers | 没有标记,通过平滑线条连接数据点 |
2、改变坐标轴区域
观察上面绘制的散点图,可能会注意到X轴的刻度不合适,其范围从0到10而绘制的数据范围从1到6,结果是图表区的1/3是空的并且被浪费了,这是Excel的默认情形。下面,我们来改变这种情形。
Axis对象的MaximumScale属性和MinimumScale属性控制着坐标轴的最大值和最小值。例如,要设置图表中数值轴(垂直轴)的比例值,可以编写下面的代码:
With 图表对象.Axes("xlValue") .MinimumScale=5 .MaximumScale=20 End With |
对于上面的程序来说,只需修改水平坐标轴的最小值为1,代码为:
ch.Axes(xlCategory).MinimumScale = 1 |
将这行代码插入到设置ChartType属性的代码之后。现在,运行程序后的结果如下图。
注意,即便散点图中的水平轴不是真正的分类坐标轴,仍然使用xlCategory常量来引用。并且,人工设置坐标轴刻度时,如果最小值太大或者最大值太小,将不会绘制一些数据。
打印图表
可以使用PrintOut方法来打印Excel图表。
打印的内容 | 调用 |
---|---|
单个的嵌入式图表或图表工作表 | 与相应的Chart对象一致的PrintOut方法 |
工作表中所有的嵌入式图表(与其他工作表内容一起) | Worksheet对象中的PrintOut方法 |
活动工作表中所有嵌入式图表(与其他工作表内容一起) | ActiveSheet对象的PrintOut方法 |
工作簿中所有图表工作表 | 工作簿的Charts集合的PrintOut方法 |
可能已经注意到,没有直接的方法用来打印工作表中所有嵌入式图表而不打印其他工作表内容,然而可以使用简短的VBA代码来实现,如下所示。
Sub PrintAllEmbeddedChartsOnSheet(ws As Worksheet) ‘打印指定工作表中所有嵌入式图表 Dim co As ChartObject For Each co In ws.ChartObjects co.Chart.PrintOut Next End Sub Sub testPrintAllCharts() PrintAllEmbeddedChartsOnSheet ActiveSheet End Sub |
上述过程接受一个工作表变量作为其参数,然后遍历该工作表的ChartObjects集合,调用每个包含的图表中的PrintOut方法。如果该工作表没有包含嵌入式图表,则不会发生什么。
注意,在打印工作表时,ChartObject的PrintObject属性决定是否指定的嵌入式图表与其他工作表内容一起打印。
注:以上内容改编自《Excel Programming Weekend Crash Course》第17章和第18章,由完美Excel(excelperfect.com)整理,仅供学习参考。
相关文章
- 2009年10月30日 Excel图表编程应用大全(1):初识图表编程 (2)
录制创建图表的过程代码 让我们手工创建不同的图表并录制宏,看看图表对象的一些属性和方法。 步骤1 准备数据,如下图所示。 步骤2 单击“开发工具—录制宏”。 步骤3 将宏命名为BuildSalesChart,如下图所示。 步骤4 单击“确定”,开始录制宏。 步骤5 选择单元格A1:E7,如下图所示。 步骤6 […] - 2014年04月6日 在Excel图表中高亮显示特殊数据标签(1) (1)
引子:这是http://peltiertech.com/WordPress/中介绍的一个技巧,使用了公式或者VBA实现Excel图表中高亮显示特殊的数据标签。 经常有人问:是否可以修改Excel图表中数据标签的字体颜色,高亮显示数据最大值。下面介绍了两种方法,使用VBA实现或使用工作表公式实现。 使用VBA来实现高亮显示图表中特殊的数据标签 下图所示为数据及经过 […] - 2014年03月14日 Excel VBA解读(9):看看Excel的那些常用对象(续3) (0)
《完美Excel》微信公众账号:excelperfect 记得上学的时候,老师经常会在作业本上的空白处写一些评语,或者是对某段话的评价,或者是表扬做得认识,等等。Excel工作表中的批注类似于这些评语,让我们能够为单元格添加评语,为单元格传递更丰富的信息。 Comment对象 Comment对象代表单元格批注。如下图1所示,单击“审阅”选项卡中的“新建批注”命令 […] - 2014年04月18日 制作条形——折线混合图 (0)
完美Excel公众微信号:excelperfect 引子:近期正跟着peltiertech.com学习图表,太强大了,如果再这样下去的话,不知道我是否会又迷上图表。 下面是peltiertech.com上的一篇图表制作技巧,在Excel中制作条形图和折线图的混合图表,与大家分享。 数据如下图所示。列E为计算列D和列C的百分比,即Won/Open。列F是制作XY散 […] - 2011年04月15日 Excel图表编程应用大全(3):示例-使用饼图汇总 (0)
引言:本文来源于《Pro Excel 2007 […]
转载 http://www.excelperfect.com/index.php/2009/12/01/excelchartapplywithvba2/