嵌入式图表和图表工做表
图表在工做表中有两种存在方式:php
- 嵌入式图表与工做表的数据在一块儿,或者与其余的嵌入式图表在一块儿。
- 图表工做表是特定的工做表,只包含单独的图表。
(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方法:app
Charts.Add |
该方法返回对新图表的引用。下面的代码在活动工做簿中添加新的图表工做表,而且包含对新图表的引用:wordpress
Dim ch As Chart Set ch = ActiveWorkbook.Charts.Add |
执行上述代码后,使用变量ch操控图表。
Chart对象
如下图所示的工做表为例,简要介绍Chart对象及其应用。
要指定图表数据,须要调用Chart对象的SetSourceData方法。语法为:工具
SetSourceData(Source,PlotBy) |
其中,参数Source是包含数据的工做表区域,能够经过行列标识符或者名称来指定该参数值。参数PlotBy是一个常量,指定数据系列是行区域(xlRows)仍是列区域(xlColumns)。
如上图所示的工做表,设置图表源数据的代码以下:post
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 |
生成的图表以下图所示。
控制图表外观
除了图表的类型外,还有许多选项用来控制图表看起来的样子,其中一些选项仅仅为表现外观,而另外一些选项则表现图表传递给查看者的信息。
一、显示图表标题
在图表上方能够显示图表标题。下面列出的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 | 标题的文本。默认为空 |
二、图表坐标轴文本
大多数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自动为图表命名,默认的名字是Chart一、Chart2,等等。一样,嵌入式图表也被赋予了名字,默认为图表 一、图表 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 |
结果以下图所示。
一、散点图的类型
Excel支持几种类型的散点图,以下表所示。
CHARTTYPE常量 | 说明 | |
---|---|---|
xlXYScatter | 数据点做为标记,没有线条 | |
xlXYScatterLines | 数据点做为标记,经过直线链接 | |
xlXYScatterLinesNoMarkers | 没有标记,只是直线 | |
xlXYScatterSmooth | 数据点做为标记,经过平滑线条链接 | |
xlXYScatterSmoothNoMarkers | 没有标记,经过平滑线条链接数据点 |
二、改变坐标轴区域
观察上面绘制的散点图,可能会注意到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)整理,仅供学习参考。