实现点击按钮更新折线图:添加当日数据并保留历史数据(VBA需求)
需求描述
我有一份电子表格,按下F9键后每个工作日会生成新的数值数据。需要通过VBA实现以下功能:
- 每次点击命令按钮时,更新图表并添加当日数据,同时保留历史数据
- 示例场景:
- 12月20日首次使用:生成该日对应-1至1区间的折线图数据点
- 12月21日点击按钮:保留12月20日的历史数据点,新增12月21日的数据点并连线
- 12月22日点击按钮:保留前两日数据,继续新增当日数据
当前现有代码只能生成当日图表,需要修改为:将当日数据以日期为X轴变量保存为一个数据点,后续每日点击按钮时,新增对应日期的X轴变量及当日数据点到图表中。
现有VBA代码
Private Sub CommandButton1_Click() Dim i As Integer Dim ws As Worksheet Set ws = Sheets("RV") For Row = 1 To 20 Dim my_cell Dim rng As Range Set rng = Sheets("RV").Range("H14:P15") 'selects daily Realized Vol ratios for FV, TY & US For Each my_cell In rng If my_cell <> "" Then ActiveSheet.Shapes.AddChart.Select ActiveChart.SetSourceData Source:=Range("'RV'!$H$14:$P$15") ActiveChart.ChartType = xlLineMarkers ActiveChart.Location Where:=xlLocationAsNewSheet ActiveSheet.Activate ActiveChart.PlotArea.Select ActiveChart.SeriesCollection(1).XValues = "='RV'!$H$14:$P$14" ActiveChart.SeriesCollection(1).Name = "=""Ratios Progress""" ActiveChart.SeriesCollection.NewSeries ActiveChart.SeriesCollection(2).Name = "=""Progress""" ActiveChart.DisplayBlanksAs = xlInterpolated ActiveSheet.Activate ActiveChart.ChartArea.Select Else Exit For ' Blank cell found, exiting End If Next Next Row End Sub
修改后的VBA代码
Private Sub CommandButton1_Click() Dim wsData As Worksheet Dim wsChart As Worksheet Dim chartObj As ChartObject Dim seriesObj As Series Dim lastDataRow As Long Dim currentDate As Date Dim dailyValue As Variant ' 指定数据所在工作表 Set wsData = ThisWorkbook.Sheets("RV") ' 获取当日日期和对应数据(H15为当日生成的数值,可根据实际单元格调整) currentDate = Date dailyValue = wsData.Range("H15").Value ' 初始化历史数据存储区域(若未创建表头) If wsData.Range("A1").Value <> "日期" Then wsData.Range("A1").Value = "日期" wsData.Range("B1").Value = "当日数据" End If ' 找到历史数据的最后一行 lastDataRow = wsData.Cells(wsData.Rows.Count, "A").End(xlUp).Row ' 检查当日数据是否已录入,避免重复添加 If Not IsError(Application.Match(currentDate, wsData.Range("A:A"), 0)) Then MsgBox "今日数据已添加!", vbInformation Exit Sub End If ' 将当日数据写入历史存储区 wsData.Cells(lastDataRow + 1, "A").Value = currentDate wsData.Cells(lastDataRow + 1, "B").Value = dailyValue ' 检查图表工作表是否存在,不存在则创建 On Error Resume Next Set wsChart = ThisWorkbook.Sheets("数据趋势图") On Error GoTo 0 If wsChart Is Nothing Then ' 创建新工作表存放图表 Set wsChart = ThisWorkbook.Sheets.Add(After:=ThisWorkbook.Sheets(ThisWorkbook.Sheets.Count)) wsChart.Name = "数据趋势图" ' 添加折线图 Set chartObj = wsChart.ChartObjects.Add(Left:=10, Width:=600, Top:=10, Height:=300) chartObj.Chart.ChartType = xlLineMarkers ' 设置图表数据源 Set seriesObj = chartObj.Chart.SeriesCollection.NewSeries seriesObj.Name = "数据趋势" seriesObj.XValues = wsData.Range("A2:A" & lastDataRow + 1) seriesObj.Values = wsData.Range("B2:B" & lastDataRow + 1) Else ' 图表已存在,更新数据源 Set chartObj = wsChart.ChartObjects(1) Set seriesObj = chartObj.Chart.SeriesCollection(1) seriesObj.XValues = wsData.Range("A2:A" & lastDataRow + 1) seriesObj.Values = wsData.Range("B2:B" & lastDataRow + 1) End If ' 配置图表格式(固定Y轴范围为-1到1) With chartObj.Chart .Axes(xlCategory).AxisTitle.Text = "日期" .Axes(xlCategory).HasTitle = True .Axes(xlValue).AxisTitle.Text = "数值" .Axes(xlValue).HasTitle = True .ChartTitle.Text = "每日数据趋势" .Axes(xlValue).MinimumScale = -1 .Axes(xlValue).MaximumScale = 1 End With MsgBox "数据已添加并更新图表!", vbInformation End Sub
关键说明
- 历史数据持久化:在
RV工作表的A、B列建立历史数据存储区,A列存日期,B列存对应数值,避免每次生成新图表丢失历史数据 - 重复录入拦截:通过
Match函数判断当日数据是否已存在,防止重复添加 - 图表复用:首次运行创建专属图表工作表,后续点击按钮直接更新数据源,无需重复创建图表
- Y轴范围固定:将Y轴范围强制设置为-1到1,符合需求中的区间要求
- 灵活适配:若当日数据存放在其他单元格,修改
dailyValue = wsData.Range("H15").Value中的单元格地址即可
内容的提问来源于stack exchange,提问作者IJUT
相关产品推荐
相关产品推荐

