嵌入式圖表和圖表工做表
圖表在工做表中有兩種存在方式: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)整理,僅供學習參考。