vba控制圖表,excel圖表,一鍵完成


來源http://club.excelhome.net/thread-1417686-1-1.html

官方教程鏈接

https://docs.microsoft.com/zh-cn/office/vba/api/excel.worksheet.chartobjects

運行宏就顯示圖表

Sub test()
Dim ch As ChartObject, ws As Worksheet
    Dim lastrow&
    Application.ScreenUpdating = False
    Set ws = Worksheets("Sheet1")
    If ws.ChartObjects.Count > 0 Then ws.ChartObjects.Delete
    lastrow = ws.Range("a" & Rows.Count).End(xlUp).Row
    Set ch = ws.ChartObjects.Add(ws.[f5].Left, ws.[f5].Top, 360, 215) '
    ch.Name = ws.[b1]
    With ch.Chart
        .ChartType = xlLineMarkers
        .SeriesCollection.NewSeries
        .SeriesCollection(1).Values = ws.Range("b3:b" & lastrow)
        .SeriesCollection(1).XValues = ws.Range("a3:a" & lastrow)
        .SeriesCollection(1).Name = ws.[b2]
        .SeriesCollection.NewSeries
        .SeriesCollection(2).Values = ws.Range("c3:c" & lastrow)
        .SeriesCollection(2).XValues = ws.Range("a3:a" & lastrow)
        .SeriesCollection(2).Name = ws.[c2]
    End With
   With ch.Chart.Axes(xlValue, xlPrimary)
        .CrossesAt = .MinimumScale
        .TickLabels.Font.Size = 8
        .MajorGridlines.Border.ColorIndex = 5
    End With
    With ch.Chart.Axes(xlCategory)
        .TickLabels.Font.Size = 8
    End With
    With ch.Chart
        .HasTitle = True
        .ChartTitle.Text = ch.Name
        .ChartTitle.Font.Size = 18
        .ChartTitle.Left = 137
        .ChartTitle.Top = 2
        .HasLegend = False
        .PlotArea.Width = 347
        .PlotArea.Left = 0
        .PlotArea.Top = 20
        .PlotArea.Height = 181
        .Export ThisWorkbook.Path & "\test.gif"
   End With
   ch.Delete
   Set ch = Nothing
End Sub

 

 

Excel圖表能直觀地呈現數字的規律,是分析數據的利器。本教程是使用VBA程序來繪制Excel嵌入式圖表。如果你還不知道什么是圖表,沒關系,下圖就是所謂的圖表(嵌入式):

它的數據來源是如下的表格:

要想使用VBA繪制圖表,那首先得了解它的結構。圖表對象由圖表區、圖表標題、繪圖區、垂直(值)軸、水平(分類)軸、圖例、網格線、系列等區域,每個區域都可以單獨設置外觀、顏色、填充、字體等等屬性,只有熟悉這些區域才能用VBA設計出符合自己需求的圖表。下圖是對圖表對象各區域的分解圖,其中次坐標軸只在性質不同的系列之間比較時才可能用到:

繪圖區在上圖中未指出,請看下圖:

我們直接以實例來講解。以上邊提供的中信銀行部分數據為例進行演示。

一、創建圖表容器
Dim ch As ChartObject, ws As Worksheet
Dim lastrow&
Application.ScreenUpdating = False
Set ws = Worksheets("Risk")
If ws.ChartObjects.Count > 0 Then ws.ChartObjects.Delete
lastrow = ws.Range("a" & Rows.Count).End(xlUp).Row
Set ch = ws.ChartObjects.Add(ws.[f5].Left, ws.[f5].Top, 360, 215) '
ch.Name = ws.[b1]
我們先定義一個ChartObject對象ch,,接着刪除Risk工作表中所有的圖表(嵌入式圖表,下同,以后不再指明),並計算A列最后一個非空行,最后用Add方法新增一個圖表。
Add方法的語法為:工作表對象表達式.ChartObjects.Add(Left, Top, Width, Height),圖表繪制在指定的工作表中,數據和圖表可以不在同一個工作表。Left和Top表示圖表的左上角坐標位置,以磅為單位,該坐標是相對於工作表上單元格 A1的左上角頂點的位置,我們也可以指定指定在某個單元格位置,比如示例的F5單元格。Width和Heigh是圖表的寬度和高度,單位也是磅。1磅約=0.03527厘米,1厘米=28.35磅。
新增了圖表,我們需要給它起一個名字,名字的值為B1單元格中的“中信銀行”。名字不是必須的,你不指定,程序會默認給一個圖表1這樣的名字。我建議指定名字,這樣方便引用,如ws.ChartObjects(“中信銀行”)就能引用到這個圖表,並可以做進一步操作。
創建了圖表,其實是一個空的方框,什么也沒有,空空如也,如下圖:

其實ChartObject對象只是 Chart對象的容器,ChartObject對象的屬性和方法只能控制圖表的外觀(邊框、填充、背景等等)和大小,真正的圖表是Chart對象。我們在繪制窗體時,文本框、標簽、命令按鈕、Listview等控件才是我們需要的,窗體只是一個容器,它的存在只是為了容納控件,ChartObject對象其實類似窗體的作用。
二、繪制系列線
1.基本系列線
我們以日期為橫坐標,市盈率和市凈率為兩個系列,繪制圖表。
With ch.Chart
.ChartType = xlLineMarkers
.SeriesCollection.NewSeries
.SeriesCollection(1).Values = ws.Range("b3:b" & lastrow)
.SeriesCollection(1).XValues = ws.Range("a3:a" & lastrow)
.SeriesCollection(1).Name = "市盈率"
.SeriesCollection(1).AxisGroup = 1
.SeriesCollection.NewSeries
.SeriesCollection(2).Values = ws.Range("c3:c" & lastrow)
.SeriesCollection(2).XValues = ws.Range("a3:a" & lastrow)
.SeriesCollection(2).Name = "市凈率"
.SeriesCollection(2).AxisGroup = 2
End With
剛才說過,ChartObject只是一個容器,真正的圖表是Chart對象。ChartType = xlLineMarkers指定圖表類型為數據點折線圖。其值可以為下表中的任何類型,我們可以根據需要選擇合適的圖表類型:
名稱 數值 圖表類型描述
xl3DArea -4098 三維面積圖。
xl3DAreaStacked 78 三維堆積面積圖。
xl3DAreaStacked100 79 百分比堆積面積圖。
xl3DBarClustered 60 三維簇狀條形圖。
xl3DBarStacked 61 三維堆積條形圖。
xl3DBarStacked100 62 三維百分比堆積條形圖。
xl3DColumn -4100 三維柱形圖。
xl3DColumnClustered 54 三維簇狀柱形圖。
xl3DColumnStacked 55 三維堆積柱形圖。
xl3DColumnStacked100 56 三維百分比堆積柱形圖。
xl3DLine -4101 三維折線圖。
xl3DPie -4102 三維餅圖。
xl3DPieExploded 70 分離型三維餅圖。
xlArea 1 面積圖
xlAreaStacked 76 堆積面積圖。
xlAreaStacked100 77 百分比堆積面積圖。
xlBarClustered 57 簇狀條形圖。
xlBarOfPie 71 復合條餅圖。
xlBarStacked 58 堆積條形圖。
xlBarStacked100 59 百分比堆積條形圖。
xlBubble 15 氣泡圖。
xlBubble3DEffect 87 三維氣泡圖。
xlColumnClustered 51 簇狀柱形圖。
xlColumnStacked 52 堆積柱形圖。
xlColumnStacked100 53 百分比堆積柱形圖。
xlConeBarClustered 102 簇狀條形圓錐圖。
xlConeBarStacked 103 堆積條形圓錐圖。
xlConeBarStacked100 104 百分比堆積條形圓錐圖。
xlConeCol 105 三維柱形圓錐圖。
xlConeColClustered 99 簇狀柱形圓錐圖。
xlConeColStacked 100 堆積柱形圓錐圖。
xlConeColStacked100 101 百分比堆積柱形圓錐圖。
xlCylinderBarClustered 95 簇狀條形圓柱圖。
xlCylinderBarStacked 96 堆積條形圓柱圖。
xlCylinderBarStacked100 97 百分比堆積條形圓柱圖。
xlCylinderCol 98 三維柱形圓柱圖。
xlCylinderColClustered 92 簇狀柱形圓錐圖。
xlCylinderColStacked 93 堆積柱形圓錐圖。
xlCylinderColStacked100 94 百分比堆積柱形圓柱圖。
xlDoughnut -4120 圓環圖。
xlDoughnutExploded 80 分離型圓環圖。
xlLine 4 折線圖。
xlLineMarkers 65 數據點折線圖。
xlLineMarkersStacked 66 堆積數據點折線圖。
xlLineMarkersStacked100 67 百分比堆積數據點折線圖。
xlLineStacked 63 堆積折線圖。
xlLineStacked100 64 百分比堆積折線圖。
xlPie 5 餅圖。
xlPieExploded 69 分離型餅圖。
xlPieOfPie 68 復合餅圖。
xlPyramidBarClustered 109 簇狀條形棱錐圖。
xlPyramidBarStacked 110 堆積條形棱錐圖。
xlPyramidBarStacked100 111 百分比堆積條形棱錐圖。
xlPyramidCol 112 三維柱形棱錐圖。
xlPyramidColClustered 106 簇狀柱形棱錐圖。
xlPyramidColStacked 107 堆積柱形棱錐圖。
xlPyramidColStacked100 108 百分比堆積柱形棱錐圖。
xlRadar -4151 雷達圖。
xlRadarFilled 82 填充雷達圖。
xlRadarMarkers 81 數據點雷達圖。
xlStockHLC 88 盤高-盤低-收盤圖。
xlStockOHLC 89 開盤-盤高-盤低-收盤圖。
xlStockVHLC 90 成交量-盤高-盤低-收盤圖。
xlStockVOHLC 91 成交量-開盤-盤高-盤低-收盤圖。
xlSurface 83 三維曲面圖。
xlSurfaceTopView 85 曲面圖(俯視圖)。
xlSurfaceTopViewWireframe 86 曲面圖(俯視線框圖)。
xlSurfaceWireframe 84 三維曲面圖(線框)。
xlXYScatter -4169 散點圖。
xlXYScatterLines 74 折線散點圖。
xlXYScatterLinesNoMarkers 75 無數據點折線散點圖。
xlXYScatterSmooth 72 平滑線散點圖。
xlXYScatterSmoothNoMarkers 73 無數據點平滑線散點圖。
接着用SeriesCollection.NewSeries方法繪制系列,X軸是日期范圍(Range(“A3:A23”),Y軸是市盈率(Range(“B3:B23”)。如果不指定X軸,系統默認按自然數系列(1,2,3……)產生X軸。
SeriesCollection(1).Name = "市盈率",該系列的名稱為“市盈率”,用Name屬性指定。系列的引用序號按添加系列的順序確定,第一個系列是SeriesCollection(1),第二個系列是SeriesCollection(2)。
SeriesCollection(1).AxisGroup = 1指定指定系列的組類型。通俗地講,就是這個系列的Y軸是哪一個,只可以選擇主坐標軸組(其值為1)和次坐標軸組(其值為2)。我們這里指定市盈率系列是主坐標軸組。
接着產生第二個系列,名稱為“市凈率”,屬於次坐標軸組。為什么要指定2個坐標軸呢?因為市盈率和市凈率是不一樣的內容,如果不指定次坐標軸,那么市盈率和市凈率共用主坐標軸,組合起來是不是莫名其妙?其效果圖如下:

從上圖中可見,市凈率也使用市盈率的Y軸數值。因為市盈率和市凈率數值相差甚大,導致市凈率的系列線幾乎看不到任何起伏,這顯然不是我們想要的效果。我們給市凈率單獨的一個Y軸,就能解決這個問題。SeriesCollection(2).AxisGroup = 2是讓市凈率系列用它自己的Y軸(次坐標軸),加了這句話之后,圖表變成下圖,顯然效果杠杠的:

2.系列線進階
除了使用默認設置,系列線還可以設置豐富的屬性。系列線的分解圖如下:

With ch.Chart
With .SeriesCollection.NewSeries
.Values = ws.Range("b3:b" & lastrow)
.XValues = ws.Range("a3:a" & lastrow)
.ChartType = xlArea
.Interior.Color = RGB(127, 255, 212)
End With
With .SeriesCollection.NewSeries
.Values = ws.Range("b3:b" & lastrow)
.XValues = ws.Range("a3:a" & lastrow)
.ChartType = xlLineMarkers
.MarkerSize = 5 '數據標記大小
.MarkerStyle = xlMarkerStyleCircle '數據標記類型
.MarkerBackgroundColor = RGB(255, 106, 106)
.MarkerForegroundColor = RGB(90, 178, 238)
.HasDataLabels = True '有數據標簽
.DataLabels.NumberFormat = "0.00"
.HasLeaderLines = True
.LeaderLines.Border.ColorIndex = 5
.Trendlines.Add Type:=xlPolynomial '趨勢線
.Trendlines(1).Border.LineStyle = xlDash
.Trendlines(1).Border.Color = vbRed
End With
.HasLegend = False
End With
我們不指定Chart的圖表類型,而直接指定系列的類型,且一個圖表中不同趨勢線可以使用不同的類型。第一條系列的類型是面積圖(xlArea),而第二天系列是折線圖(xlLineMarkers)。
在折線圖中,我們還指定了數據標記的形狀和大小,其形狀可為如下的選項:
xlMarkerStyleAutomatic 自動設置標記
xlMarkerStyleCircle 圓形標記
xlMarkerStyleDash 長條形標記
xlMarkerStyleDiamond 菱形標記
xlMarkerStyleDot 短條形標記
xlMarkerStyleNone 無標記
xlMarkerStylePicture 圖片標記
xlMarkerStylePlus 帶加號的方形標記
xlMarkerStyleSquare 方形標記
xlMarkerStyleStar 帶星號的方形標記
xlMarkerStyleTriangle 三角形標記
xlMarkerStyleX 帶 X 記號的方形標記
HasDataLabels = True 指定有數據標簽,就是系列線上得到那些數字。HasLeaderLines = True設置引導線。這些設置基本沒有多少用途,反而讓圖表顯得更復雜。Pass吧!
.Trendlines.Add Type:=xlPolynomial,添加一條趨勢線,代表數據的運動規律。類型有如下選項,這個需要非常豐富的經驗,不然無法選擇准確的類型。
名稱 值 描述
xlExponential 5 使用公式(如 y=ab^x)計算數據點的最小平方擬合值。
xlLinear -4132 使用線性公式 y = mx + b 計算數據點的最小平方擬合值。
xlLogarithmic -4133 使用公式 y = c ln x + b 計算數據點的最小平方擬合值。
xlMovingAvg 6 使用通過數據系列中某些部分計算出的一系列平均值。數據點個數等於數據系列中數據點的總數減去為周期指定的數值。
xlPolynomial 3 使用公式(如 y = ax^6 + bx^5 + cx^4 + dx^3 + ex^2 + fx + g)計算數據點的最小平方擬合值。
xlPower 4 使用公式(如 y = ax^b)計算數據點的最小平方擬合值。
最后繪制出來的圖表如下:

三、坐標軸的設定
With ch.Chart.Axes(xlValue, xlPrimary)
.CrossesAt = .MinimumScale
.TickLabels.Font.Size = 8
.MajorGridlines.Border.ColorIndex = 20
.HasTitle = True
.AxisTitle.Text = "市盈率"
.AxisTitle.Orientation = xlVertical
End With
With ch.Chart.Axes(xlValue, xlSecondary)
.CrossesAt = .MinimumScale
.TickLabels.Font.Size = 8
.HasTitle = True
.AxisTitle.Text = "市凈率"
.AxisTitle.Orientation = xlVertical
End With
With ch.Chart.Axes(xlCategory)
.TickLabels.Font.Size = 8
.TickLabels.NumberFormatLocal = "yyyy/m/d"
.HasTitle = True
.AxisTitle.Text = "日期"
.AxisTitle.Characters.Font.Size = 8
.AxisTitle.Characters.Font.Color = vbRed
End With
用Chart.Axes方法返回一個代表圖表上坐標軸的對象。語法為:Chart.Axes(Type, AxisGroup),Type指定要返回的坐標軸的類型,為以下常量之一:xlValue、xlCategory 或 xlSeriesAxis(xlSeriesAxis 僅對三維圖表有效)。Excel圖表把X軸叫做水平(分類)軸,Y軸叫垂直(值)軸。
名稱 值 描述
xlCategory 1 坐標軸顯示類別。
xlSeriesAxis 3 坐標軸顯示數據系列。
xlValue 2 坐標軸顯示值。
AxisGroup指定坐標軸組類型。如果省略該參數,則使用主坐標軸組(三維圖表僅有一個坐標軸組)。其可取值已經在第二節講過了,這里重復一遍:
名稱 值 描述
xlPrimary 1 主坐標軸組。
xlSecondary 2 次坐標軸組。
Chart.Axes(xlValue, xlPrimary)返回主坐標軸對象,主坐標軸就是圖表左邊的Y軸。Chart.Axes(xlValue, xlSecondary)返回次坐標軸對象,次坐標軸就是圖表右邊的Y軸。Chart.Axes(xlCategory)返回的是X軸對象。坐標軸對象的方法只有Delete和SELECT兩個,代表刪除和選擇,這個容易理解,其屬性有幾十種,像坐標軸的大小、位置、是否有箭頭等等, Excel自動設置的已經足夠好,我們基本上都不需要自行設置。
1. 設置坐標軸的標題區
HasTitle = True表示有標題。必須設置為True才能設置坐標軸標題的其他屬性。
AxisTitle.Text和AxisTitle.Caption效果一樣,設置坐標標題的顯示文本。
AxisTitle.Left設置從坐標軸標題框左邊緣到圖表區左邊緣的距離,AxisTitle.Top設置從坐標軸標題框上邊緣到圖表區頂部的距離,都以磅為單位。
AxisTitle.Orientation設置文本方向。此屬性的值可設為–90 到90度之間的整數旋轉值或以下常量之一:
名稱 值 說明
xlDownward -4170 文字向下排列。
xlHorizontal -4128 文字水平排列。
xlUpward -4171 文字向上排列。
xlVertical -4166 向下居中排列。
上表的說明是我搜索微軟官網的,貌似不太符合,我只好逐一試驗,對應下邊四種格式,第三種格式是Y軸的默認文字方向:

AxisTitle.Characters.Font.Size = 8設置坐標軸標題文字的大小為8.
AxisTitle.Characters.Font.Color = vbRed設置坐標軸標題文字的顏色為紅色。
坐標軸標題默認是沒有的,可以不設置,大家看自己的需求自行設置即可。效果圖如下:

2.坐標軸的刻度線標簽文本
什么是刻度線標簽?X軸的2017/12/1、2017/12/29,Y軸的6.9、7.1這些就是刻度線標簽,我們可以設置其屬性,比如TickLabels.Font.Size = 8設置字體大小(字體、顏色也如此設置,這里不全部舉例了,都是很簡單的設置),可以設置其數字格式,如X軸是日期,我們可以這樣設置TickLabels.NumberFormatLocal = "yyyy/m/d",如果是數字,我們可以設置小數點位數,跟平時我們按Ctrl+1設置單元格格式沒有任何區別。
TickLabels.Orientation設置刻度線標簽的文字方向,此屬性值可設為 -90 到 90 度之間的整數旋轉值或以下常量之一:
名稱 值 描述
xlTickLabelOrientationAutomatic -4105 由 Excel 設置文本方向。
xlTickLabelOrientationDownward -4170 向下排列文本。
xlTickLabelOrientationHorizontal -4128 水平排列字符。
xlTickLabelOrientationUpward -4171 向上排列文本。
3. 設置坐標軸的取值范圍和刻度單位
坐標軸的最大值、最小值、主要刻度單位、次要刻度單位默認都是自動設置,Excel根據數據源區域的值自動合理設置。我們在需要的時候可以自行設置。刻度線標簽的顯示文本是由坐標軸的最大值、最小值、主要刻度單位、次要刻度單位確定的。
.MinimumScale 屬性返回或設置數值軸上的最小值,.MaximumScale 屬性返回或設置數值軸上的最大值。上圖Y軸最小值自動設置為6.9,你可以設置為.MinimumScale =6.8,最大值也是一樣的設置。
上圖中可以看出,主要刻度單位為0.1,因為刻度線標簽從6.9、7.0、7.1順序排列下去,我們可以設置為主要刻度單位.MajorUnit = 0.05,這樣Y軸就是6.95、7.00、7.05……,次要刻度單位.MinorUnit =0.01;X軸的主要刻度為2天,因為12/1、12/3這種序列,我們可以.MajorUnit =1,這樣就可以把每天的日期都列出(如果有必要的話)。

4.設置X軸與Y軸的交點
CrossesAt 屬性設置數值軸中與分類坐標軸的交點。CrossesAt = .MinimumScale是設置Y軸的最小值與X軸相交。因為市盈率最小值是6.9,所以前面的圖表中Y軸的6.9與X軸相交。如果我們想要X軸與Y軸的交點位於Y軸上數值7.3 的位置,怎么設置呢?我們設置CrossesAt = 7.3,得到的圖如下:

5.設置網格線
.MajorGridlines屬性指定坐標軸的主要網格線。只有主要坐標軸組中的坐標軸才能有網格線。可以設置網格線的樣式和顏色。
.HasMajorGridlines = True ’Excel圖表默認有網格線,可省略該句
.MajorGridlines.Border.ColorIndex = 20 ’設置網格線顏色
.MajorGridlines.Border.LineStyle = xlDash ’可使用默認線型,省略該句
設置次要網格線用HasMinorGridlines和MinorGridlines,參數跟主要網格線相同。
四、設置圖表的標題區
With ch.Chart
.HasTitle = True
.ChartTitle.Text = ch.Name
.ChartTitle.Font.Size = 18
.ChartTitle.Left = 137
.ChartTitle.Top = 2
End With
HasTitle = True,設置圖表有標題。HasTitle必須為True才能設置標題區的屬性。ChartTitle.Left = 137和ChartTitle.Top = 2是標題框相對於圖表邊框左邊緣和上邊緣的距離,單位為磅。這個比較簡單易懂,不再講解。

五、設置圖表的繪圖區
With ch.Chart
.PlotArea.Width = 347
.PlotArea.Left = 0
.PlotArea.Top = 20
.PlotArea.Height = 181
End With
必須添加了系列和設置了坐標軸之后,才能設置圖表的繪圖區的大小、位置和外觀,否則報錯。可以用PlotArea.Border.LineStyle給繪圖區設置點線邊框。PlotArea.Width和PlotArea.Height指定了繪圖區的寬度和高度,而PlotArea.Left和PlotArea.Top指定繪圖區相對於圖表區邊緣的距離。

六、設置圖表的圖例區
With ch.Chart
.HasLegend = True
.Legend.Font.Size = 8
.Legend.Font.ColorIndex = 5
.Legend.Position = xlLegendPositionRight
End With
可以用Left和Top屬性設置圖例的位置,Height和Width設置圖例區域的大小,也可以用 Legend.Position指定圖例在圖表中的位置,可為如下值之一:
名稱 值 描述
xlLegendPositionBottom -4107 位於圖表下方。
xlLegendPositionCorner 2 位於圖表邊框的右上角。
xlLegendPositionCustom -4161 位於自定義的位置上。
xlLegendPositionLeft -4131 位於圖表的左側。
xlLegendPositionRight -4152 位於圖表的右側。
xlLegendPositionTop -4160 位於圖表的上方。

圖表可以用Export方法以圖形格式導出圖表到文件。語法為:
表達式.Export(Filename, FilterName, Interactive),其中表達式是代表一個Chart對象的變量。Filename為被導出的文件的名稱,后兩個參數可選。可以導出的格式為PNG、GIF等圖片格式,如ch.Chart.Export "g:\test.png",將該圖表保存到G盤,文件名為test.png.圖表可以導出為文件,然后用LoadPicture加載到窗體的圖片控件中,也可以使用ChartSpace直接在窗體上繪制圖表。ChartSpace是微軟Office Web Components(簡稱OWC)中的控件,主要提供 Spreadsheet, Chart, PivotTable等組件。OWC能將部分Office的功能擴展到Web上,是一款優秀的服務器端圖表引擎。使用前需要安裝OWC11,。官方下載地址:https://www.microsoft.com/zh-cn/download/details.aspx?id=22276。安裝好之后,在窗體上添加控件,引用:Microsoft Office Chart 11.0就可以了。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM