union all动态表_Excel VBA——动态显示图表
生活随笔
收集整理的這篇文章主要介紹了
union all动态表_Excel VBA——动态显示图表
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
本文講述將柱形圖和折線圖做成動態圖表的方法。所謂動態是指鼠標點到哪個單元格,就顯示活動單元格所在列或行的圖表,其中折線圖可以讓數據點依次顯示,使得整個圖表不再死板,像變 了一樣!在開始之前,需要先介紹VBA中的一個概念:事件。
事件
VBA中的事件可以理解為一種觸發開關,某些對象有對應的事件開關,一旦對象識別了事件動作,就會自動執行事件過程中的程序。比如,一旦打開某個工作簿,就怎么樣,一旦工作表中單元格被更改,就怎么樣,等等,都是一個事件。要寫關于某個對象的事件過程,就必須打開該對象所在模塊,并打開該模塊的代碼窗口進行程序編寫。只有將事件過程寫在對應的模塊中,程序才能自動觸發。在代碼窗口的 列表框和 ?列表框中選擇相應的對象和事件名稱,完成選擇后,代碼窗口會自動生成事件過程的頭部代碼。當然,熟練后這兩行代碼也可以自己直接編寫,但必須要保證和自動生成的完全一致。圖1? 列表框
圖2?列表框示例數據源
表1 示例數據源動態柱形圖
根據表1的示例數據源創建一個簇狀柱形圖表,在圖表中動態顯示活動單元格所在列的設計方案數據。代碼分享Option?ExplicitPrivate?Sub?Worksheet_SelectionChange(ByVal?Target?As?Range)????????'工作表單元選擇改變觸發的事件過程 Application.ScreenUpdating = False????Application.DisplayAlerts?=?False Dim chtchart As ChartObject Dim rngrange As Range, lngc As Long????Dim?sourange?As?Range????Dim?sngleft?As?Single,?sngtop?As?Single sngleft = Range("G5").Left????sngtop?=?Range("G5").Top??? On Error Resume Next Set rngrange = Application.Intersect(ActiveCell, Range("B1:F5")) '判斷活動單元格與數據區域是否有交集 If Not rngrange Is Nothing Then '如果有交集,執行以下程序 lngc = ActiveCell.Column '提取活動單元格所在列號 Set sourange = Application.Union(Range("A2:A5"), Range(Cells(2, lngc), Cells(5, lngc))) '通過Union合并畫圖區域數據 ChartObjects.Delete '刪除已有圖表 Set chtchart = ChartObjects.Add(sngleft, sngtop, 400, 250) '新建圖表 With chtchart.Chart .SetSourceData Source:=sourange, PlotBy:=xlColumns .ChartType = xlColumnClustered .ApplyDataLabels .HasTitle = True .HasLegend = False .ChartTitle.Text = Cells(1, lngc) With .Axes(xlValue, xlPrimary) .HasTitle = True .AxisTitle.Text = "流量/L·min-1" .AxisTitle.Font.Size = 12 End With End With????End?If Set rngrange = Nothing Set sourange = Nothing????Set?chtchart?=?Nothing Application.ScreenUpdating = True????Application.DisplayAlerts?=?TrueEnd Sub運行效果
圖3?動態柱形圖
動態折線圖
將折線圖上的每個數據點動態顯示出來,可以更加直觀地感受數據的變化趨勢。代碼分享
Option?ExplicitPrivate?Sub?Worksheet_SelectionChange(ByVal?Target?As?Range) Dim chtchart As ChartObject Dim rngrange As Range, lngrow As Long Dim sourange As Range Dim sngleft As Single, sngtop As Single????Dim?i?As?Integer sngleft = Range("G5").Left????sngtop?=?Range("G5").Top???? On Error Resume Next????ChartObjects.Delete Set rngrange = Application.Intersect(ActiveCell, Range("A2:F5")) If Not rngrange Is Nothing Then lngrow = ActiveCell.Row Set chtchart = ChartObjects.Add(sngleft, sngtop, 400, 250) Set sourange = Application.Union(Range("B1:F1"), Range("B" & lngrow, "F" & lngrow)) With chtchart.Chart .SetSourceData Source:=sourange, PlotBy:=xlRows .ChartType = xlLine .ApplyDataLabels .HasTitle = True .HasLegend = False .ChartTitle.Text = Cells(lngrow, 1) With .SeriesCollection(1) .MarkerStyle = xlMarkerStyleCircle .MarkerSize = 8 End With With .Axes(xlValue, xlPrimary) .HasTitle = True .AxisTitle.Text = "流量/L·min-1" .AxisTitle.Font.Size = 12 End With????????End?With For i = 1 To 5 chtchart.Chart.SeriesCollection(1).Values = Range("B" & lngrow).Resize(1, i) delay 0.5????????Next????End?If Set rngrange = Nothing Set sourange = Nothing Set chtchart = NothingEnd Sub'delay過程定義Sub delay(t As Single) Dim t1 As Single t1 = Timer Do DoEvents Loop While Timer - t1 < tEnd?Sub運行效果
圖4?動態折線圖
總結
本文分享了制作動態柱形圖和動態折線圖的方法。盡管看起來貌似高大上,其實只是在作圖程序的基礎上加入了數據區域的判斷和更新,以及增加了一個延時函數來控制數據點依次顯示。總結
以上是生活随笔為你收集整理的union all动态表_Excel VBA——动态显示图表的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Linux 安装宋体字体的简单办法
- 下一篇: Unity3D跨平台动态库编译---记k